首页 > 其他分享 >USACO24OPEN Bessie's Interview S 题解

USACO24OPEN Bessie's Interview S 题解

时间:2024-03-19 22:12:41浏览次数:20  
标签:qq 题解 ll 面试 Interview Bessie 奶牛 农夫 define

题意简述:

有 \(n\) 个奶牛,\(k\) 个农夫,\(k\le n\),每一个奶牛有一个面试时长 \(t_i\),表示面试这个奶牛要多长时间。\(0\) 时刻时对于所有的 \(1\le i\le k\),第 \(i\) 个农夫会面试第 \(i\) 个奶牛,之后的面试顺序满足以下条件:

  1. 若在某时刻 \(t\),存在某个农夫已经面试完当前的奶牛,那么他会立即按顺序面试下一个还没有面试到的奶牛。
  2. 如果当前存在 \(x>1\) 个农夫,那么可以随意面试还没面试到的下 \(x\) 个奶牛。

现在奶牛 Bessie 排在第 \(n+1\) 位,请求出她能面试的最早时间,以及可能会面试她的农夫有哪些,如果一个农夫可能面试她则输出了\(1\),不可能则输出 \(0\)。

Solution:

考虑实际上不同的时间至多有 \(2n\) 个。我们可以考虑使用 map 来储存这是第几个最新出现的数,接着对于时间 \(t\),如果存在一个时间 \(t_0\) 是可以转移到 \(t\) 的,那么我们就由 \(t\) 向 \(t_0\) 连边,最后由 Bessie 最早可以面试的时间逐渐向下走,因为面试时间为正整数,该图实际上是个有向无环图,最后记录可以走到的初始时间,再将这些时间对应的农夫标记,输出即可。

至于第二个限制,可以发现我们这里并不需要考虑是如何选择的,任意的选择方案最后得出的图总是同一个图,图是同一个,那么最终对应的农夫也是同样的。

需要注意的是不能重复加边,会爆空间。

我这里是直接使用 set 存边。

Code:

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define ll long long
#define ull unsigned long long
#define m_p make_pair
#define m_t make_tuple
#define inf (0x7f7f7f7f)
#define N 300010
using namespace std;
using namespace __gnu_pbds;
ll ti[N];
int mpcnt = 1;
typedef pair<ll, int> pii;
std::priority_queue<pii, vector<pii>, greater<pii>> q;
vector<int> hs[N], avi, ans;
set<int> a[N << 1];
map<ll, int> mp;
bitset<N << 1> vis, vis1;
void checkins(ll x)
{
	if (!mp.count(x))
	{
		mp[x] = mpcnt;
		++mpcnt;
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	ll n, k, cnt, beginc, nt = 0, fl = 0, x;
	cin >> n >> k;
	for (ll i = 1; i <= n; i++)
		cin >> ti[i];
	for (ll i = 1; i <= k; i++)
	{
		q.push(m_p(ti[i], i));
		checkins(ti[i]);
		hs[mp[ti[i]]].push_back(i);
	}
	beginc = mpcnt;
	cnt = k + 1;
	while (!q.empty())
	{
		nt = q.top().first;
		if (cnt > n)
			fl = 1;
		while (!q.empty() && q.top().first == nt)
		{
			avi.push_back(q.top().second);
			q.pop();
		}
		x = mp[nt];
		for (ll i = 0; i < avi.size(); i++)
			if (cnt <= n)
			{
				q.push(m_p(nt + ti[cnt], avi[i]));
				checkins(nt + ti[cnt]);
				a[mp[nt + ti[cnt]]].insert(x);
				++cnt;
			}
			else
				fl = 1;
		if (fl)
			break;
		avi.clear();
	}
	queue<int> qq;
	qq.push(mp[nt]);
	while (!qq.empty())
	{
		x = qq.front();
		qq.pop();
		vis[x] = 1;
		if (x < beginc)
			for (auto px : hs[x])
				vis1[px] = 1;
		for (auto y : a[x])
			if (!vis[y])
				qq.push(y);
	}
	cout << nt << "\n";
	for (int i = 1; i <= k; i++)
		cout << vis1[i];
	return 0;
}

时间复杂度为 \(O(n\log_2n)\),附带大常数。

本来还想写写考场思路的,想了想有点丢人,还是不写了。

标签:qq,题解,ll,面试,Interview,Bessie,奶牛,农夫,define
From: https://www.cnblogs.com/wryyy-233/p/18084090

相关文章

  • abc176F题解
    abs176F题意:给定长度为\(3\timesn\),值域是\([1,n]\)的序列,不断下列操作直至序列剩余\(3\)个数:1.对序列最左侧\(5\)个数进行任意排列。2.取出序列最左侧\(3\)个数,如果\(3\)个数一样,则得分加一,然后删除这三个数。问最大得分为多少。思路:神仙dp题。首先有一个显然的\(\Thet......
  • codeforce Round 935 div3 个人题解(A-E)
    A.SettingupCamp时间限制:每个测试1秒内存限制:每个测试256兆字节输入:标准输入输出:标准输出组委会计划在游览结束后带领奥林匹克运动会的参赛选手进行徒步旅行。目前,正在计算需要搭帐篷的数量。已知每顶帐篷最多可容纳3人。在参赛选手中,有a个内向型,b个外向型和c个综合型:......
  • 20240319每日一题题解
    20240319每日一题题解Problem判断一个数的结构是否为某个数重复两遍得到。例如,\(123123\)是重复两遍的数,而\(333\),\(809680\)​则不是保证输入的数字不超过longlong型范围。若是,则输出yes;否则输出no。Solution从数字的角度要想解决这个问题也不是不可以,但是不如将给定的数......
  • 【蓝桥杯选拔赛真题70】python最短路径和 第十五届青少年组蓝桥杯python选拔赛真题 算
    目录python最短路径和一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python最短路径和第十五届蓝桥杯青少年组python比赛选拔赛真题一、题目要求(注:i......
  • [ABC345F] Many Lamps 题解
    题意:给定一个\(n\)个点\(m\)条边的无向图,每个点的初始颜色为\(0\)。一次操作是将一条边的两个端点的颜色翻转。求是否能通过若干次操作使得最终有\(k\)个颜色为\(1\)的点。首先考虑什么情况下无解。会发现每一次操作,颜色为\(1\)的点的数量变化一定是\([0,+2,-2]\)......
  • CF1935 A-C题解
    A设\(s\)翻转后的字符串为\(t\),考虑进行\(n\)次操作可能生成出哪些字符串:只进行翻转操作——\(s\);先复制再\(n-1\)次翻转——\(s+t\);先翻转,再复制,再翻转\(n-2\)次,\(t+s\);多次复制的情况。情况2显然劣于情况1;情况4得到的字符串的开头一定是\(s\)或者\(t\)......
  • 初三多项式的运算练习 题解
    初三多项式的运算练习题解美好的下午时光要拿来写题解呜呜呜,一篇一篇地鸽得了。有些题要用到GF的知识,或许我可以找时间讲一下?贴一份我的FFT和NTT的板子。FFT:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intn,m,limit,f[1<<22],g[1......
  • 洛谷 P2934 [USACO09JAN] Safe Travel G 题解
    前话貌似别人都是使用并查集维护的方法,然而由于排序、最短路等算法瓶颈,以下令\(n\)和\(m\)同阶,总的时间复杂度依然是\(\Theta(n\logn)\)的,那么并查集是否有点大材小用了。事实上,在建完最短路径树后,我给出了两种带\(\log\)的数据结构完成此题。题目分析翻译里已经把问......
  • 腾讯春招内参:2024最全Spring Boot面试题解析,技术精英必备!
    随着2024年春季招聘季的来临,腾讯再次开启了对富有才华和创新精神的技术人才的寻找之旅。作为一家全球领先的互联网科技公司,腾讯在寻找那些不仅拥有扎实的技术基础,而且能够适应快速发展和变化的行业环境的候选人。在众多技术栈中,SpringBoot作为简化Spring应用开发的工具,因其......
  • AtCoder Beginner Contest 345 A-F 题解
    A-LeftrightarrowQuestion给你一个由<、=和>组成的字符串\(S\)。请判断\(S\)是否是双向箭头字符串。字符串\(S\)是双向箭头字符串,当且仅当存在一个正整数\(k\),使得\(S\)是一个<、\(k\)个=和一个>的连接,且顺序如此,长度为\((k+2)\)。Solution按照题意......