一道线段树。lazy标记+位运算……(第一次写这个什么lazy标记,抄了一发题解)

我们发现:“或”操作在这里用正合适。
原题请戳这里

// by Sirius_Ren
#include <cstdio>
#include <algorithm>
#define N 100010
using namespace std;
int l,t,o,xx,yy,zz;
char jy;
struct segtree{int left,right,num,lazy;}tree[N*4];
void build(int l,int r,int pos){tree[pos].left=l,tree[pos].right=r,tree[pos].num=2,tree[pos].lazy=false;if(l==r)return;int mid=(l+r)/2;build(l,mid,pos*2),build(mid+1,r,pos*2+1);
}
void push_down(int pos){tree[pos*2].lazy=tree[pos*2+1].lazy=true;tree[pos*2+1].num=tree[pos*2].num=tree[pos].num;tree[pos].lazy=false;
}
void add(int pos){if(tree[pos].left>=xx&&tree[pos].right<=yy){tree[pos].lazy=true;tree[pos].num=(1<<zz);return;}if(tree[pos].lazy)push_down(pos);int mid=(tree[pos].left+tree[pos].right)/2;if(xx<=mid)add(pos*2);if(yy>mid)add(pos*2+1);tree[pos].num=tree[pos*2].num|tree[pos*2+1].num;
}
int query(int pos){if(tree[pos].left>=xx&&tree[pos].right<=yy)return tree[pos].num;if(tree[pos].lazy)push_down(pos);int mid=(tree[pos].left+tree[pos].right)/2;if(xx>mid)return query(pos*2+1);else if(yy<=mid)return query(pos*2);else return query(pos*2+1)|query(pos*2);
}
int split(){int sum=query(1),ans=0;while(sum/=2)if(sum%2)ans++;return ans;
}
int main()
{scanf("%d%d%d",&l,&t,&o);build(1,l,1);for(int i=1;i<=o;i++){scanf("\n%c%d%d",&jy,&xx,&yy);if(xx>yy)swap(xx,yy);if(jy=='C')scanf("%d",&zz),add(1);else printf("%d\n",split());}
}

晚上又写了一遍
很可惜,只刷到了Code Length第三… 省了一步建树。

#include <bitset>
#include <cstdio>
#include <algorithm>
using namespace std;
int L,o,xx=1,yy,zz=1,t[400001];
char jy;
bitset<400001>B;
void pd(int p){t[p*2]=t[p*2+1]=t[p];B[p*2]=B[p*2+1]=true;B[p]=false;}
void add(int l,int r,int p){if(l>=xx&&r<=yy){B[p]=1;t[p]=1<<zz-1;return;}if(B[p])pd(p);int m=(l+r)/2;if(xx<=m)add(l,m,p*2);if(yy>m)add(m+1,r,p*2+1);t[p]=t[p*2]|t[p*2+1];
}
int q(int l,int r,int p){if(xx<=l&&yy>=r)return t[p];if(B[p])pd(p);int m=(l+r)/2;if(m<xx)return q(m+1,r,p*2+1);else if(m>=yy)return q(l,m,p*2);else return q(l,m,p*2)|q(m+1,r,p*2+1);
}
int main(){scanf("%d%d%d",&L,&jy,&o);yy=L,add(1,L,1);while(o--){scanf("\n%c%d%d",&jy,&xx,&yy);if(xx>yy)swap(xx,yy);if(jy=='C')scanf("%d",&zz),add(1,L,1);else{int s=q(1,L,1),a=0;while(s){if(s%2)a++;s/=2;}printf("%d\n",a);}}
}

转载于:https://www.cnblogs.com/SiriusRen/p/6532437.html

POJ 2777 线段树相关推荐

  1. poj 2777(线段树+区间染色)

    解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...

  2. POJ 3468 线段树+lazy标记

    lazy标记   Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u  Submit S ...

  3. POJ 3264 线段树

    题意 传送门 POJ 3264 题解 线段树维护区间的最大值和最小值即可. #include <cstdio> #include <cstring> #include < ...

  4. poj(2325)线段树

    这里介绍另外一种解法,此题可以用线段树,可以用树状数组 其实这题求的都是下面的和左面的,线段树这种数组结构刚好可以满足,为什么呢?这里稍微解释下吧,也有助于以后的复习 看上面这个图,[1,1],[2, ...

  5. poj 3468 线段树

    线段树的 建立build(初始化+左右相等+两个递归+别忘了sum)+更新update(递归出口+更新delta+三向递归+修正当前节点的value)+查找query(如果左右相等+更新delta+三 ...

  6. POJ - 2528 线段树+离散化

    其实很早就在白书上的常用技巧上 看到离散化的操作,但是之前一直没遇到过需要离散化的题目(应该是我太菜的缘故),所以一直也没怎么重视,下面说说这道题目的考点,也就是离散化. 什么是离散化呢?请先自行百度 ...

  7. poj 2352 线段树

    注意到题目中给的y是递增的,那个y没什么用,直接线段树维护一段1,x的区间. #include<string> #include<iostream> #include<c ...

  8. A Simple Problem with Integers POJ - 3468 (线段树)

    思路:线段树,区间更新,区间查找 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #inc ...

  9. poj 2528 线段树离散化+染色

    题目链接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 2645 ...

最新文章

  1. 两种语言实现设计模式(C++和Java)(三:策略模式)
  2. 台式计算机cpu扣不下去,如果台式机的CPU太高怎么办_计算机的基本知识_IT /计算机_信息...
  3. Mybatis的动态创建删除表
  4. 使用VS2013编译Lua5.3.2
  5. ASP.NetCore+VUE 实现学生成绩管理系统(一)
  6. mysql的altertable_mysqlaltertable修改表命令详细介绍
  7. Java-P:面向对象编程
  8. Activiti-master activiti5 在线java web流程设计器画布整合视频教程
  9. python小游戏贪吃蛇源码下载
  10. 重启nginx后丢失nginx.pid的解决方法
  11. Quill – 可以灵活自定义的开源的富文本编辑器
  12. Android调用miui给权限,Android跳转至MIUI权限设置页面
  13. godot正确设置2d像素游戏
  14. 数据可视化基本套路总结
  15. bzoj 1984: 月下“毛景树”
  16. 如何将mp4视频格式转换成flv视频
  17. [Python3]利用tkinter为数独计算器编写GUI
  18. 微型计算机中什么是小随机储存器,随机存取存储器
  19. selenium实现模拟点击QQ一键登录
  20. iPhone上的lrc播放器可以在播放mp3文件时显示歌词

热门文章

  1. qt5使用触屏 偶尔没响应_戴着手套玩手机!你试过吗?触屏灵敏又保暖,冬天再也不冻手~...
  2. 2013年计算机考试ppt,2013年全国专业技术人员计算机应用能力考试PPT题库
  3. 去掉chorme浏览器自动补全时input框的背景样式
  4. 计算机应用基础工作页,计算机应用基础工作页
  5. oracle asm 概念,ORACLE之ASM概念
  6. relative和absolute使用
  7. 因为计算机丢失user32.dll,无法启动程序,说是计算机丢失user32.dll
  8. 改变变压器联接方式可消除某些特定次数的谐波_电工牛人10年经验,总结的4电工常用接线方法41例,电机、变压器、接触器..都有...
  9. mysql结果行数_取得数据库结果集中的行数
  10. 如何在linux查找虚拟机主机号_Linux主机名如何重命名?