【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
4103: [Thu Summer Camp 2015]异或运算
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 474 Solved: 258Description
给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij。
Input
第一行包含两个正整数n,m,分别表示两个数列的长度
第二行包含n个非负整数xi第三行包含m个非负整数yj第四行包含一个正整数p,表示询问次数随后p行,每行均包含5个正整数,用来描述一次询问,每行包含五个正整数u,d,l,r,k,含义如题意所述。Output
共p行,每行包含一个非负整数,表示此次询问的答案。
Sample Input
3 3
1 2 4
7 6 5
3
1 2 1 2 2
1 2 1 3 4
2 3 2 3 4Sample Output
6
5
1HINT
对于100%的数据,0<=Xi,Yj<2^31,
1<=u<=d<=n<=1000,1<=l<=r<=m<=300000,1<=k<=(d-u+1)*(r-l+1),1<=p<=500Source
【分析】
要膜一膜Po姐:
好了,这个是。。。异或运算。每一位的运算都和下一位无关的。
当n=1,你只要根据m个数建一个可持久化TRIE。然后询问的时候就试着填1看看足不足k什么的。
跟平时不一样的是,现在你是手上拿着个a1之后询问的,你只要每次看一看a1这一位是什么,然后判断填1还是0,如果a1这一位是1就要0、1互换一下嘛。。
然后n不等于1,其实也很小,相当于1000个TRIE?当然是不用建1000个TRIE的【你也建不了吧?
只是你现在手上拿着1000个ai,一起询问什么的。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 1010
#define Maxm 300010
#define Maxd 30 int a[Maxn]; int rt[Maxm],tot=;
struct node {int lc,rc,cnt;}tr[Maxm*]; void add(int id,int x)
{
rt[id]=++tot;int y=rt[id-];
int nw=rt[id];
for(int i=Maxd;i>=;i--)
{
int ind=x>>i;x&=(<<i)-;
if(!ind)
{
tr[nw].lc=++tot;
tr[tot].cnt=tr[tr[y].lc].cnt+;
tr[nw].rc=tr[y].rc;
nw=tr[nw].lc;y=tr[y].lc;
}
else
{
tr[nw].rc=++tot;
tr[tot].cnt=tr[tr[y].rc].cnt+;
tr[nw].lc=tr[y].lc;
nw=tr[nw].rc;y=tr[y].rc;
}
}
} int nl[Maxn],nr[Maxn];
int query(int ll,int rr,int l,int r,int k)
{
int ans=;
// l=rt[l-1];r=rt[r];
for(int i=ll;i<=rr;i++) nl[i]=rt[l-],nr[i]=rt[r];
for(int i=Maxd;i>=;i--)
{
int x=;
for(int j=ll;j<=rr;j++)
{
int y=a[j]&(<<i);y>>=i;
if(y==) x+=tr[tr[nr[j]].lc].cnt-tr[tr[nl[j]].lc].cnt;
else x+=tr[tr[nr[j]].rc].cnt-tr[tr[nl[j]].rc].cnt;
}
if(x>=k)
{
l=tr[l].lc;r=tr[r].lc;
for(int j=ll;j<=rr;j++)
{
int y=a[j]&(<<i);y>>=i;
if(y==) nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc;
else nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc;
}
}
else
{
k-=x;
ans|=<<i;
for(int j=ll;j<=rr;j++)
{
int y=a[j]&(<<i);y>>=i;
if(y==) nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc;
else nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc;
}
}
}
return ans;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int j=;j<=m;j++)
{
int b;
scanf("%d",&b);
add(j,b);
}
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
int ll,rr,l,r,k;
scanf("%d%d%d%d%d",&ll,&rr,&l,&r,&k);
k=(rr-ll+)*(r-l+)-k+;
printf("%d\n",query(ll,rr,l,r,k));
}
return ;
}
最近已经RE至死。。。
数组开少了2。。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 1010
#define Maxm 300010
#define Maxd 30 int a[Maxn]; int rt[Maxm],tot=;
struct node {int lc,rc,cnt;}tr[Maxm*]; void add(int id,int x)
{
rt[id]=++tot;int y=rt[id-];
int nw=rt[id];
for(int i=Maxd;i>=;i--)
{
int ind=x>>i;x&=(<<i)-;
if(!ind)
{
tr[nw].lc=++tot;
tr[tot].cnt=tr[tr[y].lc].cnt+;
tr[nw].rc=tr[y].rc;
nw=tr[nw].lc;y=tr[y].lc;
}
else
{
tr[nw].rc=++tot;
tr[tot].cnt=tr[tr[y].rc].cnt+;
tr[nw].lc=tr[y].lc;
nw=tr[nw].rc;y=tr[y].rc;
}
}
} int nl[Maxn],nr[Maxn];
int query(int ll,int rr,int l,int r,int k)
{
int ans=;
// l=rt[l-1];r=rt[r];
for(int i=ll;i<=rr;i++) nl[i]=rt[l-],nr[i]=rt[r];
for(int i=Maxd;i>=;i--)
{
int x=;
for(int j=ll;j<=rr;j++)
{
int y=a[j]&(<<i);y>>=i;
if(y==) x+=tr[tr[nr[j]].lc].cnt-tr[tr[nl[j]].lc].cnt;
else x+=tr[tr[nr[j]].rc].cnt-tr[tr[nl[j]].rc].cnt;
}
if(x>=k)
{
l=tr[l].lc;r=tr[r].lc;
for(int j=ll;j<=rr;j++)
{
int y=a[j]&(<<i);y>>=i;
if(y==) nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc;
else nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc;
}
}
else
{
k-=x;
ans|=<<i;
for(int j=ll;j<=rr;j++)
{
int y=a[j]&(<<i);y>>=i;
if(y==) nl[j]=tr[nl[j]].rc,nr[j]=tr[nr[j]].rc;
else nl[j]=tr[nl[j]].lc,nr[j]=tr[nr[j]].lc;
}
}
}
return ans;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int j=;j<=m;j++)
{
int b;
scanf("%d",&b);
add(j,b);
}
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
int ll,rr,l,r,k;
scanf("%d%d%d%d%d",&ll,&rr,&l,&r,&k);
k=(rr-ll+)*(r-l+)-k+;
printf("%d\n",query(ll,rr,l,r,k));
}
return ;
}
2017-04-08 14:47:45
【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)的更多相关文章
- [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...
- 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie
我们观察数据:树套树 PASS 主席树 PASS 一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
- 【bzoj4103】[Thu Summer Camp 2015]异或运算 可持久化trie树
Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...
- bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)
内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi ...
- bzoj4103: [Thu Summer Camp 2015]异或运算
对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+ 然而不用二分,直接1000个点一起在树上 ...
- BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出 ...
随机推荐
- JavaScript:详解 Base64 编码和解码
Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...
- 谈谈"求线段交点"的几种算法(js实现,完整版)
"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. ...
- R1(上)—R关联规则分析之Arules包详解
Arules包详解 包基本信息 发布日期:2014-12-07 题目:挖掘关联规则和频繁项集 描述:提供了一个表达.处理.分析事务数据和模式(频繁项集合关联规则)的基本框架. URL:http://R ...
- virtual和abstract的区别和联系
壹. 相同 他们有些相似.有些场景用哪个都行! 1. 修饰父类.让子类重写 virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 2. 都用必须public 如 ...
- 原 jQuery中document的ready和load事件的区别?
概述: 大家在工作中用jQuery的时候一定会在使用之前这样: 1 2 3 4 5 6 7 8 //document ready $(document).ready(function(){ ...
- 一款已上市MMO手游地图同步方案总结
1. 客户端地图格子的相关知识 在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲染的角色和光效,都 ...
- webgote的例子(6)SQL注入(盲注)
SQL Injection - Blind (WS/SOAP) 本期演示的是盲注的手法.有些网站在与数据库交互的地方进行了很好的修饰,将报错的语句进行修改,即使你找到了注入点也无法下手拿数据,这个时候 ...
- pyQt: eg3
import sys import urllib2 from PyQt4 import QtCore from PyQt4 import QtGui class Form(QtGui.QDialog) ...
- HBase原理解析(转)
本文属于转载,原文链接:http://www.aboutyun.com/thread-7199-1-1.html 前提是大家至少了解HBase的基本需求和组件. 从大家最熟悉的客户端发起请求开始讲 ...
- java基础14 多态(及关键字:instanceof)
面向对象的三大特征: 1.封装 (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承 ...
