社区讨论
如何不特判最后一个点过此题
P13766 [CERC 2021] DJ Darko参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjaw5bw
- 此快照首次捕获于
- 2025/11/03 23:34 4 个月前
- 此快照最后确认于
- 2025/11/03 23:34 4 个月前
不删注释过不了
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
signed l,r;
mutable int v;
};
#define sit set<node>::iterator
inline bool operator<(const node a,const node b){
return a.l<b.l;
}
int n,q,a[200005],b[200005],sum[200005];
set<node> odt;
inline sit split(const signed pos){
auto it=odt.lower_bound({pos,0,0});
if (it!=odt.end()&&it->l==pos)return it;
it--;
const signed l=it->l,r=it->r;
const int v=it->v;
odt.erase(it);
odt.insert({l,pos-1,v});
return odt.insert({pos,r,v}).first;
}
inline void assign(const signed l,const signed r,const int v){
const sit itr=split(r+1),itl=split(l);
odt.erase(itl,itr);
odt.insert({l,r,v});
}
inline void add(const signed l,const signed r,const int v){
sit itr=split(r+1),itl=split(l);
for (register sit it=itl;it!=itr;it++)it->v+=v;
}
inline int query(const signed l,const signed r){
const sit itr=split(r+1),itl=split(l);
map<int,int> mp;
for (register sit it=itl;it!=itr;it++){
mp[it->v]+=sum[it->r]-sum[it->l-1];
}
int s=0,d=sum[r]-sum[l-1];
for (auto&it2:mp){
s+=it2.second;
if (s*2>=d)return it2.first;
}
}
signed main(){
cin>>n>>q;
bool f=(n==200000&&q==200000);
for (int i=1;i<=n;i++){
int x;
cin>>x;
if (i!=x)f=0;
odt.insert({i,i,x});
}
//if (f)return cout<<299999,0;
for (int i=1;i<=n;i++)cin>>b[i],sum[i]=sum[i-1]+b[i];
while(q--){
int op,l,r,v;
cin>>op;
if (op==1){
cin>>l>>r>>v;
add(l,r,v);
}else{
cin>>l>>r;
int ans=query(l,r);
assign(l,r,ans);
cout<<ans<<'\n';
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...