题目链接:点击查看

题目大意:给出一个长度为 nnn 的数列和一个整数 kkk,现在有 qqq 次询问,每次询问给出一个区间 [l,r][l,r][l,r],设 cnticnt_icnti​ 为数字 iii 在区间内出现的次数,需要输出 ∑min(cnti,k)\sum min(cnt_i,k)∑min(cnti​,k),其中 iii 是区间内所有出现过的数字,所有询问强制在线

题目分析:看到强制在线加上区间问题不难想到主席树,有个思维点必须要想到才行,一开始我想的是对于每个种类的数字维护一个前缀和,然后对于每个询问按照出现次数大于等于 kkk 和小于 kkk 分类讨论,很可惜复杂度不是很合适

所以这个题需要想到,应该对于每个数字单独讨论,假设 bib_ibi​ 是 aia_iai​ 后面第 kkk 次出现 aia_iai​ 的位置,那么假设需要询问的区间为 [l,r][l,r][l,r],不难看出只有当 bi>rb_i>rbi​>r 时,才可以选择 aia_iai​,否则会与 bib_ibi​ 位置的数字冲突,所以我们用主席树维护一下 bib_ibi​,每次查询只需要输出区间 [l,r][l,r][l,r] 内有多少个 bi>rb_i>rbi​>r 即可

代码:

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#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;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int a[N],b[N];
vector<int>node[N];
struct Node
{int l,r;int sum;
}tree[N*20];
int cnt,root[N];
void init()
{root[0]=0;tree[0].l=tree[0].r=tree[0].sum=0;cnt=1;
}
void update(int num,int &k,int l,int r)
{tree[cnt++]=tree[k];k=cnt-1;tree[k].sum++;if(l==r)return;int mid=(l+r)>>1;if(num<=mid)update(num,tree[k].l,l,mid);elseupdate(num,tree[k].r,mid+1,r);
}
int query(int i,int j,int L,int R,int l,int r)//[L,R]:当前区间,[l,r]:目标区间
{if(L>r||R<l)return 0;if(L>=l&&R<=r)return tree[j].sum-tree[i].sum;int mid=(L+R)>>1;return query(tree[i].l,tree[j].l,L,mid,l,r)+query(tree[i].r,tree[j].r,mid+1,R,l,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,k;read(n),read(k);for(int i=1;i<=n;i++)read(a[i]);for(int i=n;i>=1;i--){if((int)node[a[i]].size()<k)b[i]=n+1;elseb[i]=node[a[i]][(int)node[a[i]].size()-k];node[a[i]].push_back(i);}for(int i=1;i<=n;i++){root[i]=root[i-1];update(b[i],root[i],1,n+1);}int ans=0,m;read(m);while(m--){int l,r;read(l),read(r);l=(l+ans)%n+1;r=(r+ans)%n+1;if(l>r)swap(l,r);write(ans=query(root[l-1],root[r],1,n+1,r+1,n+1));puts("");}return 0;
}

CodeForces - 813E Army Creation(主席树+思维)相关推荐

  1. Codeforces Round #716 (Div. 2) D. Cut and Stick 主席树 + 思维

    传送门 文章目录 题意: 思路: 题意: 给你个长为nnn的数组aaa,定义好的区间为这个区间中每个数出现的次数≤⌈n2⌉\le \left \lceil \frac{n}{2} \right \rc ...

  2. CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)

    题目链接:点击查看 题目大意:给出 n 个数组成的数组 a ,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 中所有元素的最小公倍数,强制在线 题目分析:首先考虑多个数的最小公倍数该如何 ...

  3. 牛客 - 牛牛的mex(主席树/思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 的 mex 题目分析:算是一道比较经典的题目了吧,先说一般做法,一般做法是 nl ...

  4. HDU - 5919 Sequence II(主席树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 m 次询问,每次询问给出一个区间 [ l , r ] ,问区间 [ l , r ] 内首次出现的数字的位置的中位数 题目分析:题 ...

  5. Codeforces 1108 E2(线段树+思维)

    传送们 题意: 给你一个长度为nnn的数列bbb.以及mmm个区间. 你可以选取111个或多个这样的区间aia_iai​,使得令区间aia_iai​所对应的所有值bib_ibi​都减111.你最终要使 ...

  6. CodeForces - 1252G Performance Review(线段树+思维)

    题目链接:点击查看 题目大意:在一个公司中初始时有 n 个人,每个人都有一个能力值,题目保证每个能力值都不相等,第 i 天会开除能力值最低的 r[ i ] 个人,并且会新加入 r[ i ] 个人,分别 ...

  7. Educational Codeforces Round 22 E. Army Creation 【主席树】

    题目链接 题意 给出一个序列a[1..n]a[1..n]a[1..n],mmm 次询问区间 [L,R][L,R][L,R] 可以选多少个数(相同的数最多选 KKK 个),强制在线 题解 先求出每个 i ...

  8. 主席树 ---- CodeForces - 813E(主席树,固定一端去考虑情况)

    第一道主席树题目. 题意:给定N个数,以及Q个询问,每个询问给出[L,R] 现在问在这个区间选最多的数,使得每个数出现次数不能大于K,强制在线. 主席树每个节点维护的是该位置上的数是否是k之内的数 这 ...

  9. Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,qqq个询问,每次询问[l,r][l,r][l,r]内的lcmlcmlcm是多少,对1e9+71e9+71e9+7取模. n ...

最新文章

  1. 75道常见AI面试题,看看你的知识盲点在哪?(附解析)
  2. 【Linux】一步一步学Linux——nisdomainname命令(171)
  3. 如何改变XCode的默认设置
  4. 距离矢量路由算法的java代码_八大排序算法比较(附Java代码)
  5. 漫步数理统计二十九——函数期望
  6. 转载-C#委托之多播委托( 二)
  7. 常用linux命令及图解(实践文档,小白都可以看得懂)
  8. 金蝶K3系统的网络服务端口
  9. 堪萨斯大学计算机硕士,堪萨斯大学计算机专业设置及申请条件汇总 你get到了吗?...
  10. linux服务器网卡极限速率,linux下简单限制网卡速度
  11. 总结解决 No suitable driver found for jdbc:mysql//localhost:3306/ 问题的解决方案,各种情况都已囊括,希望可以帮助到有需要的各位
  12. 惠新宸php教程_【转载】惠新宸:PHP在百度的应用现状及展望
  13. 辨大势定内局,解析新时代下的企业新刚需
  14. 以太网,令牌网,FDDI,ATM是什么?有什么区别?
  15. Springboot 基于CXF构建WebService服务
  16. 本地缓存、服务器缓存、分布式缓存介绍
  17. Yura and Developers
  18. python linspace
  19. 关于Houdini中体积SDF,fog,volume,vdb的一些理解和区别
  20. 推荐一款ios软件叫你出我猜

热门文章

  1. java魔法堂_Java魔法堂:调用外部程序
  2. CORS 跨域-同源策略
  3. RabbitMq queue异常导致consumer停止
  4. 高仿真的类-BeanWrapper
  5. SpringMVC的请求-文件上传-单文件上传的代码实现2
  6. 方法级别权限控制-基本介绍与JSR250注解使用
  7. 权限操作-springSecurity概述及快速入门步骤分析
  8. Nginx_负载均衡配置讲解
  9. 基于multisim的fm调制解调_高通二代5G调制解调器骁龙X55实现7Gbps高速率,透露5G三大关键点...
  10. 作品分享_作品分享 | No. 1