P10189 [USACO24FEB] Maximizing Productivity B 题解
![P10189 [USACO24FEB] Maximizing Productivity B 题解](/_astro/P10189.BXIuEg5P_ZY8tmP.webp)
865 字
4 分钟
P10189 [USACO24FEB] Maximizing Productivity B 题解
先说说暴力做法:
每次遍历一遍,看看是否满足 ,满足就计数,不满足就挂。单次时间复杂度显然为 ,总得时间复杂度约为 ,TLE 是肯定的~
暴力代码:
// Problem: Problem 3. Maximizing Productivity// Contest: USACO - USACO 2024 February Contest, Bronze// URL: https://usaco.org/index.php?page=viewproblem&cpid=1385// Memory Limit: 256 MB// Time Limit: 4000 ms//// Powered by CP Editor (https://cpeditor.org)
/*Code by Block_Fish*/#include <bits/stdc++.h>
#define log printf#define EPS 1e-8#define INF 0x3f3f3f3f#define FOR(i, l, r) for (int(i) = (l); (i) <= (r); ++(i))#define IOS \ ios::sync_with_stdio(false); \ cin.tie(nullptr); \ cout.tie(nullptr);
using namespace std;
typedef __int128 i128;typedef long long ll;typedef pair<int, int> PII;
const int N = 2e5 + 10;int n, q, c[N], t[N];
template <typename T>
inline T read() { T sum = 0, fl = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') fl = -1; for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0'; return sum * fl;}
template <typename T>
inline void write(T x) { static T sta[35]; int top = 0; do { sta[top++] = x % 10, x /= 10; } while (x); while (top) putchar(sta[--top] + 48);}
int main() { n = read<int>(), q = read<int>(); FOR(i, 1, n) c[i] = read<int>(); FOR(i, 1, n) t[i] = read<int>(); FOR(i, 1, q) { int v = read<int>(), s = read<int>(), cnt = 0; FOR(j, 1, n) if (s + t[j] < c[j])++ cnt; if (cnt >= v) puts("YES"); else puts("NO"); } return 0;}评测记录,开了优化也只有 20pts。
暴力废了,开始整正解。
?二分法,了解一下?
然后,然后遇到了个问题:二分这东西要求有序,可是 与 是绑定在一起的啊!咋整?
注意 与 没关系,而这个式子能够求出啥啊?想要去到第 个农场最大的 嘛(,刚好卡点儿到,不可能再晚了)!
总结一下,问题相当于预处理出来一个数组 ,使 ,求数组中是否有至少 个数满足 。
先排个序(不然还是 嘛),然后就可以分出来两种做法:
做法一:二分,用 upper_bound 函数(因为是大于等于),时间复杂度约为 。
做法二:排完序后显然满足 ,因此如果 都小于等于 了,那它前面的自然也都满足。因此只需要判断 成不成立即可。时间复杂度约为 。
赛时 ACCode(做法二):
// Problem: Problem 3. Maximizing Productivity// Contest: USACO - USACO 2024 February Contest, Bronze// URL: https://usaco.org/index.php?page=viewproblem&cpid=1385// Memory Limit: 256 MB// Time Limit: 4000 ms//// Powered by CP Editor (https://cpeditor.org)
/*Code by Block_Fish*/#include <iostream>#include <algorithm> // 万能头CE
#define log printf#define EPS 1e-8#define INF 0x3f3f3f3f#define FOR(i, l, r) for (int(i) = (l); (i) <= (r); ++(i))#define IOS \ ios::sync_with_stdio(false); \ cin.tie(nullptr); \ cout.tie(nullptr);
using namespace std;
typedef __int128 i128;typedef long long ll;typedef pair<int, int> PII;
int N, Q;int close[200010], t[200010], ans[200010], V, S;
template <typename T>
inline T read() { T sum = 0, fl = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') fl = -1; for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0'; return sum * fl;}
template <typename T>
inline void write(T x) { static T sta[35]; int top = 0; do { sta[top++] = x % 10, x /= 10; } while (x); while (top) putchar(sta[--top] + 48);}
bool x(int a, int b) { return a > b; }
int main() { cin >> N >> Q; for (int i = 1; i <= N; i++) { cin >> close[i]; } for (int i = 1; i <= N; i++) { cin >> t[i]; } for (int i = 1; i <= N; i++) { ans[i] = close[i] - t[i]; } sort(ans + 1, ans + N + 1, x); while (Q--) { cin >> V >> S; if (ans[V] > S) cout << "YES" << endl; else cout << "NO" << endl; } return 0;}支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
P10189 [USACO24FEB] Maximizing Productivity B 题解
https://www.leo2011.eu.org/posts/luogu-p10189/相关文章智能推荐
1
P10187 [USACO24FEB] Palindrome Game B 题解
题解讲解了 USACO 2024 二月场的铜组题目 Palindrome Game。
2
题解:P9938 [USACO21OPEN] Acowdemia II B
题解讲解了不建图解决 USACO 2021 公开赛的铜组题目 Acowdemia II。
3
P9012 [USACO23JAN] Moo Operations B题解
题解讲解了 USACO 2023 一月场的铜组题目 Moo Operations。
4
题解:P8267 [USACO22OPEN] Counting Liars B & U208878 晴天
题解讲解了如何用枚举和二分解决 USACO 2022 年公开赛的铜组题目 Counting Liars 及其加强版洛谷U208878 晴天。
5
题解:P16007 [CCO 2016 Day 1] Field Trip 郊游
题解讲解了如何解决洛谷 P16007。
随机文章随机推荐













