bzoj 4546: codechef XRQRS [可持久化Trie]
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]的更多相关文章
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- BZOJ.5338.[TJOI2018]xor(可持久化Trie)
BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的,我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分. 注意求询问二的 ...
- bzoj4546-codechef XRQRS(可持久化Trie)
中文题题意我就不说了 解析: 可持久化Trie的模板题,详见注释 代码 #include<cstdio> #include<cstring> #include<strin ...
- BZOJ 3166 HEOI2013 ALO 可持久化trie+st表
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...
- bzoj 3166 [Heoi2013]Alo 可持久化Trie
3166: [Heoi2013]Alo Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1227 Solved: 569[Submit][Status ...
- BZOJ 5338: [TJOI2018]xor 可持久化trie+dfs序
强行把序列问题放树上,好无聊啊~ code: #include <bits/stdc++.h> #define N 200005 #define setIO(s) freopen(s&qu ...
- 可持久化trie 学习总结
QAQ 以前一直觉得可持久化trie很难,今天强行写了一发觉得还是蛮简单的嘛 自己的模板是自己手写的,写了几道题目并没有出过错误 THUSC的第二题的解法五貌似就是可持久化trie,时间复杂度O(60 ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
随机推荐
- stl总结精简版
STL 精简版 vetor #include<vector> #include<cstdio> #include<algorithm> #include<io ...
- hdu_1015(dfs)
题意:根据给出的计算公式,给一个n和一个字符集,问能不能在字符串集中找到不重复的五个字符,让其计算结果等于给定的n,如果有多个解输出字典序最大的一个 题解:dfs直接上代码了 code: #inclu ...
- ubantu下su命令Authentication failure失败的解决方式
Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root . 可以使用: sudo passwd 来重新设置root密码,后即可登陆root. ortonwu@ubu ...
- 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报错如下: ...
- 【开发技术】Eclipse设置软tab(用4个空格字符代替)及默认utf-8文件编码(unix)
Eclipse设置软tab(用4个空格字符代替)及默认utf-8文件编码(unix) 本文摘要: 1.如何配置Eclipse中编辑器支持softtab(用数个空格字符代替默认的tab缩进): 2.如何 ...
- 使用Botkit和Rasa NLU构建智能聊天机器人
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 我们每天都会听到关于有能力涉及旅游.社交.法律.支持.销售等领域的新型机器人推出的新闻.根据我最后一次查阅的数据,单单Facebook Me ...
- Redis-配置认证密码
1.找到redis.conf,配置密码 2.要重新启动一下redis 3.用redis-cli重新登陆,我们查询的时候提示"Authentication required"查询失败 ...
- 微信小程序实战:天气预报
接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...
- Linux指令--cd,pwd
本文参照博客做了修改和总结,感谢作者的分享.http://www.cnblogs.com/peida/archive/2012/10/24/2736501.html cd 命令可以说是Linux中最基 ...
- POI--HSSFCell类
用POI创建单元格,使用「HSSFCell」类 该类包含三个构造方法. protected HSSFCell(Workbook book, Sheet sheet, int row, CellVal ...