洛谷3029 USACO Line Up

博客探讨了一道关于单调队列的USACO题目,指出当存在一段范围内有sum种不同牛时,只需关注该范围,左侧的任何品种牛都不需要保留,因为它们只会延长无效范围。通过举例说明,如序列A B A C,第一个A无需进入队伍,不会影响最终结果。
摘要由CSDN通过智能技术生成

一个单调队列题目,一开始其实想到这方面了但是太久没写还是得看一哈题解。
题目结论是很明显的,如果你有一段范围里面有了 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值