社区讨论
70pts,求条
P14152千手百眼,天下人间参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj33gry
- 此快照首次捕获于
- 2025/11/03 19:56 4 个月前
- 此快照最后确认于
- 2025/11/03 19:56 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
const int INF=1e18;
struct E{
int op,id,t,l,r,k;
};
int n,m;
int a[N];
E e[N];
int ans[N],cnt;
int f[N],fa[N];
bool v[N];
struct T{
int v,lz;
}tr[N*4];
void bd(int x,int l,int r){
tr[x].lz=0;
if(l==r){
tr[x].v=a[l];
return;
}
int m=(l+r)/2;
bd(x*2,l,m);
bd(x*2+1,m+1,r);
tr[x].v=max(tr[x*2].v,tr[x*2+1].v);
}
void pd(int x){
if(tr[x].lz){
tr[x*2].v+=tr[x].lz;
tr[x*2].lz+=tr[x].lz;
tr[x*2+1].v+=tr[x].lz;
tr[x*2+1].lz+=tr[x].lz;
tr[x].lz=0;
}
}
void up(int x,int l,int r,int ql,int qr,int k){
if(ql<=l&&r<=qr){
tr[x].v+=k;
tr[x].lz+=k;
return;
}
pd(x);
int m=(l+r)/2;
if(ql<=m) up(x*2,l,m,ql,qr,k);
if(qr>m) up(x*2+1,m+1,r,ql,qr,k);
tr[x].v=max(tr[x*2].v,tr[x*2+1].v);
}
int qy(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tr[x].v;
pd(x);
int m=(l+r)/2,res=-INF;
if(ql<=m) res=max(res,qy(x*2,l,m,ql,qr));
if(qr>m) res=max(res,qy(x*2+1,m+1,r,ql,qr));
return res;
}
int fd(int x){
return fa[x]==x?x:fa[x]=fd(fa[x]);
}
vector<int> ts;
int get(int t){
return lower_bound(ts.begin(),ts.end(),t)-ts.begin();
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=0;i<m;i++){
cin>>e[i].op;
if(e[i].op==1){
cin>>e[i].t>>e[i].l>>e[i].r>>e[i].k;
}else{
cin>>e[i].t>>e[i].l>>e[i].r;
e[i].k=0;
}
e[i].id=i;
v[i]=1;
ts.push_back(e[i].t);
}
sort(ts.begin(),ts.end());
ts.erase(unique(ts.begin(),ts.end()),ts.end());
int sz=ts.size();
for(int i=0;i<=sz;i++) fa[i]=i;
vector<int> d(sz+2,0);
for(int i=m-1;i>=0;i--){
if(e[i].op==3){
int L=e[i].l,R=e[i].r;
int l=get(L),r=upper_bound(ts.begin(),ts.end(),R)-ts.begin()-1;
if(l<=r){
d[l]++;
d[r+1]--;
}
}
}
vector<bool> flag(sz,true);
int sum=0;
for(int i=0;i<sz;i++){
sum+=d[i];
if(sum>0) flag[i]=false;
}
bd(1,1,n);
vector<pair<int,int> > a2;
for(int i=0;i<m;i++){
int tid=get(e[i].t);
if(flag[tid]&&e[i].op!=3){
a2.push_back({e[i].t,e[i].id});
}
}
sort(a2.begin(),a2.end(),[&](pair<int,int> a,pair<int,int> b){
if(a.first!=b.first) return a.first<b.first;
return a.second<b.second;
});
for(auto p:a2){
int i=p.second;
if(e[i].op==1){
up(1,1,n,e[i].l,e[i].r,e[i].k);
}else if(e[i].op==2){
ans[cnt++]=qy(1,1,n,e[i].l,e[i].r);
}
}
cout<<cnt<<"\n";
for(int i=0;i<cnt;i++) cout<<ans[i]<<"\n";
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...