UOJ291 BZOJ4785 ZJOI2017树状数组
题目
23333
代码:
#include<cstdio> #include<cstring> #include<iostream> #define For(i,x,y) for(int i=x;i<=y;++i) using namespace std; const int N = 1e5+5; const int P = 998244353; int pw(int x,int y){int p=1;for(;y;y>>=1,x=(1ll*x*x)%P) if(y&1) p=(1ll*p*x)%P;return p;} int inv(int x){return pw(x,P-2);} int n,q,rt[N*4]; void mul(int&x,int y){x=((1-2ll*y)*x+y)%P;} struct Seg{int ls[N*230],rs[N*230],w[N*230][2],tot;void ins(int&p,int l,int r,int x,int v){if(!p) p=++tot;mul(w[p][0],v);mul(w[p][1],(v+v)%P);if(l==r) return;int m=l+r>>1;if(x<=m) ins(ls[p],l,m,x,v);else ins(rs[p],m+1,r,x,v);}int query(int p,int l,int r,int x,int y,int v){if(!p||x<=l&&r<=y) return w[p][v];int m=l+r>>1; int res=0;if(x<=m) mul(res,query(ls[p],l,m,x,y,v));if(y> m) mul(res,query(rs[p],m+1,r,x,y,v));return res;} }T; void ins(int p,int l,int r,int x,int y,int v){T.ins(rt[p],1,n,y,v);if(l==r) return;int m=l+r>>1;if(x<=m) ins(p<<1,l,m,x,y,v);else ins(p<<1|1,m+1,r,x,y,v); } int query(int p,int l,int r,int xl,int xr,int yl,int yr,int v){if(xl<=l&&r<=xr) return T.query(rt[p],1,n,yl,yr,v);int m=l+r>>1;int res=0;if(xl<=m) mul(res,query(p<<1,l,m,xl,xr,yl,yr,v));if(xr> m) mul(res,query(p<<1|1,m+1,r,xl,xr,yl,yr,v));return res; } bool F; int main(){scanf("%d%d",&n,&q);for(int opt,x,y;q--;){scanf("%d%d%d",&opt,&x,&y);if(opt==1){F^=1;int p=inv(y-x+1);ins(1,0,n,x,y,p);}else{--x;int T=0;mul(T,query(1,0,n,0,x,y,n,1));mul(T,query(1,0,n,0,x,x,y-1,0));mul(T,query(1,0,n,x+1,y,y,n,0));for(;T<0;T+=P);if(x||!F) T=(1-T+P)%P;printf("%d\n",T);}} }
转载于:https://www.cnblogs.com/rwy233/p/6631848.html
UOJ291 BZOJ4785 ZJOI2017树状数组相关推荐
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- [ZJOI2017]树状数组
以后写题前还是要冷静分析清楚再动手啊..... $ Think \ twice,code \ once$ 传送门:here 大致题意: 有一个写挂的树状数组,$ query$的是后缀和,$ query ...
- ●洛谷P3688 [ZJOI2017]树状数组
题链: https://www.luogu.org/problemnew/show/P3688 题解: 二维线段树. 先不看询问时l=1的特殊情况. 对于一个询问(l,r),如果要让错误的程序得到正确 ...
- 洛谷 P5057 [CQOI2006]简单题(树状数组)
嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...
- Color the ball(HDU1556)树状数组
每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
- poj_3067 树状数组
题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...
- hdu 1166 敌兵布阵(树状数组)
题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...
- Equalizing Two Strings 冒泡排序or树状数组
首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...
最新文章
- 快速排序与合并排序的分而治之
- [云炬python3玩转机器学习笔记] 2-5机器学习相关的哲学思考
- 如何实现少样本学习?先让神经网络get√视觉比较能力
- 剑指offer 求1+2+3+...+n
- Sharepoint Designer 2007 Workflow
- JavaOne 2012:掌握Java部署
- github ssl验证跳过
- 三种强大的物体识别算法——SIFT/SURF、haar特征、广义hough变换的特性对比分析
- java string hash变量_java基础(六)-----String性质深入解析
- 计算机三级之嵌入式系统学习笔记4
- Data truncation: Data too long for column错误分析
- Windows Server 2003 来配置网络地址转换 (NAT
- excel表格数字显示不全_Excel表格中输入数字最后几位数变成0的解决方法
- Java实现——求指定年份的父亲节(母亲节)是几月几号
- ccproxy如何设置
- Java计算当前时间,结合时区
- 典型相关性分析(清风建模学习笔记)
- 制作背景透明图标的小工具(附源代码)
- 74LVC2G14GW 封装 SOT363 栅极/逆变器芯片
- 搜索局域网内电脑共享文件的方法