请大佬告诉我这个萌新,线段树怎么搞?
查看原帖
请大佬告诉我这个萌新,线段树怎么搞?
658786
STUDENT00楼主2022/10/20 19:55

硬干暴力,20分。求线段树写法!

#include<bits/stdc++.h>
using namespace std;
int n,m,p[200010],ans[200010];
void update(){
	int a[200010];
	memcpy(a,p,sizeof(a));
	int c=0;
	for(int i=1;i<n;i++){
		for(int j=i+1;j<=n;j++){
			if(a[i]>a[j]) c++;
		}
	}
	ans[0]=c;
	for(int i=n;i>1;i--){
		for(int j=1;j<i;j++){
			if(a[j]>a[j+1]){
				c--;
				swap(a[j],a[j+1]);
			}
		}
		ans[n-i+1]=c;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&p[i]);
	update();
	while(m--){
		int t;
		scanf("%d",&t);
		if(t==1){
			int x;
			scanf("%d",&x);
			swap(p[x],p[x+1]);
			update();
		}else{
			int k;
			scanf("%d",&k);
			if(k<n) printf("%d\n",ans[k]);
			else printf("0\n");
		}
	}
	return 0;
}
2022/10/20 19:55
加载中...