洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解
时间:2019-07-12
本文章向大家介绍洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解,主要包括洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
看了一下题解,显然在做无用功啊,而且麻烦了许多,但是这道题真心不难,显然是一个区间修改的题目,然后查询的题目
我的线段树只需要记录一个量:区间和
看了一下其他题解的pushdown函数,发现真心写的很麻烦
这里有一个很巧妙的解法:
如果这个区域被染成了白棋,那么直接把这个区间总和清零就好了
然后向下传值,只需要把他的儿子节点sum清零就好了
那就直接上代码吧
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<stack> 7 #include<vector> 8 #include<map> 9 #include<set> 10 #include<algorithm> 11 12 #define lson i*2,l,mid 13 #define rson i*2+1,mid+1,r //宏定义 14 #define I_copy_the_answer return 0; 15 using namespace std; 16 17 int n,m; 18 struct tree{ 19 int l,r,sum; 20 }t[1000860]; //线段树最大可能达到四倍空间,因此数组开四倍以上 21 22 void build_tree(int i,int l,int r) 23 { 24 t[i].l=l; //这东西没什么用,但是查错的时候挺方便的 25 t[i].r=r; 26 if(l==r) 27 { 28 t[i].sum=1; //每一个黑色棋子 29 return ; 30 } 31 int mid=(l+r)/2; 32 build_tree(lson); 33 build_tree(rson); 34 t[i].sum=t[i*2].sum+t[i*2+1].sum; //这个不多睡了吧 35 return ; 36 } 37 38 int pushdown(int i) //简短的pushdown 39 { 40 if(!t[i].sum) //!即取反 0取反即1 41 t[i*2].sum=0,t[i*2+1].sum=0; 42 } 43 44 void change_tree(int i,int l,int r,int a,int b) 45 { 46 if(l>=a&&r<=b) 47 { 48 t[i].sum=0; 49 return ; 50 } 51 pushdown(i); 52 int mid=(l+r)/2; 53 if(a<=mid) change_tree(lson,a,b); 54 if(b>mid) change_tree(rson,a,b); 55 t[i].sum=t[i*2].sum+t[i*2+1].sum; 56 return ; 57 } 58 59 int ask_color_tree(int i,int l,int r,int a,int b) //这个函数其实可以不写,输出t[1].sum即可,但是为了演示一下写了出来 60 { 61 if(l>=a&&r<=b) 62 { 63 return t[i].sum; 64 } 65 pushdown(i); 66 int mid=(l+r)/2; 67 int ans=0; 68 if(a<=mid) ans+=ask_color_tree(lson,a,b); 69 if(b>mid) ans+=ask_color_tree(rson,a,b); 70 return ans; 71 } 72 73 int main() 74 { 75 int i,j; 76 scanf("%d %d",&n,&m); 77 build_tree(1,1,n); 78 for(i=1;i<=m;i++) 79 { 80 int t1,t2; 81 scanf("%d %d",&t1,&t2); 82 change_tree(1,1,n,t1,t2); 83 printf("%d\n",ask_color_tree(1,1,n,1,n)); //可以不要,直接输出t[1].sum 84 } 85 I_copy_the_answer //你就别抄这个代码了吧 86 }
原文地址:https://www.cnblogs.com/zsx6/p/11174399.html
- crossdomain.xml文件配置不当利用手法
- Android 常用的ORM框架详解
- 测试全球最安全的手机Blackphone
- 国产SSL防火墙 – sslfw
- Android 之dragger使用
- Android图像处理 - 高斯模糊的原理及实现
- 走进科学:银行ATM机真的安全吗?
- 漏洞科普:对于XSS和CSRF你究竟了解多少
- 巧用Live Template,不仅能提升AS开发效率,还能装逼
- 黑了前男友网站:从找SQL注入到后台权限
- 扩展CakePHP的CacheHelper以使用缓存引擎
- 走进科学:酒店保险箱真的保险么?
- 利用xmlrpc.php对WordPress进行暴力破解攻击
- .Net中如何操作IIS
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ggplot_Violin Plot & dot plot
- 只要网速够快,小视频看完一个删一个,任性!Python爬取小视频
- ggplot barplot and error bars
- 设计稿生成游戏界面
- ggplot Stripchart and line
- ggplot2 核密度图和直方图
- 喜欢的歌曲不在一个平台怎么办?你需要一个自己专属的音乐播放器
- ggplot_QQ图和ECDF
- tidyverse evaluation
- 下载歌曲的时候嫌麻烦?打造专属你的音乐下载器
- Tidyverse补充
- 抖音关键词热度搜索小程序(附源码)
- python自定义函数基础
- Python-科学计算-pandas-13-列名/删除列/替换nan
- python小程序,45行代码实现可切换版代码雨(附源码)