题目链接
树状数组求逆序对
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
typedef pair<int,int>PII;
typedef priority_queue<int> upq;
typedef priority_queue<int,vector<int>,greater<int>> dpq;
const int M=998244353;
const int N=5e5+20;ll tr[N];
int n;
void add(int x,int c)
{for(int i=x;i<=n;i+=i&-i){tr[i]+=c;}
}ll query(int x)
{ll res=0;for(int i=x;i>0;i-=i&-i) res+=tr[i];return res;
}
bool cmp(int a,int b)
{return a>b;
}void solved()
{cin>>n;vector<ll>a(n+1),b(n+1);ll ans=0;for(int i=1;i<=n;i++) {cin>>a[i];ans+=query(n)-query(a[i]); add(a[i],1);}for(int i=1;i<=n;i++) tr[i]=0;for(int i=1;i<=n;i++) {cin>>b[i];ans+=query(n)-query(b[i]);add(b[i],1);}for(int i=1;i<=n;i++) tr[i]=0;if(ans&1) cout<<'A'; //总逆序数是奇数A赢 else cout<<'B'; //总逆序数是偶数B赢 /*接下来考虑左移区间的影响*//*一次修改只需要观察d*(r-l)的奇偶性即可得知答案奇偶性的变化*/ for(int i=1;i<=n-1;i++){char c; int l,r,d; cin>>c>>l>>r>>d;ans+=1ll*(r-l)*d;ans&=1;if(ans) cout<<'A';else cout<<'B';} cout<<'\n';}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t; cin>>t;while(t--)solved();
}