社区讨论
代码求调
P6544 [CEOI2014] Cake参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo13qrr1
- 此快照首次捕获于
- 2023/10/22 14:42 2 年前
- 此快照最后确认于
- 2023/11/02 14:14 2 年前
CPP
#include <bits/stdc++.h>
#define up(rt) sum[rt]=max(sum[ls[rt]],sum[rs[rt]])
using namespace std;
const int N=250003;
int sum[N<<2],p,ls[N<<2],rs[N<<2],rk[15],ppp,MX,n,crt=2,_,d[N],pos,w;
void build(int rt,int l,int r){
if(l==r){sum[rt]=d[l];return;}
int mid=(l+r)>>1;
build(ls[rt]=++crt,l,mid);build(rs[rt]=++crt,mid+1,r);
up(rt);
}
void change(int rt,int l,int r,int k,int v){
if(l==r){sum[rt]=v;return;}
int mid=(l+r)>>1;
if(k<=mid) change(ls[rt],l,mid,k,v);
else change(rs[rt],mid+1,r,k,v);
up(rt);
}
int query(int rt,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return sum[rt];
int mid=(l+r)>>1,cnt=0;
if(ql<=mid) cnt=query(ls[rt],l,mid,ql,qr);
if(mid<qr) cnt=max(cnt,query(rs[rt],mid+1,r,ql,qr));
return cnt;
}
int query_l(int rt,int l,int r,int v){
int L=ls[rt],R=rs[rt],mid=(l+r)>>1;
if(l==r) return l;
if(sum[R]>v) return query_l(R,mid+1,r,v);
return query_l(L,l,mid,v);
}
int query_r(int rt,int l,int r,int v){
int L=ls[rt],R=rs[rt],mid=(l+r)>>1;
if(l==r) return l;
if(sum[L]>v) return query_r(L,l,mid,v);
return query_r(R,mid+1,r,v);
}
int solve(){
if(p==pos) return 0;
if(p<pos){
int mx=query(1,1,pos-1,p,pos-1);
if(mx>sum[2]) return n-p;
return query_r(2,pos+1,n,mx)-1-p;
}
int mx=query(2,pos+1,n,pos+1,p);
if(mx>sum[1]) return p-1;
return p-1-query_l(1,1,pos-1,mx);
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>pos;MX=n;
for(int i=1;i<=n;i++){
cin>>d[i];
if(n+1-d[i]<=10) rk[n+1-d[i]]=i;
}
if(pos>1) build(1,1,pos-1);
if(pos<n) build(2,pos+1,n);
cin>>_;
char op;
while(_--){
cin>>op>>p;
if(op=='E'){
// if(p==pos) continue;
cin>>w;
for(int i=10;i>w;i--) rk[i]=rk[i-1];
rk[w]=p;
for(int i=10;i>0;i--){
if(rk[i]<pos) change(1,1,pos-1,rk[i],++MX);
if(pos<rk[i]) change(2,pos+1,n,rk[i],++MX);
}
}
else cout<<solve()<<"\n";
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...