为什么我的代码这么慢
查看原帖
为什么我的代码这么慢
390770
D2T1xubiaoshi楼主2023/2/7 08:56

1e4的数据本地要十几秒,但复杂度应该就是大常数log

/*
    name: <[ZJOI2007] 报表统计>
    id:   <P1110>
    date: 2023/02/07
*/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 5e5 + 10;
int n, m, a[N], msga = 2147483647;
vector<int> p[N];
multiset<int> mg;
set<int> msg;
char ch[20];

void msgi(int x){
	auto i = lower_bound(msg.begin(), msg.end(), x);
	if(i == msg.end()){
		-- i;
		msga = min(msga, abs((*i) - x));
		msg.insert(x);
	} else if(i == msg.begin()){
		msga = min(msga, abs((*i) - x));
		msg.insert(x);
	} else {
		auto j = i;
		-- i;
		msga = min(msga, min(abs((*i) - x), abs((*j) - x)));
		msg.insert(x);
	}
}

void solve(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++ i){
		scanf("%d", &a[i]);
		if(i == 1){
			msg.insert(a[i]);
		} else {
			msgi(a[i]);
		}
		p[i].push_back(a[i]);
		if(i != 1){
			mg.insert(abs(a[i] - a[i-1]));
		}
	}
	while(m--){
		scanf("%s", ch);
		if(ch[4] == 'R'){
			int x, k;
			scanf("%d%d", &x, &k);
			msgi(k);
			int sz = p[x].size();
			if(x == n){
				mg.insert(abs(p[x][sz-1] - k));
				p[x].push_back(k);
			} else {
				auto i = lower_bound(mg.begin(), mg.end(), abs(p[x][sz-1] - a[x+1]));
				mg.erase(i);
				mg.insert(abs(p[x][sz-1] - k));
				mg.insert(abs(k - a[x+1]));
				p[x].push_back(k);
			}
		} else if(ch[4] == 'G'){
			printf("%d\n", *mg.begin());
		} else {
			printf("%d\n", msga);
		}
	}

}

int main(){
	solve();
	return 0;
}

//qwq
2023/2/7 08:56
加载中...