社区讨论
全T是什么鬼啊
P5251[LnOI2019] 第二代图灵机参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjxqbe5w
- 此快照首次捕获于
- 2026/01/03 11:14 2 个月前
- 此快照最后确认于
- 2026/01/03 16:28 2 个月前
rt,要疯了
CPP#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,m,c;
int a[100010],t[400010],t1[400010],t2[400010];
inline void read(int &x){
char ch;
while(ch = getchar(), ch < '!'); x = ch - 48;
while(ch = getchar(), ch > '!') x = (x << 3) + (x << 1) + ch - 48;
}
struct Node{
int l,r;
mutable int c;
bool operator<(const Node &a)const{
return l<a.l;
}
};
set<Node> s;
inline set<Node>::iterator Split(int x){
set<Node>::iterator it=s.lower_bound({x,0,0});
if(it!=s.end()&&it->l==x){
return it;
}
it--;
if(it->r<x) return s.end();
int l=it->l,r=it->r,c=it->c;
s.erase(it);
s.insert({l,x-1,c});
return s.insert({x,r,c}).first;
}
inline int Addign(int l,int r,int c){
set<Node>::iterator rr=Split(r+1),ll=Split(l);
s.erase(ll,rr);
s.insert({l,r,c});
}
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
inline void push_up(int p){t[p]=t[ls(p)]+t[rs(p)];t1[p]=min(t1[ls(p)],t1[rs(p)]);t2[p]=max(t2[ls(p)],t2[rs(p)]);}
inline void build(int p,int l,int r){
if(l==r){
t[p]=a[l];
t1[p]=a[l];
t2[p]=a[l];
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
inline void Updata(int L,int R,int p,int l,int r,int d){
if(L<=l&&r<=R){
t[p]=d;
t1[p]=d;
t2[p]=d;
return;
}
int mid=l+r>>1;
if(L<=mid) Updata(L,R,ls(p),l,mid,d);
if(R>mid) Updata(L,R,rs(p),mid+1,r,d);
push_up(p);
}
inline int Query(int L,int R,int p,int l,int r){
if(L>R) return 0;
if(L<=l&&r<=R){
return t[p];
}
int mid=l+r>>1,s=0;
if(L<=mid) s+=Query(L,R,ls(p),l,mid);
if(R>mid) s+=Query(L,R,rs(p),mid+1,r);
push_up(p);
return s;
}
inline int query(int L,int R,int p,int l,int r){
if(L>R) return 0;
if(L<=l&&r<=R){
return t1[p];
}
int mid=l+r>>1,s=1e9;
if(L<=mid) s=min(s,query(L,R,ls(p),l,mid));
if(R>mid) s=min(s,query(L,R,rs(p),mid+1,r));
push_up(p);
return s;
}
inline int query1(int L,int R,int p,int l,int r){
if(L>R) return 0;
if(L<=l&&r<=R){
return t2[p];
}
int mid=l+r>>1,s=0;
if(L<=mid) s=max(s,query1(L,R,ls(p),l,mid));
if(R>mid) s=max(s,query1(L,R,rs(p),mid+1,r));
push_up(p);
return s;
}
int T[110];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
read(n);read(m);read(c);
for(int i=1;i<=n;i++){
read(a[i]);
}
build(1,1,n);
for(int i=1;i<=n;i++){
int x;
read(x);
s.insert({i,i,x});
}
while(m--){
int op,l,r,x;
read(op);read(l);read(r);
if(op==1){
Updata(l,l,1,1,n,r);
a[l]=r;
}
if(op==2){
read(x);
Addign(l,r,x);
}
if(op==3){
if(c==1){
cout<<query(l,r,1,1,n)<<"\n";
continue;
}
set<Node>::iterator ll=Split(l),rr=Split(r+1);
set<Node>::iterator li=ll,ri;
int cnt=0,f=0,ans=1e9,sum=0;
for(ri=ll;ri!=rr;ri++){
T[ri->c]++;
if(T[ri->c]==1) cnt++;
sum+=Query(ri->l,ri->r,1,1,n);
if(cnt==c){
f=1;
while(cnt==c){
ans=min(ans,sum-Query(li->l,li->r-1,1,1,n)-Query(ri->l+1,ri->r,1,1,n));
T[li->c]--;
if(T[li->c]==0) cnt--;
sum-=Query(li->l,li->r,1,1,n);
li++;
}
}
}
memset(T,0,sizeof(T));
if(f==0) cout<<"-1\n";
else cout<<ans<<"\n";
}
if(op==4){
set<Node>::iterator ll=Split(l),rr=Split(r+1);
set<Node>::iterator li=ll,ri,it;
int cnt=0,ans=query1(l,r,1,1,n),sum=a[li->r];
it=ll;it++;
T[li->c]++;
// cout<<ll->l<<" "<<ll->r<<" "<<li->c<<"\n";
for(ri=it;ri!=rr;ri++){
// cout<<ri->l<<" "<<ri->r<<" "<<ri->c<<"\n";
sum+=a[ri->l];
T[ri->c]++;
if(ri->r!=ri->l){
li=ri;
sum=a[li->r];
memset(T,0,sizeof(T));
T[li->c]++;
}
else if(T[ri->c]>=2){
while(T[ri->c]>=2){
// cout<<li->l<<" "<<li->r<<" "<<li->c<<" "<<a[li->r]<<"\n";
T[li->c]--;
sum-=a[li->r];
li++;
}
}
// cout<<ans<<" "<<sum<<"\n";
ans=max(ans,sum);
}
cout<<ans<<"\n";
memset(T,0,sizeof(T));
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...