思路: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的更多相关文章

  1. [Ynoi2011]D2T1

    题目大意: 给定一个数列$a$,有以下几种询问: 1. 给定$x$,在序列末尾插入$x$.2. 给定$l,r$,输出$\sum\limits_{i=l}^r a_i$.3. 给定$x$,将数列中的所有 ...

  2. 【二分查找】 跳石头NOIP2015提高组 D2T1

    [二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...

  3. [NOIP2018 TG D2T1]旅行

    题目大意:$NOIP\;TG\;D2T1$ 题解:一棵树的很简单,第一个点一定是$1$,只需要对每个节点,找最小的没有访问过的节点访问即可,我写的是$O(n\log_2n)$. 考虑基环树的部分,一个 ...

  4. noip 2018 d2t1 旅行

    noip 2018 d2t1 旅行 (题目来自洛谷) 给定n个城市,m条双向道路的图, 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路 ...

  5. 嵊州D2T1 “我只是来打个电话”

    嵊州D2T1 “我只是来打个电话” 精神病院有一个这样的测试. 给出一个正整数集合,集合中的数各不相同,然后要求病人回答: 其中有多少个数,恰好等于集合中另外两个(不同的)数之和? 回答正确的人,即可 ...

  6. 【NOIP/CSP2019】D2T1 Emiya 家今天的饭

    这个D2T1有点难度啊 原题: 花了我一下午的时间,作为D2T1的确反常 条件很奇怪,感觉不太直观,于是看数据范围先写了个暴力 写暴力的时候我就注意到了之前没有仔细想过的点,烹饪方式必须不同 虽然a很 ...

  7. P5311 [Ynoi2011] 成都七中

    P5311 [Ynoi2011] 成都七中 题意 给你一棵 \(n\) 个节点的树,每个节点有一种颜色,有 \(m\) 次查询操作. 查询操作给定参数 \(l\ r\ x\),需输出: 将树中编号在 ...

  8. 从 洛谷P5309 Ynoi2011 初始化 看卡常

    一般情况下,程序运行消耗时间主要与时间复杂度有关,超时与否取决于算法是否正确. 但对于某些题目,时间复杂度正确的程序也无法通过,这时我们就需要卡常数,即通过优化一些操作的常数因子减少时间消耗. 比如这 ...

  9. 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等 ...

随机推荐

  1. Windows注册表中修改UAC(用户账号控制)及批处理脚本

    注册表路径: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System 键说明: ConsentProm ...

  2. 编写python高质量python代码的59个有效方法

    第1条:确认自己的python版本 第2条:遵循PEP8的风格 1.空格 对于 占据多行的长表达式来说, 除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格. 每行字符数不应该超过79. 2. ...

  3. 使用Laravel 和 Vue 构建一个简单的SPA

    本教程是作者自己在学习Laravel和Vue时的一些总结,有问题欢迎指正. Laravel是PHP的一个框架,Vue是前端页面的框架,这两个框架如何结合起来构建一个SPA(Single Page Ap ...

  4. 将物理机系统转为虚拟机系统 p2v

    ref : https://blog.csdn.net/gsls200808/article/details/77932713 背景: 在公司有台机子主要负责某产品的升级与维护,出于各种原因,该产品需 ...

  5. HTML中关于动态创建的标签无法绑定js事件的解决方法:.on()方法的 [.selector]

    在前端页面的时候,会经常遇到用JavaScript动态创建出来的Button按钮或其他标签无法使用点击事件的问题.如下代码,使用jquery在body中动态创建一个class为demo的Button按 ...

  6. 设计模式(三)——装饰器模式(Decorator Pattern)

    发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...

  7. js中prototype与__proto__的关系详解

    一.构造函数: 构造函数:通过new关键字可以用来创建特定类型的对象的函数.比如像Object和Array,两者属于内置的原生的构造函数,在运行时会自动的出现在执行环境中,可以直接使用.如下: var ...

  8. Java 之 Collections 工具类

    一.Collections 概述 java.utils.Collections 是集合工具类,用来对集合进行操作. 二.常用方法 public static <T> boolean add ...

  9. 理解JVM之垃圾回收

    1.垃圾收集算法 1) 标记-清楚算法:该算法是最基础的收集算法,其分为标记与清除两个阶段.首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,该算法主要有两个不足:一个是效率问题,标 ...

  10. Iterator 其实很简单(最好理解的工厂模式的例子)

    我们都知道Iterator是一个典型的工厂模式的例子.那么我们可能会被这两个名词搞晕.首先,我们会奇怪,为什么iterator可以遍历不同类型的结合,其次,出入程序猿的我们根本不知道工厂模式是什么. ...