Educational Codeforces Round 22E
发布日期:2021-06-24 04:57:47 浏览次数:6 分类:技术文章

本文共 2335 字,大约阅读时间需要 7 分钟。

给你n和k,n个数,每个数范围1e5,m次查询,每次查询区间(l,r),在区间中的每个数,如果超过k次只算k次,否则算原来的次数,求总次数,强制在线

解法:线段树维护区间中每个数经过k次到达的点pos,然后其中pos<=r的就是能满足条件的加到答案上即可

因为假设原来的点是x(l<=x<=r),经过k次是pos(l<=pos<=r),那么此时我们不能同时算这两个点的贡献,所以只需要算后一个点的贡献,当pos的经过k次到达的点也<=r时,那么pos点也不能算进来,以此类推

线段树每个区间维护一个vector,vector要sort一下,然后查询lowerbound,复杂度O(nlognlogn)

//#pragma comment(linker, "/stack:200000000")//#pragma GCC optimize("Ofast,no-stack-protector")//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")//#pragma GCC optimize("unroll-loops")#include
#define fi first#define se second#define mp make_pair#define pb push_back#define pi acos(-1.0)#define ll long long#define mod 1000000007#define C 0.5772156649#define ls l,m,rt<<1#define rs m+1,r,rt<<1|1#define pil pair
#define pii pair
#define ull unsigned long long#define base 1000000000000000000#define fio ios::sync_with_stdio(false);cin.tie(0)using namespace std;const double g=10.0,eps=1e-9;const int N=2000000+10,maxn=100000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;int a[maxn],ans[maxn],num[maxn];int Next[maxn],id[maxn];vector
v[N];void pushup(int rt){ v[rt].clear();// v[rt].resize(v[rt<<1].size()+v[rt<<1|1].size()); for(int i=0;i
<<1].size();i++) v[rt].pb(v[rt<<1][i]); for(int i=0;i
<<1|1].size();i++) v[rt].pb(v[rt<<1|1][i]); sort(v[rt].begin(),v[rt].end());}void build(int l,int r,int rt){ if(l==r) { v[rt].pb(ans[l]); return ; } int m=(l+r)>>1; build(ls);build(rs); pushup(rt);}int query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) {// for(int i=0;i
>1,ans=0; if(L<=m)ans+=query(L,R,ls); if(m
=1;i--) { Next[i]=id[a[i]]; id[a[i]]=i; } memset(id,0,sizeof id); for(int i=n;i>=1;i--)id[a[i]]=i; for(int i=1;i<=n;i++) { if(num[a[i]]==k) { ans[id[a[i]]]=i; id[a[i]]=Next[id[a[i]]]; } else num[a[i]]++; }// for(int i=1;i<=n;i++)// printf("%d ",ans[i]);// puts(""); build(1,n,1);// printf("%d\n",2-1+1-query(1,2,1,n,1)); int q,last=0; scanf("%d",&q); while(q--) { int l,r; scanf("%d%d",&l,&r); l=(l+last)%n+1,r=(r+last)%n+1; if(l>r)swap(l,r); last=r-l+1-query(l,r,1,n,1); printf("%d\n",last); } return 0;}/****************************************/
View Code

 

转载于:https://www.cnblogs.com/acjiumeng/p/8515449.html

转载地址:https://blog.csdn.net/weixin_30346033/article/details/96107951 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:利用EF Core的Join进行多表查询
下一篇:hdu2819二分图匹配

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月06日 19时24分41秒