链接:

https://www.luogu.org/problemnew/show/U47231

思路:

这道题其实就是一道双Lazy线段树裸题

因为我们知道,当k一定时,取反偶数次最后k位等于不取反

同理,当k一定时,翻转偶数次最后k位等于不取反

我们使用双Lazy分别存下这两个东西

同时一直对2取模

同时我们使用标记永久化

向下传参Lazy

单点查询到这个点时,判断是否需要取反即可

取反和翻转是位运算基本知识

大家可以看代码

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rij register int j
#define rii register int i
#define rs 65536
using namespace std;
struct tree{
int fz,qf,val;
}x[];
int n,k,q,t,bs[];
void ycl()
{
bs[]=;
for(rii=;i<=;i++)
{
bs[i]=bs[i-]*;
}
}
void cf(int val)
{
unsigned int kkk=val;
while(kkk!=)
{
cout<<kkk%<<" ";
kkk/=;
}
cout<<endl;
}
int qf(int val)
{
int bs=(<<k);
int ltt=val%bs;
val-=ltt;
ltt=-ltt;
ltt--;
unsigned kkk=ltt;
kkk%=bs;
return val+kkk;
}
int fz(int val)
{
int bis=(<<k);
int ltt=val%bis;
int v=;
val-=ltt;
for(rii=;i<=k;i++)
{
v+=(ltt%)*bs[k-i];
ltt/=;
}
return val+v;
}
void add(int wz,int nl,int nr,int val,int bh)
{
if(wz==nl&&wz==nr)
{
x[bh].val=val;
return;
}
int mid=(nl+nr)/;
if(wz<=mid)
{
add(wz,nl,mid,val,bh*);
}
else
{
add(wz,mid+,nr,val,bh*+);
}
}
void change1(int l,int r,int nl,int nr,int bh)
{
if(l<nl)
{
l=nl;
}
if(r>nr)
{
r=nr;
}
if(l==nl&&r==nr)
{
x[bh].qf++;
x[bh].qf%=;
return;
}
int mid=(nl+nr)/;
if(l<=mid)
{
change1(l,r,nl,mid,bh*);
}
if(r>mid)
{
change1(l,r,mid+,nr,bh*+);
}
}
void change2(int l,int r,int nl,int nr,int bh)
{
if(l<nl)
{
l=nl;
}
if(r>nr)
{
r=nr;
}
if(l==nl&&r==nr)
{
x[bh].fz++;
x[bh].fz%=;
return;
}
int mid=(nl+nr)/;
if(l<=mid)
{
change2(l,r,nl,mid,bh*);
}
if(r>mid)
{
change2(l,r,mid+,nr,bh*+);
}
}
int query(int wz,int nl,int nr,int bh,int lazy1,int lazy2)
{
lazy1%=;
lazy2%=;
if(wz==nl&&wz==nr)
{
lazy1+=x[bh].qf;
lazy2+=x[bh].fz;
int ltt=x[bh].val;
if(lazy1==)
{
ltt=qf(ltt);
}
if(lazy2==)
{
ltt=fz(ltt);
}
return ltt;
}
int mid=(nl+nr)/;
if(wz<=mid)
{
return query(wz,nl,mid,bh*,lazy1+x[bh].qf,lazy2+x[bh].fz);
}
else
{
return query(wz,mid+,nr,bh*+,lazy1+x[bh].qf,lazy2+x[bh].fz);
}
}
void pd(int wz,int l,int r)
{
if(l==r)
{
if(x[wz].fz!=)
{
x[wz].fz=;
x[wz].val=fz(x[wz].val);
}
if(x[wz].qf!=)
{
x[wz].qf=;
x[wz].val=qf(x[wz].val);
}
return;
}
if(x[wz].fz!=)
{
x[wz*].fz++;
x[wz*].fz%=;
x[wz*+].fz++;
x[wz*+].fz%=;
}
if(x[wz].qf!=)
{
x[wz*].qf++;
x[wz*].qf%=;
x[wz*+].qf++;
x[wz*+].qf%=;
}
x[wz].qf=;
x[wz].fz=;
int mid=(l+r)/;
pd(wz*,l,mid);
pd(wz*+,mid+,r);
}
int main()
{
// freopen("XiaoX10.in","r",stdin);
// freopen("XiaoX10.out","w",stdout);
ycl();
scanf("%d%d",&n,&t);
for(rii=;i<=n;i++)
{
int val;
scanf("%d",&val);
add(i,,rs,val,);
}
for(rii=;i<=t;i++)
{
if(i!=)
{
pd(,,rs);
}
scanf("%d%d",&q,&k);
int pid,l,r,wz;
for(rij=;j<=q;j++)
{
scanf("%d",&pid);
if(pid==)
{
scanf("%d%d",&l,&r);
change1(l,r,,rs,);
}
if(pid==)
{
scanf("%d%d",&l,&r);
change2(l,r,,rs,);
}
if(pid==)
{
scanf("%d",&wz);
int ltt=query(wz,,rs,,,);
printf("%d\n",ltt);
}
}
}
k=;
}

最新文章

  1. OD使用教程8
  2. BZOJ4435——[Cerc2015]Juice Junctions
  3. Openvas 使用
  4. 第十课:CSS选择器的介绍和区分
  5. 161103、Spring Boot 入门
  6. Apache,PHP,MySQL,PMA手动配置的注意事项
  7. php匿名函数小示例
  8. algorithm@ find the shortest path in a graph using BFS
  9. 机械革命 x7ti-s 1周年使用报告
  10. HTTP之状态码
  11. mongo学习笔记---1
  12. NAT资料
  13. 课程三(Structuring Machine Learning Projects),第一周(ML strategy(1)) —— 0.Learning Goals
  14. WDA基础十四:ALV字段属性配置表
  15. 个人犯的一个golang routine错误
  16. CSS中如何选择ul下li的奇数、偶数行
  17. 关于RAID_1+0和RAID_0+1的比较
  18. POJ服务器不能启动问题
  19. 2018-2019-20172321 《Java软件结构与数据结构》第八周学习总结
  20. POJ 1160 Post Office(区间DP)

热门文章

  1. 基于Vue的WebApp项目开发(五)
  2. 六、angular 生成二维码
  3. CentOS7 安装 JIRA 7.2.x 教程:下载、安装、汉化、破解
  4. C# 日期和时间的字符串表示形式转换为其等效的DateTime(stringToDateTime)
  5. winform打包发布安装包详解..
  6. Python实例---游戏人生[类的学习]
  7. xss challenges平台学习
  8. java.lang.UnsatisfiedLinkError: /usr/openv/java/jre/lib/amd64/libawt_xawt.so: libXtst.so.6: cannot open shared object file: No such file or directory
  9. Linux提权后获取敏感信息的方法与途径
  10. zeromq 笔记