社区讨论

代码求调

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 条回复,欢迎继续交流。

正在加载回复...