【BZOJ4103】【Thusc2015】异或运算 可持久Trie

原创 2016年06月01日 11:08:08

现在再来切是不是有点晚QAQ

题目大意是给定两个正整数序列。规定矩阵(异或运算),每个询问求某个子矩阵内第k大的值。其中

注意到N和Q比较小,所以就是把序列B建成可持久Trie,然后同时跑A中的若干个数。。。

如果想不清楚可以先考虑当N=1,也就是A是一个数的情况,然后再考虑如何合并。

/**************************************************************
    Problem: 4103
    User: cqyzhb
    Language: C++
    Result: Accepted
    Time:5364 ms
    Memory:126804 kb
****************************************************************/
 
#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 300005
void _read(int &x)
{
    x=0; char ch=getchar(); bool flag=false;
    while(ch<'0' || ch>'9'){if(ch=='-')flag=true; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} if(flag)x=-x; return ;
}
int N,M,A[1005],B[MAXN],sum[32][1005],np;
int chi[MAXN*35][2],sz[MAXN*35],rt[MAXN];
void Insert(int anc,int &rt,int x)
{
    rt=++np; int now=np; sz[now]=sz[anc]+1;;
    for(int i=30;i>=0;i--)
    {
        if((1<<i)&x)
        {
            chi[now][0]=chi[anc][0]; chi[now][1]=++np; sz[chi[now][1]]=sz[chi[anc][1]]+1; 
            now=chi[now][1]; anc=chi[anc][1];
        }
        else
        {
            chi[now][1]=chi[anc][1]; chi[now][0]=++np; sz[chi[now][0]]=sz[chi[anc][0]]+1; 
            now=chi[now][0]; anc=chi[anc][0];
        }
    }
    return ;
}
void Init()
{
    _read(N);_read(M);
    for(int i=1;i<=N;i++)_read(A[i]); for(int i=1;i<=M;i++)_read(B[i]);
    rt[0]=0; np=0; sz[0]=0;
    for(int i=1;i<=M;i++)Insert(rt[i-1],rt[i],B[i]);
    for(int i=0;i<=30;i++)
    {
        sum[i][0]=0;
        for(int j=1;j<=N;j++)
        {
            if(A[j]&(1<<i))sum[i][j]=sum[i][j-1]+1;
            else sum[i][j]=sum[i][j-1];
        }
    }
    return ;
}
int tmp[1005][2];
void query(int anc,int now,int L,int R,int k)
{
    int ct=0,t=0,ans=0;
    for(int i=L;i<=R;i++)
    {
        tmp[i][0]=anc; tmp[i][1]=now;
    }
    for(int i=30;i>=0;i--)
    {
        t=0;
        for(int j=L;j<=R;j++)
        {
            if(A[j]&(1<<i))
            {
                t+=sz[chi[tmp[j][1]][1]]-sz[chi[tmp[j][0]][1]];
            }
            else
            {
                t+=sz[chi[tmp[j][1]][0]]-sz[chi[tmp[j][0]][0]];
            }
        }
        if(ct+t>=k) // 答案的这一位是0
        {
            for(int j=L;j<=R;j++)
            {
                if(A[j]&(1<<i)) // 向1那边走 
                {
                    tmp[j][0]=chi[tmp[j][0]][1];tmp[j][1]=chi[tmp[j][1]][1];
                }
                else
                {
                    tmp[j][0]=chi[tmp[j][0]][0];tmp[j][1]=chi[tmp[j][1]][0];
                }
            }           
        }
        else // 1
        {
            ans+=(1<<i); ct+=t;
            for(int j=L;j<=R;j++)
            {
                if(A[j]&(1<<i)) // 向0那边走 
                {
                    tmp[j][0]=chi[tmp[j][0]][0];tmp[j][1]=chi[tmp[j][1]][0];
                }
                else
                {
                    tmp[j][0]=chi[tmp[j][0]][1];tmp[j][1]=chi[tmp[j][1]][1];
                }
            }
        }
    }
    printf("%d\n",ans);
    return ;
}
void work()
{
    int u,d,l,r,k,Q;
    _read(Q);
    for(int i=1;i<=Q;i++)
    {
        _read(u); _read(d); _read(l); _read(r); _read(k); k=(d-u+1)*(r-l+1)+1-k;
        query(rt[l-1],rt[r],u,d,k);     
    }
    return ;
}
int main()
{
//  freopen("in.txt","r",stdin);
    Init();
    work();
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

BZOJ 4103 [Thu Summer Camp 2015]异或运算 可持久化Trie

对矩阵求第k大xor值。 注意到数据范围长宽严重失调(误 所以对于每列维护可持久化Trie。 然后查询就由BZOJ 3261推广一下就好啦。 #include #include #incl...

bzoj4103【THUSC2015】异或运算

可持久化Trie树

BZOJ4103——[Thu Summer Camp 2015]异或运算

1、题意:给定长度为n的数列X={x1,x2,…,xn}和长度为m的数列Y={y1,y2,…,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i∈[u,d],j∈[...

BZOJ 4103~4105 THUSC2015 题解

T1:BZOJ 4013 xor 题目大意:给定一个长度为nn的数列aa和一个长度为mm的数列bb,给定矩阵AA,令Ai,j=ai⊕bjA_{i,j}=a_i\oplus b_j,qq次询问某个子矩...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年06月03日 17:55
  • 3247

4103: [Thu Summer Camp 2015]异或运算

4103: [Thu Summer Camp 2015]异或运算Time Limit: 20 Sec Memory Limit: 512 MB Submit: 566 Solved: 302 ...

4103: [Thu Summer Camp 2015]异或运算

题面:给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j...

bzoj-4103 异或运算

题意: 给出一个长度为n的a数组,和一个长度为m的b数组; 现有一矩阵A[i][j]=a[i] xor b[j]; q次求矩阵中某一块的第k大值; n 题解: 又是一个k大值问题,...

bzoj4104【THUSC2015】解密运算

一道神奇的乱搞题

【BZOJ4104】【Thusc2015】解密运算

这些XJB算法的题竟然是小夏令营题想想就好可怕TAT(你萌不知道什么是XJB算法???) 讲道理这道题的标程虽然奇短无比但是想法还是蛮有启发意义的。。。我试着口胡一下原理QAQ 先考虑无元素重复的情况...

BZOJ 3261 最大异或和 可持久化Trie

前两天被带修改的可持久化线段树给搞毛了,弃疗了QaQ,数据结构搞累了准备换一换其它的。然而,还是遇到了数据结构。0.0 可持久化Trie——如果理解了主席树这个也就很好理解了,建树的方式是相同的,对...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ4103】【Thusc2015】异或运算 可持久Trie
举报原因:
原因补充:

(最多只允许输入30个字)