csp-j2 40pts求助(有注释
查看原帖
csp-j2 40pts求助(有注释
320697
AMIRIOX無暝楼主2021/11/22 23:12

https://www.luogu.com.cn/record/63395673

思路:aia_i 排名就是数组中比 aia_i 小的数个数 ++ 数组中等于 aia_i 且原位置排在 aia_i 前面的数的个数

感觉没有问题 但一直调一直不对(

有没有大佬能指出忽略哪里了啊/kel


#include <iostream>
#include <cstdio>
using namespace std;
int a[10000];
int n, Q;
int tag[10000];
void init() {
	// 初始化tag数组:储存每个 比 a[i] 小的数个数 + 数组中等于 a[i] 且原位置排在 a[i] 前面的数的个数
	for(int i=1;i<=n;i++) {
		int cnt=0;
		for(int j=1;j<=n;j++)
			if(a[j]<a[i] || (a[j]==a[i] && j<i)) cnt++;
		tag[i]=cnt;
	}
}
void inup(int xp /*更新的位置(下标)*/, int ori/*更新的位置原来的值*/) {
	//对于每次更新,动态调整tag数组
	int cnt = 0;
	for(int i=1;i<=n;i++) {
		if(a[xp]>a[i] || (a[i]==a[xp] && i<xp)) cnt++;
	}//先扫一遍,统计和更新更新的位置的现在排名
	tag[xp]=cnt;
	for(int i=1; i<=n; i++) {
		if(i==xp) continue; // xp排名已经更新过了
		if(a[xp]-ori>0) { // 如果更新的比原来大(数字变大了)
			if((a[i]>ori && a[i]<a[xp]) || (a[i]==a[xp] && xp>i)) tag[i]--; 
            // 原来比a[xp]小的数字还是比他小不用管,只需要更新原来比他大 更新后比他小的数字;或者 更新后等于他且在他前面的数字 
			else if(a[i]==ori && xp<i) tag[i]--;
            如果原来就等于更新位置的原数字,则这个值也要更新
		}else if(a[xp]-ori<0) {
        //同上 不过是更新后减小的情况
			if((a[i]<ori && a[i]>a[xp]) || (a[i]==a[xp] && xp>i)) tag[i]++;
			else if(a[i]==ori && xp<i) tag[i]++;
		}
	}
}
int main() {
	scanf("%d %d", &n, &Q);
	for(int i=1;i<=n;i++) scanf("%d", &a[i]);
	init();
	while(Q--) {
		int cmd, x, v;
		scanf("%d", &cmd);
		if(cmd==1) {
			scanf("%d %d", &x, &v);
			int ori=a[x];
			a[x]=v;
			inup(x, ori);
		}else {
			scanf("%d", &x);	
			printf("%d\n", tag[x]+1);
            //统计的是在他前面有多少个数字,排名要+1 
		}	
	}
	return 0;
}


2021/11/22 23:12
加载中...