Twinkling lights III

Time Limit: 8000ms
Memory Limit: 131072KB

This problem will be judged on FZU. Original ID: 1968
64-bit integer IO format: %I64d      Java class name: Main

Twinkling lights一直以来都很好玩的游戏。或许你还记得FZU1069 Twinkling lights 和FZU1420 Twinkling lights II。现在,Bluewind改变了一下游戏规则,游戏将变得更好玩。

N盏灯排成一行,编号1..N,起初的时候,所有的灯是开着的。Bluewind将执行M个操作,操作分成五种:

C x y,把编号从x到y的灯都关掉,原来关着的灯保持不变。

S x y,把编号从x到y的灯都开起来,原来开着的灯依旧开着。

A x y,让编号从x到y的灯都改变状态,即把原来开的灯关了,原来关了的灯开起来。

Q x y,查询编号从x到y中开着的灯的个数。

L x y,查询编号从x到y中最长连续开着的灯的个数。

Input

第一行两个整数N,M(1<=N,M<=500,000)表示有N盏灯,M个操作。

接下来M行,每行按指定格式给出一个操作,其中(1<=x<=y<=N)。

Output

对于每条Q查询操作和L查询操作,输出相应的结果。

Sample Input

10 5
C 2 8
S 5 7
A 1 10
Q 1 10
L 1 10

Sample Output

4
3

Source

Contest for 2010 lecture II
解题:线段树。。。那题HDU 3397 Sequence operation很像嘛

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int maxn = 500010;
 5 struct node {
 6     int lt,rt,cover;
 7 } tree[maxn<<2];
 8 int ret;
 9 void build(int L,int R,int v) {
10     tree[v].lt = L;
11     tree[v].rt = R;
12     tree[v].cover = 1;
13     if(L == R) return;
14     int mid = (L + R)>>1;
15     build(L,mid,v<<1);
16     build(mid+1,R,v<<1|1);
17 }
18 inline void pushup(int v) {
19     if(tree[v<<1].cover == tree[v<<1|1].cover)
20         tree[v].cover = tree[v<<1].cover;
21     else tree[v].cover = -1;
22 }
23 inline void pushdown(int v) {
24     if(tree[v].cover >= 0) {
25         tree[v<<1].cover = tree[v<<1|1].cover = tree[v].cover;
26         tree[v].cover = -1;
27     }
28 }
29 void update(int lt,int rt,int val,bool sel,int v) {
30     if(sel && tree[v].cover == val) return;
31     if(lt <= tree[v].lt && rt >= tree[v].rt && (sel || !sel && tree[v].cover >= 0)) {
32         if(sel) tree[v].cover = val;
33         else tree[v].cover ^= 1;
34         return;
35     }
36     pushdown(v);
37     if(lt <= tree[v<<1].rt) update(lt,rt,val,sel,v<<1);
38     if(rt >= tree[v<<1|1].lt) update(lt,rt,val,sel,v<<1|1);
39     pushup(v);
40 }
41 void query(int lt,int rt,int &ans,int &r,bool sel,int v) {
42     if(!tree[v].cover) return;
43     if(lt <= tree[v].lt && rt >= tree[v].rt && tree[v].cover > 0) {
44         if(sel) ans += tree[v].rt - tree[v].lt + 1;
45         else {
46             if(r + 1 == tree[v].lt) ans += tree[v].rt - tree[v].lt + 1;
47             else ans = tree[v].rt - tree[v].lt + 1;
48         }
49         r = tree[v].rt;
50         ret = max(ans,ret);
51         return;
52     }
53     pushdown(v);
54     if(lt <= tree[v<<1].rt) query(lt,rt,ans,r,sel,v<<1);
55     if(rt >= tree[v<<1|1].lt) query(lt,rt,ans,r,sel,v<<1|1);
56     pushup(v);
57 }
58 int main() {
59     int n,m,x,y,ans,r;
60     char op[3];
61     while(~scanf("%d %d",&n,&m)) {
62         build(1,n,1);
63         while(m--) {
64             scanf("%s%d%d",op,&x,&y);
65             switch(op[0]) {
66             case 'C':
67                 update(x,y,0,true,1);
68                 break;
69             case 'S':
70                 update(x,y,1,true,1);
71                 break;
72             case 'A':
73                 update(x,y,0,false,1);
74                 break;
75             case 'Q':
76                 ret = ans = r = 0;
77                 query(x,y,ans,r,true,1);
78                 printf("%d\n",ret);
79                 break;
80             case 'L':
81                 ret = ans = r = 0;
82                 query(x,y,ans,r,false,1);
83                 printf("%d\n",ret);
84                 break;
85             }
86         }
87     }
88     return 0;
89 }

View Code

转载于:https://www.cnblogs.com/crackpotisback/p/4466212.html

FZU 1968 Twinkling lights III相关推荐

  1. FOJ 1968 Twinkling lights III

    线段树,嗯,嗯. 本题有5个操作,并且对象都是区间:1. 开灯 2.关灯 3.把开的关,关的打开 4.询问区间有几盏灯亮着 5.询问区间最多连续亮着几盏灯 结构体里的cov是否完全覆盖,-1表示未完全 ...

  2. 2015英国女王殿下的圣诞致辞

    每年的圣诞节,伊丽莎白女王都会准时出现,用最标准的皇室英腔,带给大家一段圣诞贺词.一年出一次不到10分钟的视频,太珍贵.女王殿下每年都坚持亲自撰写演讲稿,严谨的文风和措辞,让我们这群"乡巴佬 ...

  3. 地图不是领地尼克·格里尔的采访

    Information designers and data visualization practitioners are often concerned with The Map - how it ...

  4. 考研英语 - word-list-27

    每天十个单词,本博客收集整理自<考研英语词汇>,仅供学习和个人积累. 新东方单词在线阅读地址 ,希望这个链接一直都有效 :) 2017年06月21日 20:54:05 tide 词义: n ...

  5. CodeForces - 1523E Crypto Lights(组合数学+推公式)

    题目链接:点击查看 题目大意:给出 nnn 个初始时熄灭的灯泡,每次操作会等概率打开一个灯泡,当每 kkk 个连续的灯泡中出现了大于一个亮着的灯泡时停止操作,问期望操作次数是多少 题目分析:组合数学题 ...

  6. 为了数学的明天,,穿越时空,重返南大(III)-

    为了数学的明天,,穿越时空,重返南大(III)     进入二十一世纪,非阿基米德数学(比如:含有无穷小的连续统)逐渐兴起,我们用该如何面对?     这是一个基本问题,必须彻底搞清楚,事实求是.   ...

  7. 剑指offer:面试题32 - III. 从上到下打印二叉树 III

    题目: 从上到下打印二叉树 III 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定 ...

  8. fzu 2150 Fire Game 【身手BFS】

    称号:fzu 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧全部 ...

  9. 1968年12月9日,恩格尔巴特公开演示了世界上第一个鼠标盒子

    鼠标之父"道格拉斯·恩格尔巴特 腾讯科技讯,肖华2013年12月19日编译 计算机的几次革命和大规模普及都是始于人机交互的改变,今年7月2日,"鼠标之父"道格拉斯·恩格尔 ...

最新文章

  1. 如何设置鼠标移开后css,如何设置鼠标离开时由hover设置的样式不变?
  2. Hadoop的安装(单机和集群)
  3. html加上 extjs右键,extjs 处理HTML事件和自定义事件
  4. linux显示存储与标定不符,找到了linux分区顺序错乱修复方法
  5. JavaScript实现冒泡排序 可视化
  6. CAN总线在嵌入式Linux下驱动程序的实现
  7. java getbytes 长度_JAVA中的getBytes()方法
  8. 集线器,交换机,路由器工作层次的区别
  9. fdisk:Linux 下管理磁盘分区的利器
  10. 千年私服服务器用户名创建,千年私服详细安装技术文章
  11. 华为:实现流程优化的方法
  12. 2021-07-23 N卡显示器亮度设置
  13. Mysql 与 python 的使用
  14. 商场会员营销小程序-连接会员,赋能商家
  15. WordPress升级后,新版编辑器不能使用解决办法
  16. 年度目标进度和完成进度对比
  17. 少年之文明与国之文明——---从奥运会看国人素质之飞跃
  18. 吃得苦中苦 方为人上人
  19. 英语中的分数 带分数 小数怎么读
  20. 改成每天晚上锻炼身体

热门文章

  1. python实现模糊综合评判
  2. Nodejs搭建前后端分离开发模式下的微信网页项目
  3. 企业安全风险的来源有哪些?
  4. pyton对txt文件的读取写入和加密(含代码)
  5. 让你心动的20句励志文案
  6. 渗透测试必备google插件
  7. verilog从txt中读取_将Verilog中的二进制文件数据读入2D数组
  8. 基于f2从零实现移动端可视化编辑器
  9. 微信公众平台原创声明功能公测 自媒体原创保护的福音
  10. paper survey之——水下图像复原与增强水下光通信