在序列上维护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. hdu 4902 Nice boat(线段树区间改动,输出终于序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 Problem Description There is an old country and ...

  2. JSP具体篇——application

    application对象 application对象用于保存全部应用程序中的共同拥有数据.它在server启动时自己主动创建.在server停止时自己主动销毁. 当application对象没有被销 ...

  3. WinForm开发----关闭window窗体最好的办法

    最近有一人问道,如何切换窗体.一想到这,我就想,不就是new一个form,然后就show么? 可是我发现,当你控制某个属性的时候,不是不能控制,只是很麻烦而已.有没有好的办法?当然有,咋办? 最简单最 ...

  4. [原创]将本地代码共享到github的操作步骤

    将本地代码共享到github的操作步骤 本地代码目录执行如下命令,初始化为git仓库. git init 到github上新建一个仓库,假设为https://github.com/sky0014/sk ...

  5. 九度OJ 1354:和为S的连续正数序列 (整除)

    时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:2028 解决:630 题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不 ...

  6. Go 学习笔记

    官网: https://golang.org/ 环境: $GOROOT: GOROOT环境变量指定了Go的安装目录. $GOPATH: GOPATH 环境变量指定workspace的目录. 命令行: ...

  7. 【python】-- IO多路复用(select、poll、epoll)介绍及实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  8. Django 之restframework1

    Restframework 这里先简单的介绍一下restful协议 ----一切皆是资源,操作只是请求方式 基于restful协议的框架有很多Django下的restframework只是其中的一种 ...

  9. CentOS iSCSI服务器搭建------Initiator篇

    服务器信息: [root@initiator ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@initiator ~]# un ...

  10. C# Lambda表达式与Linq

    , , , , , , }; //linq写法 var res = from i in arry select i; //lambda写法 var res = arry.Select(i => ...