牛客多校5 - Interval(主席树)
题目链接:点击查看
题目大意:给出一个长度为 n 的数列 a ,规定函数 f( l , r ) = a[ l ] & a[ l + 1 ] & ... & a[ r ] ,在规定set s( l , r ) = { f( a , b ) | l <= a <= b <= r } ,对于 q 次询问,每次询问回答 s( l , r )
题目分析:根据位运算的性质,可以知道每一位都是相互独立的,再根据与运算的性质,可以知道,当左端点或者右端点的其中一个端点在固定之后,不同的 f( l , r ) 最多有 logn 个,因为假设当前端点二进制下全部为 1 ,因为 f 函数是需要取连续的一段子数列,所以每次减少一个 1 ,最多减少 logn 次在二进制下就变为 0 了
假设数列为 a[ 1 ] , a[ 2 ] , a[ 3 ] ... a[ n - 1 ] , a[ n ] ,对于一个位置 i 来说,记录其全部的后缀,也就是:
- a[ 1 ] & a[ 2 ] & ... & a[ i - 1 ] & a[ i ]
- a[ 2 ] & a[ 3 ] & ... & a[ i - 1 ] & a[ i ]
- a[ 3 ] & a[ 4 ] & ... & a[ i - 1 ] & a[ i ]
- ......
- a[ i - 1 ] & a[ i ]
- a[ i ]
虽然一共有 i 个后缀,但根据上一段分析的性质,当固定了右端点 i 后,最多只会有 logn 个不同的数字
到此为止,剩下的就可以用主席树统计区间有多少个不同的数字的那个模板来实现了
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;unordered_map<int,int>mp,temp,pre;struct Node
{int l,r;int sum;
}tree[N*150];int cnt,root[N];void init()
{root[0]=0;tree[0].l=tree[0].r=tree[0].sum=0;cnt=1;
}void update(int pos,int &k,int l,int r,int val)
{tree[cnt++]=tree[k];k=cnt-1;tree[k].sum+=val;if(l==r)return;int mid=l+r>>1;if(pos<=mid)update(pos,tree[k].l,l,mid,val);elseupdate(pos,tree[k].r,mid+1,r,val);
}int query(int rt,int l,int r,int L,int R)//[l,r]:目标区间,[L,R]:当前区间
{if(R<l||L>r)return 0;if(L>=l&&R<=r)return tree[rt].sum;int mid=L+R>>1;return query(tree[rt].l,l,r,L,mid)+query(tree[rt].r,l,r,mid+1,R);
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);init();int n;scanf("%d",&n);for(int i=1;i<=n;i++){root[i]=root[i-1];int x;scanf("%d",&x);mp[x]=i;temp.clear();for(auto it=mp.begin();it!=mp.end();it++){int fir=it->first,sec=it->second;temp[x&fir]=max(temp[x&fir],sec);}for(auto it=temp.begin();it!=temp.end();it++){int fir=it->first,sec=it->second;if(pre[fir])update(pre[fir],root[i],1,n,-1);pre[fir]=sec;update(pre[fir],root[i],1,n,1);}mp=temp;}int q,ans=0;scanf("%d",&q);while(q--){int l,r;scanf("%d%d",&l,&r);l=(l^ans)%n+1;r=(r^ans)%n+1;if(l>r)swap(l,r);printf("%d\n",ans=query(root[r],l,r,1,n));}return 0;
}
牛客多校5 - Interval(主席树)相关推荐
- 牛客网 Cutting Bamboos 【主席树+二分】
题意:给你n棵树,每棵树的高度是Hi,q次询问相互独立,每次询问{ l, r, x, y }, 就是在区间[l, r] 里的树需要y次全部砍完,每次砍可以选择一个高度,高于的地方全部砍掉,且要求每次砍 ...
- 牛客多校5 - Graph(字典树+分治求最小生成树)
题目链接:点击查看 题目大意:给出一棵树,每条边都有一个权值,每次操作可以删除任意一条边或者增加任意权值的一条边,现在可以执行数次操作,不过任何时间都要满足以下两个条件: n 个点互相连通 所有环的权 ...
- 牛客多校2 - Interval(网格图最大流转换为对偶图最短路)
题目链接:点击查看 题目大意:给出一个区间,初始时为 [ 1 , n ] ,每次操作可以将 [ l , r ] 变为下面的其中之一: [ l + 1 , r ] [ l , r - 1 ] [ l - ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 2019牛客多校训练第十场F Popping Balloons
2019牛客多校训练第十场F Popping Balloons 题意:二维平面内给你若干个点,然后你可以在x轴和y轴分别射三枪(每一枪的间隔是R),问最多能射掉多少气球. 题解:贪心.这个应该只能算作 ...
- python字符串去重及排序 牛客_2018牛客多校第一场 D.Two Graphs
题意: n个点,m1条边的图E1,n个点,m2条边的图E2.求图E2有多少子图跟图E1同构. 题解: 用STL的全排列函数next_permutation()枚举映射.对于每一种映射枚举每一条边判断合 ...
- 2020 牛客多校第一场
2020 牛客多校第一场 A. B-Suffix Array 后缀数组的思想:倍增+桶排序的方式找出一串连续序列后缀的大小.虽说正常使用的时候都是字典序,但是只要修改排序方式,也能够达到一个类似的&q ...
- 牛客多校三 B Black and white
牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...
- 牛客小白9 换个角度思考(离线+树状数组)
title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...
最新文章
- 这么详细的Python matplotlib 绘制图形 还不赶紧收藏
- 秒杀系统架构优化思路
- DiscuzX2.5视频教程
- C语言数组中两个数字之间的最大差的算法(附完整源码)
- 最新ui设计趋势_10个最新且有希望的UI设计趋势
- 2019.01.29【NOIP普及组】模拟赛C组总结
- SpringBoot入门二
- centos 5.x 大硬盘管理
- 基于Scala版本的TMDB大数据电影分析项目
- matlab开环传递函数 求单位负反馈的系统传递函数,已知负反馈控制系统的开环传递函数为...
- 怎么将mp3音乐转成ogg格式
- 微信云控系统的实现原理,微信云控系统源码之服务器推送的实现及其核心代码
- 学妹要的20道Redis面试题,在这也分享一下(转载自程序羊羊哥)
- ansys18安装以后打不开_ansys18.0安装过程及常见问题解决方案【图文】
- idea中module项目没有蓝色小方块问题
- 用CH340给STM32C8T6和野火stm32F103Mini板下载程序需要注意的三个问题
- Dots Animation
- MDN Web Docs
- Jmeter安装配置详细教程
- 眼动数据分析(基于EyeLink眼动仪数据)