社区讨论

如何不特判最后一个点过此题

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

正在加载回复...