zoukankan      html  css  js  c++  java
  • [LUOGU]P4098[HEOI2013]ALO

    BZOJ上的权限题,流下了贫穷的泪水。。。
    可持久化trie的题。
    一开始zz了,看错了题,以为是要把所有的宝石缩起来,后来仔细一看好像只缩一次。。。昨天刷了一晚上的语文病句题白做了。。。
    这样的话就可以枚举以每个点为次大值,求出可以异或的区间,用可持久化trie做。维护可以异或的区间可以用set求。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <set>
    #include <cstring>
    using namespace std;
    int n,a[50005],b[50005],k,rt[50005*32],ch[50005*32][2],siz[50005*32],tot;
    set<int>s;set<int>::iterator it1,it2;
    bool cmp(int x,int y) {return a[x]>a[y];}
    void insert(int &k,int pre,int val) {
    	k=++tot;int tmp=k;
    	for(int i=30; ~i; i--) {
    		bool tag=val&(1<<i);
    		ch[tmp][0]=ch[pre][0],ch[tmp][1]=ch[pre][1];
    		pre=ch[pre][tag],tmp=ch[tmp][tag]=++tot;
    		siz[tmp]=siz[pre]+1;
    	}
    }
    int query(int u,int v,int val) {
    	int tmp=0;
    	for(int i=30; ~i; i--) {
    		bool tag=val&(1<<i);
    		if(siz[ch[v][tag^1]]-siz[ch[u][tag^1]]>0) tmp|=(1<<i),u=ch[u][tag^1],v=ch[v][tag^1];
    		else u=ch[u][tag],v=ch[v][tag];
    	}
    	return tmp;
    }
    int ans=-1;
    int main() {
    	scanf("%d",&n);
    	for(int i=1; i<=n; i++) scanf("%d",&a[i]),b[i]=i,insert(rt[i],rt[i-1],a[i]);
    	sort(b+1,b+1+n,cmp);
    	s.insert(n+1),s.insert(n+2),s.insert(-1),s.insert(-2);
    	for(int i=1,l,r; i<=n; i++) {
    		it1=s.lower_bound(b[i]);
    		it2=it1;
    		l=*--(--it1)+1;
    		r=*(++it2)-1;l=max(l,1),r=min(r,n);
    		s.insert(b[i]);
    		if(l>r) continue;
    		ans=max(ans,query(rt[l-1],rt[r],a[b[i]]));
    	}
    	cout<<ans;
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    Linux下查看文件和文件夹大小
    linux sort 命令详解
    Linux基础入门之网络属性配置
    Change SSH Welcome Banner on Ubuntu
    怎样修复grub开机引导(grub rescue)
    SSH内网穿透 Reverse SSH Tunneling
    安装 Zsh 及 Oh-my-zsh
    change grayscale to pseudo colouring using colormap in Matlab
    How to block a specific IP Address using UFW
    Linux下查看文件和文件夹大小
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9485945.html
Copyright © 2011-2022 走看看