题解 P4041 [AHOI2014/JSOI2014] 奇怪的计算器
1.题解 P3204 [HNOI2010] 公交线路2.题解 P1081 [NOIP2012 提高组] 开车旅行3.题解 P1477 [NOI2008] 假面舞会4.题解 P5234 [JSOI2012] 越狱老虎桥5.题解 P6544 [CEOI2014] Cake
6.题解 P4041 [AHOI2014/JSOI2014] 奇怪的计算器
7.题解 P4798 [CEOI2015 Day1] 卡尔文球锦标赛8.题解 P4799 [CEOI2015 Day2] 世界冰球锦标赛9.题解 P1295 [TJOI2011] 书架10.题解 P6281 [USACO20OPEN] Social Distancing S11.题解 P1190 [NOIP2010 普及组] 接水问题12.题解 P3976 [TJOI2015] 旅游13.题解 P8096 [USACO22JAN] Drought G14.题解P7302 [BZOJ2131][NOI1998] 免费的馅饼15.题解 [BZOJ3307] P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并16.题解 [BZOJ3339] P4137 Rmq Problem / mex17.题解 [SP179][BZOJ2919][Poi1998]Word equations18.题解 P5930 [POI1999] 降水19.题解 BZOJ2720: [Violet 5]列队春游20.题解P3830 [SHOI2012]随机树21.题解 P4755 Beautiful Pair22.题解 P9229 扩展九连环23.题解 P7165 [COCI2020-2021#1] Papričice24.题解 P7169 [eJOI2020 Day1] Exam25.题解「JOI 2014 Final」IOI 馒头26.题解 P9911 [COCI 2023/2024 #2] Kuglice27.题解 P6356 [COCI2007-2008#3] CUDAK28.题解 P7309 [COCI2018-2019#2] Kocka29.题解 P6548 [COCI2010-2011#2] IGRA30.题解 P6491 [COCI2010-2011#6] ABECEDA洛谷。
题意
有
:结果加上 ; :结果减去 ; ;结果乘上 ; :结果加上 ( 是一开始输入的数)。 将每个询问放在 个操作中过一遍,同时每次处理完后,倘若小于 ,赋值为 ;倘若大于 ,赋值为 。
暴力
按照题意模拟即可。
分析
我们可以发现,我们所有数的经历的过程是一样的,我们可以用线段树来维护我们的 6 中操作:
- 区间加;
- 区间减(同 1);
- 区间乘;
- 区间加的变种;
- 区间取至最大值;
- 区间取至最小值。
这么算来,我们似乎是要维护 5 种 tag,10 种值。
想想都让人头皮发麻,怎么都应该是黑题才对。
但是实际上,我们的其中操作其实并不会改变期间相邻数的大小关系,因此,我们的 5、6 操作就变成了区间覆盖与一个二分(找到最后一个小于
总结一下,我们需要维护区间乘、区间加、区间加变形、区间覆盖、单点查询。
看起来还是非常复杂,但是我们用
最后的区间加变种,地位与区间加等同,与区间加的维护大致相同。
struct SEG { #define ls p<<1 #define rs p<<1|1 int c[N<<2],tag[N<<2],tag2[N<<2],tag3[N<<2]; inline void cl(int p,int x,int y,int L,int R) { tag3[p]*=x; tag2[p]=tag2[p]*x+y; tag[p]=tag[p]*x; } inline void cl(int p,int x) { tag3[p]+=x; } inline void pushdown(int p,int L,int R) { int mid=L+R>>1; cl(ls,tag[p],tag2[p],L,mid),cl(rs,tag[p],tag2[p],mid+1,R); cl(ls,tag3[p]),cl(rs,tag3[p]); tag[p]=1,tag2[p]=tag3[p]=0; } inline void build(int p,int L,int R) { tag[p]=1,tag2[p]=tag3[p]=0; if(L==R) { c[p]=qu[L].x; return ; } int mid=L+R>>1; build(ls,L,mid),build(rs,mid+1,R); } inline void change(int p,int L,int R,int l,int r,int x,int y) { if(l>r) return ; if(l<=L&&R<=r) { cl(p,x,y,L,R); return ; } int mid=L+R>>1; pushdown(p,L,R); if(l<=mid) change(ls,L,mid,l,r,x,y); if(mid<r) change(rs,mid+1,R,l,r,x,y); } inline void change(int p,int L,int R,int l,int r,int x) { if(l>r) return ; if(l<=L&&R<=r) { cl(p,x); return ; } int mid=L+R>>1; pushdown(p,L,R); if(l<=mid) change(ls,L,mid,l,r,x); if(mid<r) change(rs,mid+1,R,l,r,x); } inline int query(int p,int L,int R,int x) { if(L==R) return c[p]*tag[p]+tag2[p]+tag3[p]*c[p]; pushdown(p,L,R); int mid=L+R>>1; if(x<=mid) return query(ls,L,mid,x); if(mid<x) return query(rs,mid+1,R,x); } #undef ls #undef rs } tree; inline void solvel() { int l=1,r=m,res=0; while(l<=r) { int mid=l+r>>1; int x=tree.query(1,1,m,mid); if(x<L) { res=mid; l=mid+1; } else r=mid-1; } tree.change(1,1,m,1,res,0,L); } inline void solver() { int l=1,r=m,res=m+1; while(l<=r) { int mid=l+r>>1; int x=tree.query(1,1,m,mid); if(x>R) { res=mid; r=mid-1; } else l=mid+1; } tree.change(1,1,m,res,m,0,R); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?