求助 7个WA 3个TLE
查看原帖
求助 7个WA 3个TLE
512682
Heaven_and_Hell楼主2022/10/19 18:39
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 500010
ll a[N],d[N],tot,ans[N];
int id[N],c[N],b[N],n,m;
void add(int x,int v){
	for(;x<=n;x+=x&(-x)) c[x]+=v;
}
void add2(int x,ll v){
	for(;x<=n;x+=x&(-x)) ans[x]+=v;
}
int qu(int x){
	int ret=0;
	for(;x;x-=x&(-x)) ret+=c[x];
	return ret;
}
ll qu2(int x){
	ll ret=0;
	for(;x;x-=x&(-x)) ret+=ans[x];
	return ret;
}
int main(){
	//freopen("a.txt","r",stdin);
	//freopen("b.txt","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		id[a[i]]=i;
		if(i>1) add(i,1);
	}
	for(int i=1;i<=n;i++){//求逆序对
		b[i]=qu(id[i]); 
		tot+=(ll)(b[i]);
		d[1]++;d[b[i]+1]--;//差分 
		add(id[i],-1);
	}
	add2(1,tot);
	for(int i=1;i<n;i++){
		d[i]+=d[i-1];
		add2(i+1,-d[i]);
	}
	for(int i=1;i<=m;i++){
		int opt,x;
		cin>>opt>>x;
		if(opt==1){
			if(a[x]>a[x+1]) {
			    swap(a[x],a[x+1]);
		    	swap(b[x],b[x+1]);
				b[x]--;
				add2(1,-1ll);
				add2(b[x]+2,1ll);
			}
			else{
			    add2(1,1ll);
				add2(b[x]+2,-1ll);
				b[x]++;
				swap(a[x],a[x+1]);
		    	swap(b[x],b[x+1]);
			}
		}
		else cout<<qu2(min(x,n-1)+1)<<'\n';
	}
}
2022/10/19 18:39
加载中...