NOIP 模拟23
时间:2021-07-25
本文章向大家介绍NOIP 模拟23,主要包括NOIP 模拟23使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
T1:
序列操作,支持区间覆盖,区间异或,线段树解决
线段树区间操作时间复杂度的保证就是懒惰标记,可以说
懒惰标记就是线段树的核心
考虑懒惰标记的本质是记录操作所带来的影响,仅在
使用时才拓展历史上所造成的影响,以此保证时间复杂度。
于是,当存在多种影响时(多个标记),须考虑影响之间
的逻辑关系与影响,以一定的关系进行多影响的拓展。
对于本题而言,两种思路,一是直接记录最靠左0的
位置进行拓展,考虑每种操作的影响(操作3是将最左0与
最左1位置互换),发现要拓展出最左1进行辅助转移。
二是记录区间中0的个数,类似与区间求排名的方式
找到最左值即可
对于懒惰标记的下放,首先区间覆盖的优先级大于
区间异或(由标记本身的性质得出),因此,在转移3标记
时,要先考虑1,2标记的影响。
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef int I; 4 typedef void V; 5 typedef bool B; 6 typedef long long LL; 7 const I MAXM = 1e5 + 3; 8 I m,cnt; 9 LL auxiliary[MAXM * 3]; 10 struct QUERY { 11 I typ; 12 LL l,r; 13 }question[MAXM]; 14 inline V Discretization () { 15 for (I i(1);i <= m; ++ i) 16 auxiliary[++cnt] = question[i].l, auxiliary[++cnt] = question[i].r, auxiliary[++cnt] = question[i].r + 1; 17 sort (auxiliary + 1,auxiliary + cnt + 1); 18 cnt = unique (auxiliary + 1,auxiliary + cnt + 1) - auxiliary - 1; 19 for (I i(1);i <= m; ++ i) 20 question[i].l = lower_bound (auxiliary + 1,auxiliary + cnt + 1,question[i].l) - auxiliary, 21 question[i].r = lower_bound (auxiliary + 1,auxiliary + cnt + 1,question[i].r) - auxiliary; 22 } 23 namespace SGT { 24 #define lc(x) (x << 1) 25 #define rc(x) (x << 1 | 1) 26 #define mid (l + r >> 1) 27 #define update(x) (pos0[x] = min (pos0[lc(x)],pos0[rc(x)]),pos1[x] = min(pos1[lc(x)],pos1[rc(x)])) 28 I pos0[MAXM * 12],pos1[MAXM * 12]; 29 bool tag1[MAXM * 12],tag2[MAXM * 12],tag3[MAXM * 12]; 30 inline V pushdown (I x,I l,I r) { 31 if (tag1[x]) { 32 tag1[x] = 0; 33 pos0[lc(x)] = INT_MAX, pos1[lc(x)] = l, tag1[lc(x)] = 1, tag2[lc(x)] = tag3[lc(x)] = 0; 34 pos0[rc(x)] = INT_MAX, pos1[rc(x)] = mid + 1, tag1[rc(x)] = 1, tag2[rc(x)] = tag3[rc(x)] = 0; 35 } 36 if (tag2[x]) { 37 tag2[x] = 0; 38 pos0[lc(x)] = l, pos1[lc(x)] = INT_MAX, tag2[lc(x)] = 1, tag1[lc(x)] = tag3[lc(x)] = 0; 39 pos0[rc(x)] = mid + 1, pos1[rc(x)] = INT_MAX, tag2[rc(x)] = 1, tag1[rc(x)] = tag3[rc(x)] = 0; 40 } 41 if (tag3[x]) { 42 tag3[x] = 0; 43 swap (pos0[lc(x)],pos1[lc(x)]), tag1[lc(x)] || tag2[lc(x)] ? (swap (tag1[lc(x)],tag2[lc(x)]),1) : tag3[lc(x)] ^= 1; 44 swap (pos0[rc(x)],pos1[rc(x)]), tag1[rc(x)] || tag2[rc(x)] ? (swap (tag1[rc(x)],tag2[rc(x)]),1) : tag3[rc(x)] ^= 1; 45 } 46 } 47 V found (I x,I l,I r) { 48 pos0[x] = l, pos1[x] = INT_MAX; 49 if (l == r) return ; 50 found (lc(x),l,mid), found (rc(x),mid + 1,r); 51 } 52 V secmod1 (I x,I l,I r,I ql,I qr) { 53 if (ql <= l && r <= qr) return (V)(pos0[x] = INT_MAX, pos1[x] = l, tag1[x] = 1, tag2[x] = tag3[x] = 0); 54 pushdown (x,l,r); 55 if (ql <= mid) secmod1 (lc(x),l,mid,ql,qr); 56 if (qr > mid) secmod1 (rc(x),mid + 1,r,ql,qr); 57 update (x); 58 } 59 V secmod2 (I x,I l,I r,I ql,I qr) { 60 if (ql <= l && r <= qr) return (V)(pos0[x] = l, pos1[x] = INT_MAX, tag2[x] = 1, tag1[x] = tag3[x] = 0); 61 pushdown (x,l,r); 62 if (ql <= mid) secmod2 (lc(x),l,mid,ql,qr); 63 if (qr > mid) secmod2 (rc(x),mid + 1,r,ql,qr); 64 update (x); 65 } 66 V secmod3 (I x,I l,I r,I ql,I qr) { 67 if (ql <= l && r <= qr) return (V)(swap (pos0[x],pos1[x]), tag1[x] || tag2[x] ? (swap (tag1[x],tag2[x]),1) : tag3[x] ^= 1); 68 pushdown (x,l,r); 69 if (ql <= mid) secmod3 (lc(x),l,mid,ql,qr); 70 if (qr > mid) secmod3 (rc(x),mid + 1,r,ql,qr); 71 update (x); 72 } 73 } 74 signed main () { 75 cin >> m; 76 for (I i(1);i <= m; ++ i) 77 cin >> question[i].typ >> question[i].l >> question[i].r; 78 auxiliary[++cnt] = 1; 79 Discretization (); 80 SGT :: found (1,1,cnt); 81 for (I i(1);i <= m; ++ i) { 82 switch (question[i].typ) { 83 case 1 : SGT :: secmod1 (1,1,cnt,question[i].l,question[i].r); break; 84 case 2 : SGT :: secmod2 (1,1,cnt,question[i].l,question[i].r); break; 85 case 3 : SGT :: secmod3 (1,1,cnt,question[i].l,question[i].r); break; 86 } 87 cout << auxiliary[SGT :: pos0[1]] << endl; 88 } 89 }
注:学习线段树的核心操作,以及转移影响的逻辑关系,注意思考问题的全面性
原文地址:https://www.cnblogs.com/HZOI-LYM/p/15059031.html
- python2.6升级到3.3.0 的操作记录
- 由javascript中"匿名函数调用写法"引出的一些东东
- javascript中定义私有方法(private method)
- python升级后带来的几个小问题
- 分布式监控系统Zabbix-3.0.3-完整安装记录(1)
- centos6.8下安装部署LNMP-(nginx1.8.0+php5.6.10+mysql5.6.12)
- IE7下当position:fixed遇到text-align:center
- 数组-在Shell脚本中的基本使用介绍
- .Net Core下通过Proxy 模式 使用 WCF
- javascript中function调用时的参数检测常用办法
- squid代理http和https方式上网的操作记录
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)
- 域名hiku.com曾百万价格被交易,目前被加拿大大麻公司收购
- Linux系统下的用户密码设定梳理
- 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 数组属性和方法
- MapReduce之片和块的关系
- MapReduce的常见输入格式之CombineTextInputFormat
- MapReduce之Job提交流程
- MapReduce之自定义InputFormat
- MapReduce之MapTask工作机制
- 数据链路层的三个基本问题
- DEBUG ArrayList
- 【PAT甲级】1002 A+B for Polynomials (25分)
- c/c++补完计划(一): 指针常量和常量指针
- 从0到1开发测试平台(六)增加登录接口
- FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放
- 【剑指offer】31.整数中1出现的次数
- 【剑指offer】35.数组中的逆序对
- 针对用友ic读卡器 web 脚本的重构
- NIO实现多人聊天室