牛客练习赛73 D 离别


思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k。 这个可以用队列或者vector来维护。

然后我们对于q个查询,安装r从小到大排序。
开始遍历,把now点更新到q.r点,每次更新l【now】-r【now】这个区间的数都加1,使得 从1到r 点 做为右端点的(l,r)区间 全部更新,然后我们查询(q.l,q.r)中的区间和是多少 就是答案了。 因为当 右端点 i<q.l 的时候,他更新的(l,r) 区间必然是小于q.l的,那剩下的右端的i 全部都是在(q.l,q.r)中,既查询(q.l,q.r)就是答案。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <bitset>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se secondusing namespace std;
typedef long long  ll;
typedef unsigned long long  ull;
typedef pair<ll,ll> pii;
const ll mod=20000311;
const ll N =3e5+10;
const double eps = 1e-5;
//const double pi=acos(-1);
ll qk(ll a,ll b){ll ans=1;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}struct p{int l,r;ll sum,lazy;
}s[N*4];
struct node{int l,r,id;bool operator<(const node &M) const{return r<M.r;}
}a[N];
ll n,q,k;
queue<int> p[N];
ll ans[N];
ll ls[N],rs[N];
ll b[N];
void up(int rt){s[rt].sum=s[lson].sum+s[rson].sum;
}
void down(int rt){if(s[rt].lazy){s[lson].sum+=(s[lson].r-s[lson].l+1)*s[rt].lazy;s[rson].sum+=(s[rson].r-s[rson].l+1)*s[rt].lazy;s[lson].lazy+=s[rt].lazy;s[rson].lazy+=s[rt].lazy;s[rt].lazy=0;}return;
}
void build(int rt,int l,int r)
{s[rt].l=l,s[rt].r=r;s[rt].sum=0;s[rt].lazy=0;if(l==r) return;int mid=(l+r)>>1;build(lson,l,mid);build(rson,mid+1,r);
}
void add(int rt,int L,int R,int v){if(s[rt].l>=L&&s[rt].r<=R){s[rt].sum+=(s[rt].r-s[rt].l+1)*v;s[rt].lazy+=v;return;}down(rt);int mid=(s[rt].l+s[rt].r)>>1;if(mid>=L) add(lson,L,R,v);if(mid<R) add(rson,L,R,v);up(rt);
}
ll q1(int rt,int L,int R){if(s[rt].l>=L&&s[rt].r<=R){return s[rt].sum;}down(rt);int mid=(s[rt].l+s[rt].r)>>1;ll ans=0;if(mid>=L) ans+=q1(lson,L,R);if(mid<R) ans+=q1(rson,L,R);up(rt);return ans;
}
void sovle(){cin>>n>>q>>k;for(int i=1;i<=n;i++) cin>>b[i];int nowl=1,nowr=0;for(int i=1;i<=n;i++){p[b[i]].push(i);if(p[b[i]].size()>k) {int t=p[b[i]].front();p[b[i]].pop();nowl=max(t+1,nowl);}if(p[b[i]].size()==k) {nowr=max(nowr,p[b[i]].front());}ls[i]=nowl,rs[i]=nowr;//   cout<<ls[i]<<" "<<rs[i]<<endl;}for(int i=1;i<=q;i++) {cin>>a[i].l>>a[i].r;a[i].id=i;}build(1,1,n);sort(a+1,a+1+q);int now=0;for(int i=1;i<=q;i++){while(now<a[i].r) {now++;if(ls[now]<=rs[now]) add(1,ls[now],rs[now],1);//cout<<q1(1,1,1)<<endl;}ans[a[i].id]=q1(1,a[i].l,a[i].r);}//cout<<q1(1,1,1)<<endl;for(int i=1;i<=q;i++) cout<<ans[i]<<endl;
}
int main()
{iosint t=1;//cin>>t;while(t--) sovle();return 0;
}

牛客练习赛73 D 离别(线段树+右端点排序离线查询)相关推荐

  1. 牛客练习赛 4 A-Laptop (线段树,思维/GTMD普通前缀和也能求)

    链接:https://ac.nowcoder.com/acm/contest/16/A?&headNav=www 来源:牛客网 题目描述 FST是一名可怜的小朋友,他很强,但是经常fst,所以 ...

  2. 牛客网wannafly挑战赛13-E(线段树)

    链接:https://www.nowcoder.com/acm/contest/80/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  3. 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)

    链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...

  4. 牛客练习赛64 - B Dis2(树,基础图论)

    B Dis2 其实就是对于每一个结点,答案就是这个结点的每一个子结点的子结点数−1-1−1(因为这里使用邻接表实现树,是一个无向图双向建边,子结点的子结点包括自己) #include<iostr ...

  5. 牛客练习赛63 F.牛牛的树行棋(博弈 SG函数)

    题目链接:https://ac.nowcoder.com/acm/contest/5531/F 牛牛的树行棋 前置知识 思路 代码 前置知识 这道题目需要博弈论中的SG函数的知识,这里就不多赘述.主要 ...

  6. 牛客练习赛63 F.牛牛的树行棋(启发式合并+sg打表)

    LINK 假设只有一枚棋子,那么这枚棋子在叶子节点的 s g sg sg值显然是零 其他节点可以 s g sg sg打表推出来,由于只需要子树内的 s g sg sg值,似乎需要用到启发式合并计算 但 ...

  7. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  8. 牛客练习赛29 题解

    牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系- 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下 ...

  9. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

最新文章

  1. 在docker中搭建apache Tomcat+JDK环境
  2. 【博客话题】我的linux心路历程
  3. CSS核心技术详解-核心概念
  4. arXiv与文献调研神器Connected Papers强强联合
  5. SQL Server应用程序中的高级SQL注入[转]
  6. 对方启用和留言是什么意思_男子花八万元装修,装修到一半要求加价,对方:补给我一万两天就能装好...
  7. script 标签中引用asp文件不显示的原因
  8. 我的世界检测不到java_《我的世界》检测不到java怎么办?
  9. 【图论】spfa算法详解
  10. 五金行业智慧采购解决方案:应用集中采购协同管理系统激活企业数字化采购价值
  11. linux 访问 小米路由器,彻底解决Win10局域网无法访问小米路由器硬盘的问题
  12. 花海吉他谱-无限延音编配
  13. 微信公众号企业认证/企业公众号微信认证
  14. 内部资料泄密,电信拨号软件系最大流氓软件
  15. 知乎上的一道问题:出家人怎么解决性欲?
  16. 白加黑加载方式_AVG中国实验室发现“白加黑”型恶意程序
  17. 三星4418核心板 世界上最小的A9核心模块 性能强大
  18. Tableau 可视化图表学习
  19. 小黑NLPbaseline成长日记1:Skip_Gram+NEG的pytorch练习
  20. 大数据开发笔试题整合

热门文章

  1. 复工之后,如何让自己的时间更值钱
  2. TensorFlow的这些骚操作你都知道吗?
  3. 备赛脱脂经验分享_IEO国际经济学奥林匹克初选宏观备赛经验分享
  4. c#web服务器 虚拟目录,C#建立自己的Web服务器
  5. 计算机高效课堂建设,打造职业学校计算机高效课堂.doc
  6. Linux系统断电后起不来,centos/linux 断电后,开机光标闪现不能开启,重新引导
  7. 多个数求平均数java_[分享]求任意个数的平均数!
  8. java 日期 区间_如何实现时间区间的分割??
  9. java 枚举工厂_在Java中使用枚举工厂,最佳做法?
  10. sql java 创建数据库_java动态创建数据库(sql server)