主席树 ---- CodeForces - 813E(主席树,固定一端去考虑情况)
第一道主席树题目。
题意:给定N个数,以及Q个询问,每个询问给出[L,R] 现在问在这个区间选最多的数,使得每个数出现次数不能大于K,强制在线。
主席树每个节点维护的是该位置上的数是否是k之内的数
这道题和贝贝的项链那道题特别像对于区间问题我没可以先考虑一端r,假如说每个数个数不超过k,我们一定是从先最靠r的k个数。如果一个数它出现的次数超过k那么我们就再前面那个版本删掉第一个数位置再把k+1个数插进去
#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define sfx(x) scanf("%lf",&x)
#define sfxy(x,y) scanf("%lf%lf",&x,&y)
#define sdx(x) scanf("%d",&x)
#define sdxy(x,y) scanf("%d%d",&x,&y)
#define pfx(x) printf("%.0f\n",x)
#define pfxy(x,y) printf("%.6f %.6f\n",x,y)
#define pdx(x) printf("%d\n",x)
#define pdxy(x,y) printf("%d %d\n",x,y)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 1e5+10, mod = 10007;
const double eps = 1e-10;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
inline LL read()
{LL f=1,s=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();return s*f;
}
struct node {int l,r;int cnt;
}tree[N * 40];
int count[N],a[N];
int root[N], idx;
queue <int> la[N];
int n, k;
inline int build(int l, int r)
{int now = ++ idx;if(l == r) return now;tree[now].l = build(l,mid);tree[now].r = build(mid+1,r);return now;
}inline int insert(int l, int r, int pre, int val, int pos)
{int now = ++ idx;tree[now] = tree[pre];if(l == r){tree[now].cnt += val;return now;}if(pos <= mid)tree[now].l = insert(l,mid,tree[pre].l,val,pos);else tree[now].r = insert(mid+1,r,tree[pre].r,val,pos);tree[now].cnt = tree[tree[now].l].cnt + tree[tree[now].r].cnt;return now;
}inline int query(int l, int r, int posl, int root)
{if(l == r) return tree[root].cnt;if(posl <= mid) return query(l,mid,posl,tree[root].l) + tree[tree[root].r].cnt;else return query(mid+1,r,posl,tree[root].r);
}int main()
{n = read(), k = read();_for(i,1,n+1) a[i] = read();root[0] = build(1,n);_for(i,1,1+n){la[a[i]].push(i);//存储每个数字出现的位置if(++ count[a[i]] > k)//如果这个数字已经出现超过k{int t = insert(1,n,root[i - 1],-1,la[a[i]].front());//把第一次出现的位置那里删掉root[i] = insert(1,n,t,1,i);//在新位置插入la[a[i]].pop();//把队头踢出}else root[i] = insert(1,n,root[i - 1],1,i);}int last = 0;int m, rl, rr;m = read();while(m --){int l, r;l = read(), r = read();rl = (l + last) % n + 1;rr = (r + last) % n + 1;if(rl > rr) swap(rl,rr);
// cout << rl << " " << rr << endl;last = query(1,n,rl,root[rr]);printf("%d\n",last);}return 0;}
主席树 ---- CodeForces - 813E(主席树,固定一端去考虑情况)相关推荐
- 主席树——多棵线段树的集合
主席树: (不要管名字) 我们有的时候,会遇到很多种情况,对于每一种情况,都需要通过线段树的操作实现. 碰巧的是,相邻两种情况下的线段树的差异不大.(总体的差异次数是O(N)级别的,均摊就是O(常数) ...
- 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解
P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...
- COGS-257-动态排名系统-树状数组+主席树
描述 给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作: 1.查询A[i],A[i+1],A[i+2],...,A[j](1<=i< ...
- P3834 【模板】可持久化线段树 1(主席树)
传送门 如标题,主席树模板 稍微介绍一下主席树.. 主席树是很多个线段树的结合体 利用了单点修改不会更新太多节点的结论(反正这一题是这样..),后一个线段树借用前面线段树的节点,而对于更新的节点才开一 ...
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
- 线。段。树--树状数组-主席树
简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...
- CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)
题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...
最新文章
- TF版本升级问题:成功解决AttributeError: module tensorflow has no attribute mul
- CentOS安装KVM步骤虚拟机,绝对实用!
- 疯狂动物消消乐html5游戏在线玩,疯狂动物消消乐免费
- 科技部:基础研究十年行动方案将制定,支持冷门学科等发展
- Python框架篇之Django(基本流程、命令行、配置文件)
- oracle 日志解析工具,Oracle logminer 日志分析工具使用
- 在HTML中添加图片阴影,html – 如何在CSS中为图像添加内部阴影[复制]
- 大厂员工涌入外包:中年失业,外包已是我最好的选择
- 哪种编程语言好?大神为你分析 Go、Java、C、C++ 等主流编程语言
- 基于C++实现考试报名系统
- 用python画卡通图_需要用Python和OpenCV制作一张卡通漫画版的图片
- 路由工作原理+DHCP+静态路由配置
- 提高转化率的 3 个客户引导最佳实践
- 用canvas画一个炫酷的粒子动画倒计时
- 【TA-霜狼_may-《百人计划》】图形3.7.2 command buffer简
- 棋盘效应(Checkerboard Artifacts)
- web项目打war包方法 两步解决(极其简单方便)
- Android 使用MediaPlayer播放本地raw资源超简单实现点击播放效果
- 树莓派4B 声音传感器DO模块
- 从实验到投稿录用的一次经历(历时小半年)