在序列上维护4个操作

1.在序列的尾端添加x

2.输出Al~Ar的和

3.将所有数异或x

4.将序列从小到大排序

第一眼看上去是Splay于是头铁硬刚了一发

后来发现splay没法异或

去百度“维护异或  数据结构”

然后看到了Trie树  学习了一个

1.直接插到序列里

2.考虑前缀和  因为Trie树所管辖的下标区间是有序的,所以这里相当于求Trie树中最小的x个数的,记一下每个点下面数字个数(sz)就可以了

3.考虑整体打一个xortag 对于当前存在的xortag 我们将它的每一位分解到Trie树上跑,如果xortag某一位为1,那么其实相当于该位置的左儿子比右儿子大 处理一下即可

4.把序列插到Trie树里

然后瞎暴力/滑稽

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
#define ll long long
#define pi 3.14
#define eps 1e-9
#define INF 2147483233
#define m(a) memset(a,0,sizeof(a))
#define M(a) memset(a,127,sizeof(a))
#define REP(i,m,n) for(int i=1;i<=n;i++)
#define DWN(i,n,m) for(int i=n;i>=1;i++)
#define lowbit(x) x&(-x)
#define POJ(n) while(~scanf("%d",&n) && n)
using namespace std;
const int maxn=1e5,maxh=;
int xortag,n,m;
struct trie
{
int ch[maxn*maxh][];
int sz[maxn*maxh];
int sum[maxn*maxh][maxh];
int root=;
int len=;
int tag=;
void insert(int x)
{
int u=root;
for(int i=maxh-;i>=;--i)
{
int id=((x&(<<i))>);
if(!ch[u][id]) ch[u][id]=++len;
u=ch[u][id];
++sz[u];
for(int j=;j<maxh;++j)
if(x&(<<j)) sum[u][j]++;
}
}
long long getsum(int x)
{
long long ans=;
for(int i=;i<maxh;++i)
if(xortag&(<<i)) ans+=(sz[x]-sum[x][i])*(1LL<<i);else ans+=sum[x][i]*(1LL<<i);
return ans;
}
long long query(int x)
{
if(x==) return ;
int u=root;
long long ans=;
for(int i=maxh-;i>=;--i)
{
int l=,r=;
if(tag&(<<i)) swap(l,r);
if(x<=sz[ch[u][l]]) u=ch[u][l];
else
{
ans+=getsum(ch[u][l]);
x-=sz[ch[u][l]];
u=ch[u][r];
}
}
ans+=getsum(u)/sz[u]*x;
return ans;
}
int getsize()
{
return sz[ch[root][]]+sz[ch[root][]];
}
}Trie;
struct array
{
int a[maxn+];
int sum[maxn+][maxh];
int len=;
void insert(int x)
{
x^=xortag;
a[++len]=x;
for(int i=;i<maxh;++i)
sum[len][i]=sum[len-][i]+((x&(<<i))>);
}
long long query(int x)
{
long long ans=;
for(int i=;i<maxh;++i)
if(xortag&(<<i)) ans+=(x-sum[x][i])*(1LL<<i);else ans+=sum[x][i]*(1LL<<i);
return ans;
}
void transfer()
{
Trie.tag=xortag;
for(int i=;i<=len;++i)
Trie.insert(a[i]);
len=;
}
}Array;
long long query(int x)
{
if(x<=Trie.getsize()) return Trie.query(x);
else return Trie.query(Trie.getsize())+
Array.query(x-Trie.getsize());
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
int x;
scanf("%d",&x);
Array.insert(x);
}
scanf("%d",&m);
for(int i=;i<=m;++i)
{
int op,x,y;
scanf("%d",&op);
if(op==)
{
scanf("%d",&x);
Array.insert(x);
}
if(op==)
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(y)-query(x-));
}
if(op==)
{
scanf("%d",&x);
xortag^=x;
}
if(op==) Array.transfer();
}
return ;
}

loj517 计算几何瞎暴力的更多相关文章

  1. loj517 计算几何瞎暴力(Trie树)

    题目: https://loj.ac/problem/517 分析: 操作4比较特殊,我们先来分析下操作4 操作4相当于需要一个数据结构,使得里面的数据有序(这有很多选择) 结合操作1,操作4的“排序 ...

  2. 汕头市队赛 SRM14 T1 计算几何瞎暴力

    计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...

  3. LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力

    二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...

  4. 玲珑杯 round18 A 计算几何瞎暴力

    题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. ...

  5. [LOJ#517]. 「LibreOJ β Round #2」计算几何瞎暴力[trie]

    题意 题目链接 分析 记操作异或和为 \(tx\) ,最后一次排序时的异或和为 \(ax\) ,每个数插入时的 \(tx\) 记为 \(b\). 我们发现,一旦数列排序,就会变得容易操作. 对于新加入 ...

  6. 「LibreOJ β Round #2」计算几何瞎暴力

    https://loj.ac/problem/517 题解 首先我们如果没有排序这个骚操作的话,可以直接记一下各个数位的前缀和,然后异或标记给全局打,查询的时候先把区间信息提取出来然后整体异或就好了. ...

  7. 玲珑杯”ACM比赛 Round #18 A -- 计算几何你瞎暴力(瞎暴力)

    题目链接:http://www.ifrog.cc/acm/problem/1143?contest=1020&no=0 题解:就是瞎暴力具体多暴力看一下代码就知道了. #include < ...

  8. 玲珑杯 Round #18 A -- 计算几何你瞎暴力

    因为坐标都在1-10之间,因此可暴力求解 #include <iostream> #include <cstdio> #include <cstring> #inc ...

  9. 【玲珑杯 round#18 A】计算几何你瞎暴力

    [Link]:http://www.ifrog.cc/acm/problem/1143?contest=1020&no=0 [Description] [Solution] 因为每个点的(xi ...

随机推荐

  1. github常见错误

    如果输入$ Git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote ...

  2. 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP

    [BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...

  3. term frequency–inverse document frequency

    term frequency–inverse document frequency

  4. vue 计算属性和监听器

    一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rev ...

  5. Linux安装Nginx使用反向代理

    nginx的反向代理功能(自带了反向代理的功能,天生的二道贩子)1.实验环境准备准备2个服务器,都安装好nginx软件nginx1 192.168.13.79 作为web服务器 (理解为火车票售票点) ...

  6. Python学习笔记_Python基础

    Python 基础 语句和语法 凝视 继续 代码组 代码的缩进 在一行书写多个语句 模块 变量赋值 赋值操作符 增量赋值 多重赋值 多元赋值 python编写的基本风格 模块的结构和布局 内存管理 变 ...

  7. python初学者总结

    学习python首先配置好工作环境,因为不同版本之间的python是不兼容了 原创:01coding.com win7安装环境过程: 1:下载python 建议下载两个不同版本官方已给出 https: ...

  8. Docker学习总结之docker创建私有仓库(private Repositories)

    Docker 创建 Private Repositories 前言 基于GFW的缘故,国内大陆基本无法pull国外的镜像,更别说官方的index了.如果images无法pull下来,那么docker就 ...

  9. Javaweb基础--->Servlet(转载)

    今天看到这篇博客,感觉还不错,拿来借鉴学习一下. 一.Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客 ...

  10. memcpy使用

    void memcpy(void dest, const void *src, size_t n); 功能编辑 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置 ...