4546: codechef XRQRS


可持久化Trie

codechef上过了,bzoj上蜜汁re,看别人说要开5.2e5才行。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 5.2e5+5;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
} void put(int x) {
for(int i=19; i>=0; i--) {
if(x & (1<<i)) putchar('1');
else putchar('0');
}
printf(" %d\n", x);
}
int Q, op, l, r;
int tot;
namespace trie {
#define ch(x, f) t[x].ch[f]
struct node {int ch[2], size;} t[N * 20];
int sz, root[N];
void insert(int &x, int p, int val) { //printf("insert %d %d\n", val, bool(val & (1<<p)));
t[++sz] = t[x]; x = sz;
t[x].size ++;
if(p < 0) return;
if(val & (1<<p)) insert(t[x].ch[1], p-1, val);
else insert(t[x].ch[0], p-1, val);
} int max_xor(int x, int y, int p, int val) {
int ans = 0;
while(p >= 0) {
bool f = ~ val & (1<<p);
if(t[ch(y, f)].size - t[ch(x, f)].size == 0) f ^= 1;
x = t[x].ch[f], y = t[y].ch[f];
if(f) ans |= (1<<p);
p--;
}
return ans;
} int small(int x, int y, int p, int val) {
int ans = 0;
while(p >= 0) {
bool f = val & (1<<p);
if(f) ans += t[ch(y, 0)].size - t[ch(x, 0)].size;
y = ch(y, f), x = ch(x, f);
p--;
}
ans += t[y].size - t[x].size;
return ans;
} int kth(int x, int y, int p, int k) {
int ans = 0, lsize = 0;
while(p >= 0) {
int _ = lsize + t[ch(y, 0)].size - t[ch(x, 0)].size;
if(k <= _) y = ch(y, 0), x = ch(x, 0);
else lsize = _, ans |= (1<<p), y = ch(y, 1), x = ch(x, 1);
p--;
}
return ans;
}
} using trie::root; void add(int x) {
tot++;
root[tot] = root[tot-1];
trie::insert(root[tot], 19, x);
}
void del(int k) {tot -= k;}
void max_xor(int l, int r, int x) { //printf("max_xor %d %d %d\n", l, r, x);
int ans = trie::max_xor(root[l-1], root[r], 19, x);
printf("%d\n", ans);
}
void smaller(int l, int r, int x) {
int ans = trie::small(root[l-1], root[r], 19, x);
printf("%d\n", ans);
}
void kth(int l, int r, int k) { //printf("kth %d %d %d\n", l, r, k);
int ans = trie::kth(root[l-1], root[r], 19, k);
printf("%d\n", ans);
}
int main() {
freopen("in", "r", stdin);
Q = read();
for(int i=1; i<=Q; i++) {
op = read() - 1; //printf("\n-------------------- %d %d\n", i, op);
if(op == 0) add(read());
else if(op == 2) del(read());
else {
l = read(); r = read();
if(op == 1) max_xor(l, r, read());
else if(op == 3) smaller(l, r, read());
else kth(l, r, read());
}
}
}

bzoj 4546: codechef XRQRS [可持久化Trie]的更多相关文章

  1. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  2. BZOJ.5338.[TJOI2018]xor(可持久化Trie)

    BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的,我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分. 注意求询问二的 ...

  3. bzoj4546-codechef XRQRS(可持久化Trie)

    中文题题意我就不说了 解析: 可持久化Trie的模板题,详见注释 代码 #include<cstdio> #include<cstring> #include<strin ...

  4. BZOJ 3166 HEOI2013 ALO 可持久化trie+st表

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...

  5. bzoj 3166 [Heoi2013]Alo 可持久化Trie

    3166: [Heoi2013]Alo Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1227  Solved: 569[Submit][Status ...

  6. BZOJ 5338: [TJOI2018]xor 可持久化trie+dfs序

    强行把序列问题放树上,好无聊啊~ code: #include <bits/stdc++.h> #define N 200005 #define setIO(s) freopen(s&qu ...

  7. 可持久化trie 学习总结

    QAQ 以前一直觉得可持久化trie很难,今天强行写了一发觉得还是蛮简单的嘛 自己的模板是自己手写的,写了几道题目并没有出过错误 THUSC的第二题的解法五貌似就是可持久化trie,时间复杂度O(60 ...

  8. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  9. BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

随机推荐

  1. stl总结精简版

    STL 精简版 vetor #include<vector> #include<cstdio> #include<algorithm> #include<io ...

  2. hdu_1015(dfs)

    题意:根据给出的计算公式,给一个n和一个字符集,问能不能在字符串集中找到不重复的五个字符,让其计算结果等于给定的n,如果有多个解输出字典序最大的一个 题解:dfs直接上代码了 code: #inclu ...

  3. ubantu下su命令Authentication failure失败的解决方式

    Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root . 可以使用: sudo passwd 来重新设置root密码,后即可登陆root. ortonwu@ubu ...

  4. the server responded with a status of 414 (Request-URI Too Large)

    nginx 配置不当,前端ajax调用报错: the server responded with a status of 414 (Request-URI Too Large) 浏览器F12报错如下: ...

  5. 【开发技术】Eclipse设置软tab(用4个空格字符代替)及默认utf-8文件编码(unix)

    Eclipse设置软tab(用4个空格字符代替)及默认utf-8文件编码(unix) 本文摘要: 1.如何配置Eclipse中编辑器支持softtab(用数个空格字符代替默认的tab缩进): 2.如何 ...

  6. 使用Botkit和Rasa NLU构建智能聊天机器人

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 我们每天都会听到关于有能力涉及旅游.社交.法律​​.支持.销售等领域的新型机器人推出的新闻.根据我最后一次查阅的数据,单单Facebook Me ...

  7. Redis-配置认证密码

    1.找到redis.conf,配置密码 2.要重新启动一下redis 3.用redis-cli重新登陆,我们查询的时候提示"Authentication required"查询失败 ...

  8. 微信小程序实战:天气预报

    接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...

  9. Linux指令--cd,pwd

    本文参照博客做了修改和总结,感谢作者的分享.http://www.cnblogs.com/peida/archive/2012/10/24/2736501.html cd 命令可以说是Linux中最基 ...

  10. POI--HSSFCell类

    用POI创建单元格,使用「HSSFCell」类 该类包含三个构造方法.  protected HSSFCell(Workbook book, Sheet sheet, int row, CellVal ...