P5312 [Ynoi2011]D2T1
思路:01trie 按位维护
提交:5边
错因:爆int + 少处理询问时的右端点
题解:
见代码(已经不想说什么了)
代码
//I have my own flg;
#include<bits/stdc++.h>
#define ll long long
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} const int L=29,N=200010;
int n,cnt,m,tot,a[N],s[N][30],ch[N*15][2],dat[N*15][30],sz[N*15];
int cur,lst;
inline void ins(int x) { R tr=0;
for(R i=L;~i;--i) { R c=x>>i&1;
if(!ch[tr][c]) ch[tr][c]=++tot;
tr=ch[tr][c],++sz[tr];
for(R j=0;j<=L;++j) dat[tr][j]+=x>>j&1;//按位存储子树中每一位出现的次数
}
}
inline ll query(int k) {
R tr=0,vl=0; register ll ret=0;
for(R i=L;~i;--i) { R c=lst>>i&1;
if(sz[ch[tr][c]]>=k) tr=ch[tr][c];
else {
R t=ch[tr][c]; k-=sz[t],vl|=1<<i;//右子树,即1,记录遍历到所有1的值。
for(R j=0,d;j<=L;++j) {//按位处理左子树每一位的贡献
d=dat[t][j];
if(cur>>j&1) d=sz[t]-d;//注意如果现在有标记要取反
ret+=1ll*d<<j;
} tr=ch[tr][c^1];
}
} vl^=lst^cur;//vl相当于是在trie树中已经经过lst标记的数,所以要抵消掉cur中的lst
return ret+1ll*vl*k;//k是最后剩下的应该的右子树的个数
}
inline void push() {for(R i=0;i<=L;++i) s[cnt][i]=s[cnt-1][i]+(a[cnt]>>i&1);}
inline void calc(int l,int r) { register ll ret=0;
if(l<=n) ret+=query(min(r,n))-query(l-1);
if(r>n) {l=max(l,n+1); R sum=r-l+1;
for(R i=0;i<=L;++i) {
if(cur>>i&1) ret+=1ll*(sum-s[r][i]+s[l-1][i])<<i;
else ret+=1ll*(s[r][i]-s[l-1][i])<<i;
}
} printf("%lld\n",ret);
}
inline void main() {
//lst表示trie树中xor后的0。
//lst会告诉你走trie树的左边还是右边
//cur是所有标记的累加。
//trie树中存的数都是在最开始的时间点上的。
cnt=g(); for(R i=1;i<=cnt;++i) { a[i]=g();
for(R j=0;j<=L;++j) s[i][j]=s[i-1][j]+(a[i]>>j&1);//后面未排序的直接维护按位的前缀和
} m=g(); for(R i=1,op,l,r;i<=m;++i) { op=g();
if(op==1) a[++cnt]=g()^cur,push();
if(op==2) l=g(),r=g(),calc(l,r);
if(op==3) cur^=g();
if(op==4) {for(R i=n+1;i<=cnt;++i) ins(a[i]); n=cnt,lst=cur;}
}
}
} signed main() {Luitaryi::main(); return 0;}
2019.09.17
59
flg总算没有倒
P5312 [Ynoi2011]D2T1的更多相关文章
- [Ynoi2011]D2T1
题目大意: 给定一个数列$a$,有以下几种询问: 1. 给定$x$,在序列末尾插入$x$.2. 给定$l,r$,输出$\sum\limits_{i=l}^r a_i$.3. 给定$x$,将数列中的所有 ...
- 【二分查找】 跳石头NOIP2015提高组 D2T1
[二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...
- [NOIP2018 TG D2T1]旅行
题目大意:$NOIP\;TG\;D2T1$ 题解:一棵树的很简单,第一个点一定是$1$,只需要对每个节点,找最小的没有访问过的节点访问即可,我写的是$O(n\log_2n)$. 考虑基环树的部分,一个 ...
- noip 2018 d2t1 旅行
noip 2018 d2t1 旅行 (题目来自洛谷) 给定n个城市,m条双向道路的图, 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路 ...
- 嵊州D2T1 “我只是来打个电话”
嵊州D2T1 “我只是来打个电话” 精神病院有一个这样的测试. 给出一个正整数集合,集合中的数各不相同,然后要求病人回答: 其中有多少个数,恰好等于集合中另外两个(不同的)数之和? 回答正确的人,即可 ...
- 【NOIP/CSP2019】D2T1 Emiya 家今天的饭
这个D2T1有点难度啊 原题: 花了我一下午的时间,作为D2T1的确反常 条件很奇怪,感觉不太直观,于是看数据范围先写了个暴力 写暴力的时候我就注意到了之前没有仔细想过的点,烹饪方式必须不同 虽然a很 ...
- P5311 [Ynoi2011] 成都七中
P5311 [Ynoi2011] 成都七中 题意 给你一棵 \(n\) 个节点的树,每个节点有一种颜色,有 \(m\) 次查询操作. 查询操作给定参数 \(l\ r\ x\),需输出: 将树中编号在 ...
- 从 洛谷P5309 Ynoi2011 初始化 看卡常
一般情况下,程序运行消耗时间主要与时间复杂度有关,超时与否取决于算法是否正确. 但对于某些题目,时间复杂度正确的程序也无法通过,这时我们就需要卡常数,即通过优化一些操作的常数因子减少时间消耗. 比如这 ...
- noip 2016提高组D2T1 problem
我们可以先预处理一下组合数模K的值,然后我们可以发现对于答案ji[n][m],可以发现递推式ji[i][j]=ji[i-1][j]+ji[i][j-1]-ji[i-1][j-1]并对于Cij是否%k等 ...
随机推荐
- 抽象类 and 接口
目录 抽象类 抽象类的域和方法的权限: 接口 接口中的域和方法的权限: 实现多个接口 接口继承 接口嵌套 抽象类 一个类,如果有抽象方法(没有方法体),则该类必须被限定为抽象类(abstract):当 ...
- Word 查找替换高级玩法系列之 -- 用替换功能删除空白区域
当你遇到Word文档中时不时的出现一些空白区域的时候会怎么办呢?一个个删除吗?NO!NO!NO!!!那样也太慢了!仅使用替换功能就可以帮你一步搞定它! 下面这篇文档中含有半角空格.全角空格.不间断空格 ...
- PAT甲级 进制转换题_C++题解
进制转换题 PAT (Advanced Level) Practice 进制转换题 目录 <算法笔记> 重点摘要 1015 Reversible Primes (20) 1019 Gene ...
- 使用寄存器点亮LED(第2节)—寄存器映射代码讲解
// 打开 GPIOB 端口的时钟 *( unsigned int * )0x40021018|= ( 1 << 4 ); // 配置PC2 IO口为通用推挽输出,速度为10M *( un ...
- asp.net core-14.JWT认证授权 生成 JWT Token
源码下载 语言组织能力不好 ,看这个 视频 用visual studio code打开文件,运行dotnet watch run 之后在postman里面去访问 拿到Token后
- android 自动化测试案例之 MonkeyScript
#文件名 MonkeyScript.mks #功能: 使用monkey script测试app,此案例是测试搜索功能(输入关键字,然后点击搜索按钮)#参考: http://blog.csdn.net/ ...
- JS基础_函数作用域
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 字蛛webfont 安装及使用方法
先安装nodejs和git,比如放在D:/nodejs/ 文件夹 cmd 进入该文件夹,安装npm install express 安装 npm install font-spider -g 安装 ...
- vue、react中循环遍历为什么会有key,key有什么作用?
先讲一下,vue和react都是在操作虚拟dom,并且根据diff算法进行新旧dom对比,从而更新dom,以vue举例: vue官方文档中写到有 key 的特殊属性主要用在 Vue 的虚拟 DOM 算 ...
- Android开发之图像处理那点事——滤镜
在Android开发中,一般对图像的处理就是Bitmap(位图),它包含了图像的全部数据,即点阵和颜色值,点阵就是包含像素点的矩阵,而颜色值就是ARGB,分别代表透明.红色.绿色.蓝色通道,它们共同决 ...