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等 ...
随机推荐
- docker 实践三:操作容器
在学习了 docker 镜像的内容后,我们在来看 docker 的另一个核心点:容器. 注:环境为 CentOS7,docker 19.03 docker 的容器是镜像的一个运行实例.docker 镜 ...
- [javascript]原生js实现Ajax
一.首先看JQuery提供的Ajax方法: $.ajax({ url: , type: '', dataType: '', data: { }, success: function(){ }, err ...
- (七)shiro之编码/加密
一.编码/解码 使用Base64编码/解码操作 public class TestMain { public static void main(String[] args) { SecurityMan ...
- (二十)SpringBoot之集成mybatis:使用mybatis注解
一.使用mybatis注解的集成 1.1 引入maven依赖 <dependencies> <dependency> <groupId>org.springfram ...
- Java Fibonacci 斐波那契亚
Java Fibonacci 斐波那契亚 /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternat ...
- c++opencv中线条细化算法
要达到的效果就是将线条尽量细化成单像素,按照论文上的Hilditch算法试了一下,发现效果不好,于是自己尝试着写了一下细化的算法,基本原理就是从上下左右四个方向向内收缩. 1.先是根据图片中的原则确定 ...
- TeamCity安装和配置
目录 TeamCity安装和配置 前言 持续集成(CI) TeamCity 环境 安装 配置TeamCity 项目构建 效果展示 TeamCity自动构建项目及集成IDEA(待更新......) 结束 ...
- js之拖拽事件
js之拖拽事件 api:https://www.runoob.com/jsref/event-ondrag.html 拖拽事件是js原生的事件,使用时在div上添加 draggable="t ...
- windows找不到头文件的问题
windows系统中,设置好了环境变量,就可以在cmd下直接执行文件,但是 特别是在c语言或者c++程序中,include头文件的问题,如果找不到,就考虑是不是文件放错地方了. windows上编译c ...
- printPreviewControl1怎么刷新文档
printPreviewControl1.InvalidatePreview(); 调用printPreviewControl1控件的 InvalidatePreview() 这个方法即可.