zoukankan      html  css  js  c++  java
  • JZOJ 3226. 【HBOI2013】ALO

    题目

    网上自己搜

    解析

    区间异或很容易想到可持久化字典树
    但本题的关键是如何高效率求出以某个数为区间最大值时这个区间的范围
    依题我们知道区间最长可到比它第二大的位置(开区间)
    所以我们如果能找到每个数比他大的
    这个问题就迎刃而解了
    我们可以排序后从小到大算答案
    用双向链表记录前一个比他大的和后一个比他大的
    算完它就把他删掉
    并且修改之后的链表指向

    (Code)

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    
    const int N = 5e4 + 5;
    int n , a[N] , id[N] , ans , nxt[N] , pre[N] , rt[N] , size , t[30 * N][2] , sum[60 * N];
    
    inline bool cmp(int x , int y){return a[x] < a[y];}
    
    inline void update(int u , int v , int w)
    {
    	for(register int i = 30; i >= 0; i--)
    	{
    		int c = (w >> i) & 1;
    		sum[u] = sum[v] + 1;
    		t[u][c ^ 1] = t[v][c ^ 1];
    		t[u][c] = ++size;
    		u = t[u][c] , v = t[v][c];
    	}
    	sum[u] = sum[v] + 1;
    }
    
    inline int query(int u , int v , int w)
    {
    	int res = 0;
    	for(register int i = 30; i >= 0; i--)
    	{
    		int c = (w >> i) & 1 , x = sum[t[v][c ^ 1]] - sum[t[u][c ^ 1]];
    		if (x) res += 1 << i , u = t[u][c ^ 1] , v = t[v][c ^ 1];
    		else u = t[u][c] , v = t[v][c];
    	}
    	return res;
    }
    
    int main()
    {
    	scanf("%d" , &n);
    	for(register int i = 1; i <= n; i++) scanf("%d" , &a[i]) , id[i] = i , pre[i] = i - 1 , nxt[i] = i + 1;
    	nxt[n + 1] = n + 1;
    	for(register int i = 1; i <= n; i++) rt[i] = ++size , update(rt[i] , rt[i - 1] , a[i]);
    	sort(id + 1 , id + n + 1 , cmp);
    	for(register int i = 1; i <= n; i++)
    	{
    		int now = id[i] , l = max(1 , pre[pre[now]] + 1) , r = min(n , nxt[nxt[now]] - 1);
    		ans = max(ans , query(rt[l - 1] , rt[r] , a[now]));
    		pre[nxt[now]] = pre[now] , nxt[pre[now]] = nxt[now];
    	}
    	printf("%d" , ans);
    }
    
  • 相关阅读:
    [BZOJ 2653]middle
    svn提交错误
    查看当前功能地址
    后台纯代码--短信验证
    图片验证码~~~之后台生成随机数
    小程序之~~登录后台代码
    小程序登录过程简介
    小程序之~微信登录后台代码
    小程序之~~基于微信登录,后台代码
    小程序之~~短信验证
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/13445107.html
Copyright © 2011-2022 走看看