• 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);
    }
    
  • 相关阅读:
    C语言文法修改
    C语言文法
    词法分析程序实验报告
    php设置http响应头和数据库查询字符集编码
    提交form前先使用JS进行验证
    iOS 移动端清除按钮的默认样式
    innerText与textContent的异同
    JS事件应用
    docker redis安装
    cmder的快捷键
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/13445107.html
Copyright © 2020-2023  润新知