zoukankan      html  css  js  c++  java
  • bzoj 3261: 最大异或和

    可持久化trie模板。。。。

    错误记录:

    没有在第0棵树中插入0,WA;

    此题没有保证l,r合法,所以应该最好要判一下的。。。。并且按我这个写,是要访问到-1元素下标的树的(这个是真正的空树,0都没有),要所有下标+1才对(然而没有改也A掉了?)

    改的时候要小心再小心。。。。(因此WA了无数发)

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 namespace Trie
     5 {
     6 const int l2n=24;
     7 int lft[40];
     8 int sz[16000100],ch[16000100][2];
     9 int x,mem;
    10 void init()
    11 {
    12     int i;lft[0]=1;
    13     for(i=1;i<=l2n;i++)  lft[i]=lft[i-1]<<1;
    14 }
    15 inline void cp(int &num)
    16 {
    17     int t=num;num=++mem;sz[num]=sz[t];ch[num][0]=ch[t][0];ch[num][1]=ch[t][1];
    18 }
    19 void _ins(int p,int &num)
    20 {
    21     cp(num);sz[num]++;
    22     if(p>=0)    _ins(p-1,ch[num][!!(x&lft[p])]);
    23 }
    24 void ins(int d,int &num)    {x=d;_ins(l2n-1,num);}
    25 int que(int x,int r1,int r2)
    26 {
    27     int ans=0,i;bool t;
    28     for(i=l2n-1;i>=0;i--)
    29     {
    30         t=x&lft[i];
    31         if(sz[ch[r2][!t]]-sz[ch[r1][!t]])   ans|=lft[i],r2=ch[r2][!t],r1=ch[r1][!t];
    32         else    r2=ch[r2][t],r1=ch[r1][t];
    33     }
    34     return ans;
    35 }
    36 }
    37 using Trie::ins;using Trie::que;
    38 //找到一个位置l<=p<=r,使得sum[p-1]^(sum[N]^x)最大
    39 int rt[600100];
    40 char tmp[10];
    41 int n,m,a[600100];
    42 int main()
    43 {
    44     int i,l,r,x;
    45     Trie::init();
    46     scanf("%d%d",&n,&m);
    47     ins(0,rt[1]);
    48     for(i=1;i<=n;i++)
    49     {
    50         scanf("%d",&a[i]);a[i]^=a[i-1];
    51         rt[i+1]=rt[i];ins(a[i],rt[i+1]);
    52     }
    53     while(m--)
    54     {
    55         scanf("%s",tmp);
    56         if(tmp[0]=='A')
    57         {
    58             scanf("%d",&a[++n]);a[n]^=a[n-1];
    59             rt[n+1]=rt[n];ins(a[n],rt[n+1]);
    60         }
    61         else if(tmp[0]=='Q')
    62         {
    63             scanf("%d%d%d",&l,&r,&x);l=max(l,1);r=min(r,n);
    64             printf("%d
    ",que(a[n]^x,rt[l-1],rt[r]));
    65         }
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    C#写入系统日志(日志位置)
    vue element enter事件
    C#记一次配置文件的坑
    C#简单解决winfrom窗体打开时候闪动
    C#语言切换
    C#textbox允许换行
    C#中窗体边框隐藏
    C#背景图片自适应
    IOC的实现原理—反射与工厂模式
    终生学习
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9014909.html
Copyright © 2011-2022 走看看