社区讨论
我也全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 条回复,欢迎继续交流。
正在加载回复...