jzoj4417 【HNOI2016模拟4.1】神奇的字符串 (映射,权值线段树)
来源:互联网 发布:使命召唤mac版下载 编辑:程序博客网 时间:2024/06/15 17:07
题意
分析
一开始看到的时候一脸黑人问号
注意到条件
转换一下问题,我们用数据结构统计
因为题目询问是不同的个数,所以
于是我们按照
因为
那
st=j-i (从0开始标号)
f(st)是在模意义下的,所以负数区间也被允许。 同样地,大于n-1的区间也被允许。
这一题的关键之处在于把握
这样我们就把所有任意s[i]需要累加贡献的位置映射到一段区间内,使用动态开点+权值线段树保存修改即可。
Code
#include <iostream>#include <cstdio>#include <bitset>#define N 101000#define SZ 12000000#define f(i) (((i)*a+b)%n)#define tag(x,y) ((x)!=0?lazy[x]+=(y):0)using namespace std;int s[N];int n,a,b,p,m,q;int lc[SZ],rc[SZ],tot,lazy[SZ],root;void down(int x) { if (lazy[x]) tag(lc[x],lazy[x]),tag(rc[x],lazy[x]),lazy[x]=0;}void query(int x,int l,int r,int tg,int &ans) { if (x==0) return; if (l>tg || r<tg) return; if (l==r) { ans=lazy[x]; return; } if (!lc[x]) lc[x]=++tot; if (!rc[x]) rc[x]=++tot; down(x); query(lc[x],l,l+r>>1,tg,ans); query(rc[x],(l+r>>1)+1,r,tg,ans);}void change(int &x,int l,int r,int tl,int tr,int v) { if (tr<l || tl>r) return; if (x==0) x=++tot; if (tl<=l && r<=tr) {tag(x,v); return;} change(lc[x],l,l+r>>1,tl,tr,v); change(rc[x],(l+r>>1)+1,r,tl,tr,v);}void add(int x,int y,int v) { x=(x%n+n)%n,y=(y%n+n)%n; if (x<y) change(root,0,n-1,x,y,v); else { change(root,0,n-1,0,y,v); change(root,0,n-1,x,n-1,v); }}int main() { freopen("3.in","r",stdin); freopen("3.out","w",stdout); cin>>n>>a>>b>>p>>m; scanf("\n"); char cc; for (int i=0; i<m; i++) { scanf("%c",&cc),s[i]=cc-'0'; if (s[i]==1) add(0-a*i,p-1-a*i,1); else add(p-a*i,n-1-a*i,1); } cin>>q;int cnt=0; for (int i=1; i<=q; i++) { scanf("\n"); cc=getchar(); if (cc=='Q') { int st,ans=0; scanf("uery %d",&st); query(1,0,n-1,f(st),ans); printf("%d\n",ans); } else { int t; scanf("hange %d",&t); if (s[t]==0) { add(p-a*t,n-1-a*t,-1); add(0-a*t,p-a*t-1,1); } else { add(p-a*t,n-1-a*t,1); add(0-a*t,p-a*t-1,-1); } s[t]^=1; } }}
阅读全文
0 0
- jzoj4417 【HNOI2016模拟4.1】神奇的字符串 (映射,权值线段树)
- JZOJ4417 【HNOI2016模拟4.1】神奇的字符串 线段树维护信息
- 【HNOI2016模拟4.1】神奇的字符串
- 【JZOJ5270】【GDOI2018模拟】神奇的矩阵(二维线段树)
- 神奇的线段树
- 【BZOJ4540】【Hnoi2016】序列 线段树
- bzoj 4538: [Hnoi2016]网络 树链剖分+线段树
- hdu 1540 神奇的线段树
- 【bzoj3165】[Heoi2013]Segment 神奇的线段树
- smoj2011(神奇的线段树)
- NOIP模拟 排列【权值线段树】
- HNOI2016模拟 disk
- 【HNOI2016模拟3.26】A
- 【HNOI2016模拟4.13】a
- 【HNOI2016模拟4.4】Stage
- 【HNOI2016模拟4.4】Alphadog
- 【HNOI2016模拟4.4】Fenwit
- 【HNOI2016模拟4.14】A
- Linux 文件搜索命令
- Linux 设备文件的创建和mdev
- Oracle 基础1
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
- openCV实现鼠标响应裁剪图像
- jzoj4417 【HNOI2016模拟4.1】神奇的字符串 (映射,权值线段树)
- jquery 选中匹配多个属性值 获取 勾选的checked 的input标签
- Linux 权限管理命令
- QJSON和curl实现客户端
- OSPF协议的LSA
- openssl c++ 3des ecb 加密
- Transaction rolled back because it has been marked as rollback-only
- 奇偶剪枝&1010 Tempter of the Bone
- PHP HTTP客户端-Guzzle原理解析