样例对了但只有8分
查看原帖
样例对了但只有8分
220824
yyz1005楼主2021/11/14 15:50
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
	int val;//值
	int pla;//位置
	int ser;//比这个数小的数的个数
	int gx[8010];//这个数和没一个数的关系
  //1    这个数大
  //0    一样
  //-1   这个数小
};
int n,q;
Node a[8010];
void build(){
	int cnt;
	for(int i = 1; i <= n; i++){
		cnt = 0;
		for(int j = 1; j <= n; j++){
			if(i==j) a[i].gx[j] = 0;
			else if(a[i].val<a[j].val||(a[i].val==a[j].val&&i<j)) a[i].gx[j] = -1;
			else {
				cnt++;
				a[i].gx[j] = 1;
			}
		}
		a[i].ser = cnt;
	}
}
void rev(int x,int v){
	int lose = a[x].val;
	a[x].val = v;
	int cnt = 0;
	for(int i = 1; i <= n; i++){
		if(x==i) continue;
		if(a[x].val<a[i].val||(a[x].val==a[i].val&&x<i)){
			a[x].gx[i] = -1;
			//a[x]<a[i]
			if(a[i].gx[x] != 1){
				a[i].ser++;
				a[i].gx[x] = 1;
			}
		} else {
			a[x].gx[i] = -1;
			//a[x]>a[i]
			cnt++;
			if(a[i].gx[x]!=-1){
				a[i].ser--;
				a[i].gx[x] = -1;
			}
		}
	}
	a[x].gx[x] = 0;
	a[x].ser = cnt;
}
int main(){
	int op,x,y;
	scanf("%d%d",&n,&q);
	for(int i = 1; i <= n; i++){
		scanf("%d",&a[i].val);
		a[i].pla = i;
	}
	build();
	for(int i = 1; i <= q; i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d",&x,&y);
			rev(x,y);
		} else {
			scanf("%d",&x);
			printf("%d\n",a[x].ser+1);
		}
	}
	return 0;
}
2021/11/14 15:50
加载中...