ABC255Ex
ABC255Ex
*2430
思路较为简单。
调了一下午加一早上,发现是人眼做
题意
给定一片
给出
题解
值域很大,传统的线段树无法维护。动态开点线段树根据实现的好坏,需要不同程度的卡常。
考虑使用 std::set
维护操作过的区间。假设一次操作
注意到对于一个相同的区间
于是在计算答案是可以先计算出不受任何影响的
实现上,使用 std::set
维护保留下的所有区间,按
对相交的情况分类讨论即可。
发现如此维护区间后,std::set
内保留的区间两两不交。共有
代码
const ll maxn=2e5+5,mod=998244353,inv=499122177;
struct node{
ll l,r,d;
friend bool operator < (const node &x,const node &y){
return x.l==y.l?x.r<y.r:x.l<y.l;
}
};
set<node>s;
ll ins(ll l,ll r,ll d){
ll res=((r+l)%mod*((r-l+1)%mod)%mod)*(d%mod)%mod*inv%mod;//计算原始答案
auto it=s.lower_bound((node){l,0,d});
while(it!=s.end()&&it->l<=r){//左端点落在区间内
if(it->r<=r){//完全被区间包含
res=(res+mod-((it->r+it->l)%mod*((it->r-it->l+1)%mod)%mod*(it->d%mod)%mod*inv%mod)%mod)%mod;
s.erase(*it);
}
else{//右端点在区间外
node tmp=*it;
res=(res+mod-((r+it->l)%mod*((r-it->l+1)%mod)%mod*(it->d%mod)%mod*inv%mod)%mod)%mod;
s.erase(*it);
s.insert((node){r+1,tmp.r,tmp.d});
}
it=s.lower_bound((node){l,0,d});
}
if(it!=s.begin()){
it--;
if(it->r>=l){//要求有交
if(it->r<=r){//左端点在区间外
node tmp=*it;
res=(res+mod-((it->r+l)%mod*((it->r-l+1)%mod)%mod*(it->d%mod)%mod*inv%mod)%mod)%mod;
s.erase(*it);
s.insert((node){tmp.l,l-1,tmp.d});
}
else {//区间完全被包含
node tmp=*it;
res=(res+mod-((r+l)%mod*((r-l+1)%mod)%mod*(it->d%mod)%mod*inv%mod)%mod)%mod;
s.erase(*it);
s.insert((node){tmp.l,l-1,tmp.d});
s.insert((node){r+1,tmp.r,tmp.d});
}
}
}
s.insert((node){l,r,d});
return res;
}
ll n,m;
void solve(){
n=R,m=R;
while(m--){
ll d=R,l=R,r=R;
we(ins(l,r,d));
}
return ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现