loj517 计算几何瞎暴力
在序列上维护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 计算几何瞎暴力的更多相关文章
- loj517 计算几何瞎暴力(Trie树)
题目: https://loj.ac/problem/517 分析: 操作4比较特殊,我们先来分析下操作4 操作4相当于需要一个数据结构,使得里面的数据有序(这有很多选择) 结合操作1,操作4的“排序 ...
- 汕头市队赛 SRM14 T1 计算几何瞎暴力
计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...
- LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力
二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...
- 玲珑杯 round18 A 计算几何瞎暴力
题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. ...
- [LOJ#517]. 「LibreOJ β Round #2」计算几何瞎暴力[trie]
题意 题目链接 分析 记操作异或和为 \(tx\) ,最后一次排序时的异或和为 \(ax\) ,每个数插入时的 \(tx\) 记为 \(b\). 我们发现,一旦数列排序,就会变得容易操作. 对于新加入 ...
- 「LibreOJ β Round #2」计算几何瞎暴力
https://loj.ac/problem/517 题解 首先我们如果没有排序这个骚操作的话,可以直接记一下各个数位的前缀和,然后异或标记给全局打,查询的时候先把区间信息提取出来然后整体异或就好了. ...
- 玲珑杯”ACM比赛 Round #18 A -- 计算几何你瞎暴力(瞎暴力)
题目链接:http://www.ifrog.cc/acm/problem/1143?contest=1020&no=0 题解:就是瞎暴力具体多暴力看一下代码就知道了. #include < ...
- 玲珑杯 Round #18 A -- 计算几何你瞎暴力
因为坐标都在1-10之间,因此可暴力求解 #include <iostream> #include <cstdio> #include <cstring> #inc ...
- 【玲珑杯 round#18 A】计算几何你瞎暴力
[Link]:http://www.ifrog.cc/acm/problem/1143?contest=1020&no=0 [Description] [Solution] 因为每个点的(xi ...
随机推荐
- hdu 4902 Nice boat(线段树区间改动,输出终于序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 Problem Description There is an old country and ...
- Java和js的区别,以及Java和c的区别
刚开始的时候我们也搞不清这些概念,不过后来就慢慢清晰了,首先和大家谈谈Java和js的区别,最简单的区别就是一个是后端,一个是前端. java是纯面向对象语言,javascrip其实和Java是完 ...
- python基础-第六篇-6.4模块混战
我们之前接触多的编程方式就是函数式编程,而且喜欢就一个文件里写完所有的程序代码,这样做在前期感觉还不错,不过一旦你的程序变复杂,在易读性和排错方面就感觉好吃力,功能界限不明显,那今天我们就来讲讲怎么用 ...
- Linux根目录下重要文件夹
bin存放系统命令的目录,普通用户和超级用户都可以执行,不过放在这里的命令在单用户模式下也可以执行 sbin保存和系统环境设置相关的命令,只有超级用户可以使用这些命令进行系统环境的设置,但有些命令可以 ...
- js hoisting
1.变量提升 var x = 2; function test(){ console.log(x) var x = 1; } ==>运行程序报错,在test()函数中,x被提升到了顶部声明,相当 ...
- simple -- abstract
<?php abstract class Operation { protected $_NumberA = 0; protected $_NumberB = 0; protected $_Re ...
- webpack打包笔记
optimist是一个node库,将webpack.config.js与shell参数整合成options对象 options对象包含之后构建的重要信息,类似于webpack.config.js we ...
- Ansible Ad-Hoc命令集
Ad-Hoc Ad-Hoc就是 “临时命令”, 从功能上讲 Ad-Hoc跟Ansible-playbook都差不多,Ansible提供了两种完成任务的方式: Ad-Hoc命令集与Ansible-pla ...
- windows8.1下安装msi文件报错
新安装了win8.1系统体验体验,可是安装msi文件的软件报internal error2502和2503错误,可以换一种安装方式. 不是直接点开安装,如图所示打开命令提示符: 使用msiexec / ...
- Shiro身份认证-JdbcRealm
Subject 认证主体 Subject认证主体包含两个信息 Principals : 身份,可以是用户名.邮箱.手机号等,用来标识一个登录主体身份. Credentials : 凭证,常见有密码,数 ...