首页 > 其他分享 >暑假集训D8 2023.8.1 补题

暑假集训D8 2023.8.1 补题

时间:2023-08-01 21:22:41浏览次数:47  
标签:2023.8 int vis second 补题 D8 编号 include first

C. P3029 [USACO11NOV] Cow Lineup S

有 \(n\) 只牛, 他们各自有自己的编号(不同牛的编号可能是相同的).这些牛站在不同的位置.现在需要给这些牛拍一张照.有如下要求

  • 选定一个范围内的牛拍照,这些牛需要包含所有出现过的编号
  • 照片的成本是这个范围,因此范围越小越好
    已经给定所有牛的位置和编号,请你找出范围的最小值.

这题没什么思路.看题解后发现并不难,而且方法很多.
最简单的方法:
把所有牛的距离按从小到大排序,从左到右遍历.依次把牛加入队列,如果当前的牛的编号已经在队列里有了,并且之前的位置是在队列的最左侧,则将最左侧的牛出队,同时更新 \(l\) 的值.然后记录队列中已有的牛的不同编号的个数.如果包含所有编号数则就可以更新答案.注意这题用数组记录是否有某编号的牛会 \(RE\) 三个点,改成 \(map\) 就好了,说实话有点坑....如果是比赛还真不一定想得到.
找最左侧的牛也非常简单,只要用优先队列即可..

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#define endl '\n'
#define pb push_back
using namespace std;
typedef pair<int,int> PII;
const int N = 2e6+10;
PII a[N];
int m;
map<int,int> vis;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i].first>>a[i].second;
		if(!vis[a[i].second])
		{
			m++;
			vis[a[i].second]= 1;
		}
	}
	vis.clear();
	sort(a,a+n);
	int res = 2147483647;
	priority_queue<PII,vector<PII>,greater<PII> > q;
	q.push(a[0]);
	vis[a[0].second] =1;
	int i = 1;
	int cnt = 1;
	int l = a[0].first;
	while(i<n)
	{
		q.push(a[i]);
		if(!vis[a[i].second])
		{
			cnt++;
		}

		vis[a[i].second] ++;
		PII t = q.top();
		if(vis[t.second]>1)
		{
			q.pop();
			l = q.top().first;
			vis[t.second]--;
		}
		if(cnt==m)
		{
			res = min (res,a[i].first - l); 
		}
		i++;
	}
	cout<<res<<endl;
	return 0;
}

标签:2023.8,int,vis,second,补题,D8,编号,include,first
From: https://www.cnblogs.com/oijueshi/p/17599118.html

相关文章

  • 2023.8.1 周二:自定义异常
    1//MyException2//继承Exception的类,即为自定义的异常类3publicclassMyExceptionextendsException{4//传递数字>10,则报异常5privateintdetail;6//Alt+Insert自动添加构造方法7publicMyException(inta){8this.detail=......
  • 补题报告之S班暑训第三场
    成绩比赛经过\(\text{A}\)看上去像一个贪心。由于不知道咋搞,胡出一个假的结论。\(x\)选手在别的榜单所在位置,之后的选手优先选,多个榜单,按照满足条件的榜单数量对每个选手排序。然后模拟。事实证明,他只有\(\text{50}\)分。\(\text{B}\)没理解样例咋来的,也不知道斜对角线的......
  • Codeforces Round 888 (Div. 3) 补题
    独立补了一道记忆化搜索的题,https://codeforces.com/contest/1851/problem/E由于初次接触对于使用场景和注意事项都不是很熟悉,写加调估计得有3h。本题的题面保证了本题是个无环图,允许dfs函数会有出口,存图不能用链式前向图,因为非常容易构造数据使得为稠密图,所以用二维数组或vec......
  • 暑假集训D6 2023.7.29 补题
    原比赛链接2022年华中科技大学程序设计新生赛(重现赛)官方题解华中科技大学2022新生赛(HUSTFCPC2022)题解&滚榜\(underset\)\(\underset{\sim}Λ\)\(\underset{\sim}{abcd}\)N.WalkAlone'sConjecture题意:给定一个整数\(n\),找出两个数\(x\)和\(y\),使得满足如下......
  • 牛客第四场补题 AFHJL
    牛客第四场补题AFHJLJ.Qu'est-ceQueC'est?题意:构建一个n个数的数组,满足:\(-m<=a_i<=m\)对于所有的\(1\lel<r\len\)都有\(\sum^{r}_{i=l}a_i\ge0\)思路:简单翻译就是最小字段和必须大于等于0。先来做一个简单版本:要求必须区间长度为2的情况下所有都满足上面的关系。......
  • 补题
    暑假友谊赛No.2——冰题意:n个人,m句话,用一个字符串表示一个人是否会说第i句话。选出一些人组成一个队列,要求按原来的顺序但可以不连续,相邻的两个人不能会说同样的话。求队列的种数。思路:状态压缩dp,把字符串转换成01字符串。0表示不说,1表示说。相邻两人不能会说同样的话转换......
  • 暑假集训D5 2023.7.28 补题
    首先来回顾一下\(dijkstra\)和\(SPFA\)里面\(vis\)数组的作用和区别,以及不用\(vis\)数组的影响.(今天发现之前写堆优化的\(Dijkstra\)都不加\(vis\)数组...)\(Dijkstra\)算法中,每次取出距离源点最近的一个点来更新与他相连的其他点,置\(vis\)数组为\(true\)......
  • 2023牛客多校7.24补题
    J-FineLogic题意:给定n个点和m对偏序关系(x,y),构造最少的排列数目k,使得在这k个排列中至少有一个排列满足x出现在y的前面。分析:很考验思维的一道题,首先如果m对偏序关系不构成环,也就是一张有向无环图,于是用拓扑排序构造出一个合理排列即可。要是有环,就直接构造两个排列,一个是1<2<.......
  • 暑假集训D3 2023.7.26 补题
    G.P6183[USACO10MAR]TheRockGameS题意:给定长度n,构造\(2^n\)个由X和O组成的字符串,使得第一个字符串和最后一个字符串只由O组成,并且相邻的字符串只有一处不同,不得有重复的字符串.BFS貌似做不了.看题解有佬用格雷码的知识.代码如下#include<stdio.h>#include<st......
  • 暑假集训D2 2023.7.25 补题
    D.P1796汤姆斯的天堂梦这道题目非常ex,赛时死活调不出来,思路是对的,容易发现是一个DAG,所以直接DP就好,虽然后面看题解AC了,发现是重边的问题。但还是来记录一下这道ex的题目,警醒一下自己切记注意重边!!如下两份代码,一份爆0,一份AC#include<stdio.h>#include<stdlib.h>#include<s......