【JZOJ4804】成绩调研【模拟】【双指针】
题目大意:
题目链接:https://jzoj.net/senior/#main/show/4804
思路:
显然的,对于任意一个确定的,满足题目要求的序列左端点肯定是一段连续的区间。
而且这个区间显然是满足单调性的。
所以可以用三个指针维护。每次把指针右移一位时维护和,然后答案累加就可以了。
均摊时间复杂度为
代码:
**#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
int n,m,l1,l2,r,sum,a[N],L[N],R[N],cnt1[N],cnt2[N];
ll ans;
int main()
{
freopen("survey.in","r",stdin);
freopen("survey.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&L[i],&R[i]);
if (!L[i]) sum++;
}
l1=l2=1;
for (r=1;r<=n;r++)
{
cnt1[a[r]]++;
cnt2[a[r]]++;
if (cnt2[a[r]]==L[a[r]]) sum++;
while (cnt1[a[r]]>R[a[r]])
{
cnt1[a[l1]]--;
l1++;
}
while (sum==m&&l2<=r)
{
cnt2[a[l2]]--;
if (cnt2[a[l2]]==L[a[l2]]-1) sum--;
l2++;
}
ans+=max((ll)l2-(ll)l1,0LL);
}
printf("%lld\n",ans);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 为DeepSeek添加本地知识库
· .NET程序员AI开发基座:Microsoft.Extensions.AI
· 精选4款基于.NET开源、功能强大的通讯调试工具
· 数据不出内网:基于Ollama+OneAPI构建企业专属DeepSeek智能中台
· 大模型工具KTransformer的安装