题目链接:点击查看

题目大意:给出一个长度为 nnn 的数列,和一个数字 kkk。现在给出 mmm 次询问,每次查询需要回答区间 [l,r][l,r][l,r] 内有多少个子区间,满足区间内不同的数字个数大于等于 kkk

题目分析:一开始看到强制在线和区间问题以为是主席树,后来发现 kkk 自始至终都是不变的。这样每个点作为左端点时,假设某个点可以作为右端点 rrr 与其对应,那么显然当 i∈[r+1,n]i\in[r+1,n]i∈[r+1,n] 的 iii 作为右端点时,区间 [l,i][l,i][l,i] 同样也是满足条件的

所以我们只需要预处理出对于每个点作为左端点 lll 时,可以匹配的下标最小的右端点 rrr 即可,这里我记为 bib_ibi​,数组 bbb 不难看出可以直接用尺取来求,这里不多赘述了

那么考虑对于每次询问 [l,r][l,r][l,r] ,答案显然就是 ∑i=lrmax(0,r−bi+1)\sum_{i=l}^{r}max(0,r-b_i+1)∑i=lr​max(0,r−bi​+1)

然后就需要发现数组 bbb 的一个小性质,那就是数组 bbb 是单调不减的,所以对于上述求和公式就可以找到一个分界点 pospospos。有 i∈[l,pos]i\in[l,pos]i∈[l,pos] 时,满足 r−bi+1>=0r-b_i+1>=0r−bi​+1>=0;同理 i∈[pos+1,r]i\in[pos+1,r]i∈[pos+1,r] 时,满足 r−bi+1<0r-b_i+1<0r−bi​+1<0,这样一来 [pos+1,r][pos+1,r][pos+1,r] 的贡献就可以忽略不计了

到此为止只需要将上述求和公式拆一下就可以轻松实现了:
∑i=lrmax(0,r−bi+1)=∑i=lposbi+(r+1)∗(pos−l+1)\sum_{i=l}^{r}max(0,r-b_i+1)=\sum_{i=l}^{pos}b_i+(r+1)*(pos-l+1)∑i=lr​max(0,r−bi​+1)=∑i=lpos​bi​+(r+1)∗(pos−l+1)

代码:

// Problem: Alice and Bob
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/17148/C
// Memory Limit: 1048576 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #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<list>
#include<unordered_map>
#define lowbit(x) x&-x
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];
LL sum[N];
map<int,int>mp;
LL get_sum(int l,int r) {return sum[r]-sum[l-1];
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m,k;read(n),read(m),read(k);for(int i=1;i<=n;i++) {read(a[i]);}int r=0,cnt=0;for(int i=1;i<=n;i++) {while(cnt<k&&r<=n) {r++;mp[a[r]]++;if(mp[a[r]]==1) {cnt++;}}if(cnt>=k) {b[i]=r;} else {b[i]=n+1;}sum[i]=sum[i-1]+b[i];mp[a[i]]--;if(mp[a[i]]==0) {cnt--;}}LL ans=0;while(m--) {LL l,r;read(l),read(r);l=(l^ans)+1;r=(r^ans)+1;if(l>r) {swap(l,r);}int ll=l,rr=r,pos=-1;while(ll<=rr) {int mid=(ll+rr)>>1;if(0<=r-b[mid]+1) {pos=mid;ll=mid+1;} else {rr=mid-1;}}if(pos==-1) {puts("0");ans=0;} else {LL ans1=1LL*(r+1)*(pos-l+1);LL ans2=get_sum(l,pos);printf("%lld\n",ans=ans1-ans2);}}return 0;
}

牛客 - Alice and Bob(尺取+二分)相关推荐

  1. 牛客-丢手绢(尺取)

    输入 3 1 2 3 输出 3 思路:由题可知他的最远距离大概是他总距离的二分之一,所以我们就尺取这个距离去算他的最大距离 #include <cstdio> #include <c ...

  2. CF1547F Array Stabilization (GCD version) st表 + 尺取/二分

    传送门 题意: 思路: 容易发现,我们将所有aaa都除上所有aaa的gcdgcdgcd,实际上就是让你求一个最小的lenlenlen,对于所有iii,gcd(ai,ai+1,...,ai+len−1) ...

  3. 牛客挑战赛43C-最优公式【二分】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7413/C 题目大意 给一个序列AAA,求两个a,ba,ba,b使得∑i=1n∑j=1nmax{∣Ai−a∣, ...

  4. 牛客网编程题07--提取不重复的整数

    题目 代码: // ExtractNum.cpp : 定义控制台应用程序的入口点. // 从右到左 提取一个不重复的整数 // 提取,string转int,int转string#include &qu ...

  5. 【UVA - 10891 Game of Sum 】【HRBUST - 1622】 Alice and Bob (区间dp,博弈问题)

    题干: 有一个长度为N的整数序列,Alice和Bob轮流取数,Alice先取.每次玩家只能从左端或者右端 取一个或多个数,但不能两端都取.所有数都被取走后游戏结束,然后统计每个人取走的所有数之和, 作 ...

  6. 牛客网 OI 赛制测试赛

    比赛链接:这里写链接内容 A 斐波那契 链接:https://www.nowcoder.com/acm/contest/181/A 来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[ ...

  7. #牛客网 “华为杯”中国矿业大学程序设计学科竞赛重现赛

    A-细胞分裂 题目描述 CB不光是ACM大佬,同时也是生物领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. CB博士手里现在有N种细胞,编号从1~N,一个第i种细胞经过1秒钟可以分 ...

  8. 【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)

    A: 链接:https://ac.nowcoder.com/acm/contest/372/A 来源:牛客网 某天,一只可爱的肥橘喵在路上走,突然遇到了一个怪人,那怪人自称PM6,"小肥喵, ...

  9. 【2019牛客暑期多校训练营(第三场)- F】Planting Trees(单调队列,尺取)

    题干: 链接:https://ac.nowcoder.com/acm/contest/883/F 来源:牛客网 The semester is finally over and the summer ...

最新文章

  1. TI IPNC Web网页之网页修改教程
  2. jCryptoJS 、C#互通加密(MD5版)
  3. 容量耦合系数模型_期刊在线 | 基于ALE流固耦合方法的刷式密封泄漏特性理论与实验研究...
  4. XP下,文件夹添加右键命令行
  5. Java学习日报—消息队列—2021/11/23
  6. android 传感器 应用,Android移动设备中传感器的应用
  7. AndroidStudio_后台服务以及活动和服务间通信_通过service中的binder实现活动和服务的通信---Android原生开发工作笔记216
  8. android rsa解密前面带乱码,C#rsa解密的解出来的结果乱码
  9. [导入]不需要任何附加信息的伪凹凸光照计算方法。
  10. 手机组态软件_安卓平板组态软件​_移动端组态
  11. 《游戏设计艺术(第二版)》读书笔记
  12. 一句批处理快速把优酷KUX转MP4
  13. 最短路径(dijistra和floyd算法)
  14. Git HEAD指针
  15. 百度网盘会员怎么购买最便宜
  16. Spring Boot + Spring-Security实现前后端分离双重身份认证初学者指南(手机号密码JWT + 短信验证码)
  17. Matlab quiver函数用法 - 画矢量箭头图
  18. 易语言EIP永久注入
  19. CentOS7部署文件双向同步工具(unison)
  20. xbox360 功率测试软件,运行游戏164W!Xbox 360功耗早知道

热门文章

  1. JAVA工程师必学技能,进阶涨薪的推进器!这份实战教程请收下
  2. android home没有设置,android - 无法找到'ANDROID_HOME'环境变量
  3. java 防渗透_「java、工程师工作经验怎么写」-看准网
  4. MySQL排序查询介绍
  5. MySQL 高级 - 索引 - 数据结构
  6. Curator实现分布式锁的基本原理-LockInternals.attemptLock
  7. MyBatis 一级缓存与二级缓存的区别?
  8. IntelliJ IDEA导入一个已经存在的子模块
  9. 常用的函数式接口_Predicate接口练习_集合信息筛选
  10. Hive的基本操作-数据库的创建和删除