LOJ#2302 整数
解:发现这苟东西是个3千万位的二进制数......毒瘤吧。
拆位考虑,如果一个地方本来是1然后+1,就会把它和它前面连续的一段1变成0,并把第一个0变成1。
如果本来是0然后-1了,就会把它和它前面连续的一段0变成1,并把第一个1变成0。
然后发现这两个操作都可以用线段树。于是得到了一个60分算法。
然后压位,线段树每一位表示30个二进制位,可以发现之前的性质没变:如果一个地方加了后超过了(1<<30)-1,就把前面的一段1变成0,第一个0变成1。减法同理。
注意加法爆了就对(1<<30)-1取&,减法爆了就加上(1<<30),这里千万不能-1,因为是从前面借的。
有个地方坑死我了......看这里。
应该长这样...
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <bits/stdc++.h> 2 3 inline void read(int &x) { 4 x = 0; 5 char c = getchar(); 6 bool f = 0; 7 while(c < '0' || c > '9') { 8 if(c == '-') f = 1; 9 c = getchar(); 10 } 11 while(c >= '0' && c <= '9') { 12 x = x * 10 + c - 48; 13 c = getchar(); 14 } 15 if(f) x = (~x) + 1; 16 return; 17 } 18 19 const int N = 4000010, FULL = (1 << 30) - 1; 20 21 inline void out(int x) { 22 for(int i = 0; i <= 29; i++) printf("%d", (x >> i) & 1); 23 return; 24 } 25 26 int n, tag[N], val[N], sta[N], lm; 27 /// tag is_same now_state 28 29 inline void pushup(int o) { 30 if(val[o << 1] == val[o << 1 | 1] && val[o << 1] != -1) { 31 val[o] = val[o << 1]; 32 } 33 else val[o] = -1; 34 return; 35 } 36 37 inline void pushdown(int o) { 38 if(tag[o] != -1) { 39 tag[o << 1] = tag[o << 1 | 1] = tag[o]; 40 val[o << 1] = val[o << 1 | 1] = tag[o]; 41 sta[o << 1] = sta[o << 1 | 1] = (tag[o] ? FULL : 0); 42 tag[o] = -1; 43 } 44 return; 45 } 46 47 void changeAdd(int l, int r, int o) { 48 if(l == r) { 49 for(int i = 0; i < 30; i++) { 50 if(((sta[o] >> i) & 1) == 0) { 51 sta[o] |= (1 << i); 52 break; 53 } 54 else { 55 sta[o] &= ~(1 << i); 56 } 57 } 58 if(sta[o] == FULL) val[o] = 1; 59 else if(sta[o] == 0) val[o] = 0; 60 else val[o] = -1; 61 return; 62 } 63 int mid = (l + r) >> 1; 64 pushdown(o); 65 if(val[o << 1] != 1) { 66 changeAdd(l, mid, o << 1); 67 } 68 else { 69 changeAdd(mid + 1, r, o << 1 | 1); 70 sta[o << 1] = val[o << 1] = tag[o << 1] = 0; 71 } 72 pushup(o); 73 return; 74 } 75 76 void changeDel(int l, int r, int o) { 77 if(l == r) { 78 for(int i = 0; i < 30; i++) { 79 if((sta[o] >> i) & 1) { 80 sta[o] &= ~(1 << i); 81 break; 82 } 83 else { 84 sta[o] |= (1 << i); 85 } 86 } 87 if(sta[o] == FULL) val[o] = 1; 88 else if(sta[o] == 0) val[o] = 0; 89 else val[o] = -1; 90 return; 91 } 92 int mid = (l + r) >> 1; 93 pushdown(o); 94 if(val[o << 1] != 0) { 95 changeDel(l, mid, o << 1); 96 } 97 else { 98 changeDel(mid + 1, r, o << 1 | 1); 99 val[o << 1] = tag[o << 1] = 1; 100 sta[o << 1] = FULL; 101 } 102 pushup(o); 103 return; 104 } 105 106 int add(int p, int v, int l, int r, int o) { 107 if(l == r) { 108 sta[o] += v; 109 int t = 0; 110 if(sta[o] > FULL) { 111 sta[o] &= FULL; 112 t = 1; 113 } 114 if(sta[o] == FULL) val[o] = 1; 115 else if(sta[o] == 0) val[o] = 0; 116 else val[o] = -1; 117 return t; 118 } 119 int mid = (l + r) >> 1; 120 pushdown(o); 121 int t; 122 if(p <= mid) { 123 t = add(p, v, l, mid, o << 1); 124 pushup(o); 125 if(t && val[o << 1 | 1] != 1) { 126 changeAdd(mid + 1, r, o << 1 | 1); 127 pushup(o); 128 return 0; 129 } 130 else if(t) { 131 tag[o << 1 | 1] = val[o << 1 | 1] = sta[o << 1 | 1] = 0; 132 pushup(o); 133 return 1; 134 } 135 else return 0; 136 } 137 else { 138 t = add(p, v, mid + 1, r, o << 1 | 1); 139 pushup(o); 140 return t; 141 } 142 return 0; 143 } 144 145 int del(int p, int v, int l, int r, int o) { 146 if(l == r) { 147 sta[o] -= v; 148 int t = 0; 149 if(sta[o] < 0) { 150 sta[o] += FULL + 1; 151 t = 1; 152 } 153 if(sta[o] == FULL) val[o] = 1; 154 else if(sta[o] == 0) val[o] = 0; 155 else val[o] = -1; 156 return t; 157 } 158 int mid = (l + r) >> 1; 159 pushdown(o); 160 int t; 161 if(p <= mid) { 162 t = del(p, v, l, mid, o << 1); 163 pushup(o); 164 if(t && val[o << 1 | 1] != 0) { 165 changeDel(mid + 1, r, o << 1 | 1); 166 pushup(o); 167 return 0; 168 } 169 else if(t) { 170 tag[o << 1 | 1] = val[o << 1 | 1] = 1; 171 sta[o << 1 | 1] = FULL; 172 pushup(o); 173 return 1; 174 } 175 else return 0; 176 } 177 else { 178 t = del(p, v, mid + 1, r, o << 1 | 1); 179 pushup(o); 180 return t; 181 } 182 return 0; 183 } 184 185 inline void Add(int p, int x) { /// node p add x 186 if(!x) return; 187 add(p, x, 1, lm, 1); 188 return; 189 } 190 191 inline void Del(int p, int x) { 192 if(!x) return; 193 del(p, x, 1, lm, 1); 194 return; 195 } 196 197 int ask(int p, int l, int r, int o) { 198 if(l == r) { 199 p -= (l - 1) * 30; 200 return (sta[o] >> p) & 1; 201 } 202 int mid = (l + r) >> 1; 203 pushdown(o); 204 if(p <= mid * 30 - 1) return ask(p, l, mid, o << 1); 205 else return ask(p, mid + 1, r, o << 1 | 1); 206 } 207 208 void out(int l, int r, int o) { 209 if(l == r) { 210 return; 211 } 212 int mid = (l + r) >> 1; 213 pushdown(o); 214 out(l, mid, o << 1); 215 out(mid + 1, r, o << 1 | 1); 216 return; 217 } 218 219 int main() { 220 int t1, t2, t3; 221 memset(tag, -1, sizeof(tag)); 222 scanf("%d%d%d%d", &n, &t1, &t2, &t3); 223 lm = std::max(n + 10, 200); 224 for(int i = 1, f, x, y; i <= n; i++) { 225 scanf("%d%d", &f, &x); 226 if(f == 2) { 227 printf("%d\n", ask(x, 1, lm, 1)); 228 } 229 else { 230 scanf("%d", &y); 231 int t, fd = 0; 232 if(x < 0) { 233 x = -x; 234 fd = 1; 235 } 236 if(!fd) { /// add 237 t = (x << (y % 30)) & FULL; 238 Add(y / 30 + 1, t); 239 t = x >> (30 - (y % 30)); 240 Add(y / 30 + 2, t); 241 } 242 else { /// dec 243 t = (x << (y % 30)) & FULL; 244 Del(y / 30 + 1, t); 245 t = x >> (30 - (y % 30)); 246 Del(y / 30 + 2, t); 247 } 248 } 249 } 250 return 0; 251 }
AC代码
转载于:https://www.cnblogs.com/huyufeifei/p/10542603.html
LOJ#2302 整数相关推荐
- Loj #3111. 「SDOI2019」染色
Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
- Loj 6485. LJJ 学二项式定理
Loj 6485. LJJ 学二项式定理 题目描述 LJJ 学完了二项式定理,发现这太简单了,于是他将二项式定理等号右边的式子修改了一下,代入了一定的值,并算出了答案. 但人口算毕竟会失误,他请来了你 ...
- [LOJ#2270][BZOJ4912][SDOI2017]天才黑客
[LOJ#2270][BZOJ4912][SDOI2017]天才黑客 试题描述 SD0062 号选手小 Q 同学为了偷到 SDOI7012 的试题,利用高超的黑客技术潜入了 SDOI 出题组的内联网的 ...
- LOJ#2230. 「BJOI2014」大融合
LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...
- LOJ #6268 分拆数
不会五边形数的菜鸡的分块乱搞 LOJ #6268 题意 求前$ n$个数的整数划分方案数,$ n \leq 10^5$ $ Solution$ 考虑暴力$ DP$ $ f(x,y)$表示放了$ x$个 ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar
t老师的做法好神-- 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...
- bzoj 2302: [HAOI2011]Problem c(DP)
2302: [HAOI2011]Problem c Time Limit: 30 Sec Memory Limit: 256 MB Submit: 937 Solved: 509 [Submit] ...
最新文章
- (0054)iOS开发之制作静态库详解
- phpcms黄页,不能选择行业。解决办法
- 用Windows Server实现软件定义存储之存储空间直连
- 使用C#制作简易的注册表编辑器
- Java Code Geeks和Packt提供的Hadoop书籍赠品
- python sqlite3事务_python使用上下文管理器实现sqlite3事务机制
- backupexec Oracle授权,通过BackupExec重定向Oracle 8I数据库
- 19条优秀的编码原则
- sql server 读写txt文件
- 运营日记:App推广手段详解
- SylixOS移植常见问题——编译过多文件导致报错
- 山东省2013高职分数线
- 删除word标题前方空格的方法
- 数字图像处理与python实现-带通滤波器
- API调用展示,淘宝、天猫、拼多多商品页面详情API,APP端原数据参数返回
- android storyboard,iOS中xib与storyboard原理,与Android界面布局的异同
- EAS F7 左树右表
- 英伟达发布Game Ready新驱动,支持多款新游戏
- win浏览器(edge)如何无痕浏览
- 超过4亿人 中国拥有全球规模最大中等收入群体