社区讨论

我也全RE啊qwq....

P1110[ZJOI2007] 报表统计参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6ohudr
此快照首次捕获于
2025/11/20 08:13
4 个月前
此快照最后确认于
2025/11/20 08:13
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 1000005
using namespace std;
int n,m,minn=inf,sz,root;
int f[maxn],ch[maxn][2],size[maxn],val[maxn],cnt[maxn],a[maxn];
int What[maxn][2],last;
multiset<int> st;
multiset<int>::iterator it;
void update(int x){
	if(!x) return;
	size[x]=cnt[x];
	if(ch[x][0]) size[x]+=size[ch[x][0]];
	if(ch[x][1]) size[x]+=size[ch[x][1]];
}
inline int get(int x){
	return ch[f[x]][1]==x;
}
void rotate(int x)
{
	int old=f[x],oldf=f[old],which=get(x);
	ch[old][which]=ch[x][which^1];
	f[ch[x][which^1]]=old;
	ch[x][which^1]=old;
	f[x]=oldf;f[old]=x;
	if(oldf) ch[oldf][ch[oldf][1]==old]=x;
	update(old),update(x);
}

void splay(int x,int tar){
	for(int fa;(fa=f[x])!=tar;rotate(x))
		if(f[fa]!=tar) rotate((get(x)==get(fa))?fa:x);
	if(!tar) root=x;
}


void insert(int x){
	if(root==0){
		sz++;root=sz;cnt[sz]=size[sz]=1;val[sz]=x;
		return;
	}
	int now=root,fa=0;
	while(1){
		if(val[now]==x){
			cnt[now]++;update(now);update(fa);splay(now,0);return;
		}
		fa=now;now=ch[now][val[now]<x];
		if(!now){
			sz++;size[sz]=cnt[sz]=1;f[sz]=fa;
			ch[fa][val[fa]<x]=sz;val[sz]=x;
			update(fa);splay(sz,0);
			return;
		}
	}
}
int pre(){
	int now=ch[root][0];
	while(ch[now][1]) now=ch[now][1];
	return val[now];
}
int nex(){
	int now=ch[root][1];
	while(ch[now][0]) now=ch[now][0];
	return val[now];
}
void orz(int x)
{
	it=find(st.begin(),st.end(),x);
	if(it!=st.end()) st.erase(it);
}
void Work(){
	char z[20];memset(z,0,sizeof(z));scanf("%s",z);
	if(z[4]=='R'){
		int qwq,k;scanf("%d%d",&qwq,&k);
		if(qwq==n){
			st.insert(abs(k-last));
			last=k;
		} else{
			qwq++;
			int c=What[qwq][0];
			int cc=abs(a[qwq]-c);
			orz(cc);
			int ccc=abs(a[qwq]-k);
			int cccc=abs(What[qwq][0]-k);
			st.insert(ccc);st.insert(cccc);
			What[k][0]=What[qwq][0];
			What[qwq][0]=k;
		}
		insert(k);
		if(ch[root][0]) minn=min(minn,abs(k-pre()));
		if(ch[root][1]) minn=min(minn,abs(k-nex()));
	}
	if(z[4]=='G') printf("%d\n",*st.begin());
	if(z[4]=='S') printf("%d\n",minn);
//	for(it=st.begin();it!=st.end();it++) cout<<*it<<" ";cout<<" st"<<endl;
}

void sc(){
	scanf("%d%d",&n,&m);
	memset(What,-1,sizeof(What));
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=2;i<=n;i++) st.insert(abs(a[i]-a[i-1]));
//	for(it=st.begin();it!=st.end();it++) cout<<*it<<" ";cout<<" st"<<endl;
	last=a[n];
	for(int i=1;i<=n;i++){
		if(i!=1) What[i][0]=a[i-1];
		if(i!=n) What[i][1]=a[i+1];
		insert(a[i]);
		if(ch[root][0]) minn=min(minn,abs(a[i]-pre()));
		if(ch[root][1]) minn=min(minn,abs(a[i]-nex()));
	}
}

int main()
{
	sc();
	while(m--) Work();
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...