一个单调队列题目,一开始其实想到这方面了但是太久没写还是得看一哈题解。
题目结论是很明显的,如果你有一段范围里面有了 sum种牛,那么你可以求这段就可以了,任何在左边的一个品种都是没必要保留的 所以都会出队。(这个可以脑子里YY一下,就会发现如果有以下情况 形如 A B A C 那么这个时候第一个A是没必要进队伍的,它只会让范围没有必要的变长了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define MAXN 500005
using namespace std;
int N;
struct node{
int pos,id;
};
node f[MAXN],q[MAXN];
int ff,c[MAXN];
map<int,int> a;
bool cmp(node u,node v)
{
if(u.pos<v.pos)
return true;
return false;
}
int main()
{
int i, j, k;
cin>>N;
for(i=1;i<=N;i++)
{
int x;
cin>>f[i].pos>>x;
if(!a.count(x))
ff++,a[x]=ff;
f[i].id=a[x];
}
sort(f+1,f+N+1,cmp);
q[1].pos=f[1].pos,q[1].id=f[1].id;
c[f[1].id]++;
int num=1,t=1,w=1;
int ans=1000000000*2;
for(i=2;i<=N;i++)
{
if(!c[f[i].i