首页 > 其他分享 >题解:P8267 [USACO22OPEN] Counting Liars B & U208878 晴天

题解:P8267 [USACO22OPEN] Counting Liars B & U208878 晴天

时间:2024-05-25 21:58:14浏览次数:29  
标签:10 ch USACO22OPEN int 题解 P8267 pls top define

其实,这个题,只需要最简单的枚举,加上最简单的二分查找即可~


\(1 \le N \le 1000\)?枚举吧~

咋枚举?显然,最好状态下 Bessie 的位置一定是某个 \(p_i\),否则差一个就会导致有个奶牛要说谎。所以我们枚举(理论来讲要先去个重,这样快一点,不过貌似数据没有重的~)\(p_i\),每次遍历这帮奶牛看看有多少不说实话的不就得了?时间复杂度显然 \(O(n ^ 2)\)

ACCode
// Problem: P8267 [USACO22OPEN] Counting Liars B
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P8267
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)

/*Code by Leo2011*/
#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 = 1010;
int n, t[N], ans = INF;
vector<int> pls;
char op[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) {
	if (x < 0) {
		putchar('-'), write<T>(-x);
		return;
	}
	static T sta[35];
	int top = 0;
	do { sta[top++] = x % 10, x /= 10; } while (x);
	while (top) putchar(sta[--top] + 48);
}

int main() {
	IOS cin >> n;
	FOR(i, 1, n) {
		cin >> op[i] >> t[i];
		pls.push_back(t[i]);  // 数组 p
	}
	unique(pls.begin(), pls.end());  // 去重
	for (auto i : pls) {
		int tmp = 0;
		FOR(j, 1, n) if ((op[j] == 'L' && i > t[j]) || (op[j] == 'G' && i < t[j]))++ tmp;  // 满足条件就过
		ans = min(ans, tmp);
	}
	write<int>(ans);
	return 0;
}

AC 记录~


本来该消停了,直到我在讨论区里发现了个加强版

加强版把 \(N\) 上调至 \(2 \times 10^5\),显然,刚才的方法挂了。实测 确实不行。咋办?

注意看标签得到二分。外面显然没法优化,里边可以不?

必须滴!

你查找‘L’中说谎的,不就是在查小于这玩意儿的吗?你查找‘G’当中说谎的,不就是再查大于这玩意儿的吗?小于的直接 lower_bound,大于的就相当于总数 - 小于等于的,也就是总数 - upper_bound

时间复杂度显然为 \(\Theta(NlogN)\),可以过。

完。

ACCode
// Problem: U208878 晴天
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/U208878
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)

/*Code by Leo2011*/
#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, t, ans = INF;
vector<int> pls, lhs, rhs;
char op;

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) {
	if (x < 0) {
		putchar('-'), write<T>(-x);
		return;
	}
	static T sta[35];
	int top = 0;
	do { sta[top++] = x % 10, x /= 10; } while (x);
	while (top) putchar(sta[--top] + 48);
}

int main() {
	IOS cin >> n;
	FOR(i, 1, n) {
		cin >> op >> t;
		pls.push_back(t);
		if (op == 'L') lhs.push_back(t);
		else rhs.push_back(t);
	}
	sort(pls.begin(), pls.end());
	sort(lhs.begin(), lhs.end());
	sort(rhs.begin(), rhs.end());
	for (auto i : pls) {
		int tmpg = rhs.size() - (upper_bound(rhs.begin(), rhs.end(), i) - rhs.begin()), tmpl = lower_bound(lhs.begin(), lhs.end(), i) - lhs.begin();
		cerr << i << ' ' << tmpg << ' ' << tmpl << endl;
		ans = min(ans, tmpg + tmpl);
	}
	write<int>(ans);
	return 0;
}

AC 记录(加强版)~

标签:10,ch,USACO22OPEN,int,题解,P8267,pls,top,define
From: https://www.cnblogs.com/leo2011/p/18213035

相关文章

  • 2024XJTUPC西安交通大学校赛VP题解
    每次vp都自闭,已成习惯,时间还是分配的不合理,debug时做太多无用功。一键做题A.交小西的礼物输出a+b+2c+3d即可#pragmaGCCoptimize(3,"Ofast","inline")#include<bits/stdc++.h>#defineinf0x3f3f3f3f3fusingnamespacestd;usingll=longlong;usingpii=......
  • 题解【[SCOI2008] 配对】
    题目链接如果没有“配对数字不相同”的限制,将\(a,b\)数组排序后一一配对就能得到最小值。回到原题,考虑一种极端情况,\(\foralli\in[1,n],a_i=b_i\)即排序后全等。若\(n\)为偶数,一种显然的构造方法是:123456214365即分成两个两个一组,然后组内交换,这样跨越幅......
  • Xfce4桌面背景和桌面图标消失问题解决@FreeBSD
    问题:Xfce4桌面背景和桌面图标消失以前碰到过好几次桌面背景和桌面图标消失,整个桌面除了上面一条和下面中间的工具条,其它地方全是黑色的问题,但是这次重启之后也没有修复,整个桌面乌黑一片,啥都没有,用起来特别不得劲,于是开始修复。修复过程咨询文心,建议这样设置:检查壁纸设置:......
  • 【NOI2010】能量采集 题解
    【NOI2010】能量采集题解谨纪念我的第一道手推出来的莫反题。题目大意:已知\(n\),\(m\),求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(2\cdot\gcd(i,j)-1)\)。首先变形一手:\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m(2\cdot\gcd(i,j)-1)=2\sum\limits_{i=1}^n\sum\limits_{j=......
  • CF1973F Maximum GCD Sum Queries 题解
    题目链接点击打开链接题目解法首先想到枚举两个数列的$\gcd$,求最小代价两个数列的\(\gcd\)应该分别是\(a_1,b_1\)的因数或\(b_1,a_1\)的因数这样就把枚举范围缩小到了\(d(a_1)\timesd(b_1)\),这求最小代价需要\(O(n)\),不够快假设枚举的\(\gcd\)分别为\(x,y\)......
  • CF1909I Short Permutation Problem 题解
    这是一道*1900的黑。考虑枚举\(m\),将\(<\fracm2\)和\(\ge\fracm2\)的数分开讨论。考虑相邻两个数\(a,b\(a>b)\)分别在\(\fracm2\)的两侧,则有\(b\gem-a\)。考虑将所有数按某种方法从小到大排序,以\(\min(x,m-x)\)为第一关键字,\(-x\)为第二关键字,则排列中......
  • 【达梦问题解决】to_date转换之【文字与格式字符串不匹配】
    【问题描述】因为要转换的值中包含了不属于时间格式的字符(T,Z),这可能是数据迁移时时间参数设置不对导致的。具体没有进行考究【问题解决】使用DATE分隔符解决【手册链接】格式符解释实际分隔符的处理办法【自定义转换函数】这里的自定函数是不完善的,因为我的数......
  • CF1939D Big Persimmon 题解
    题目链接点击打开链接题目解法什么神仙题/jy先把\(a_i\)都\(\times2\),默认一开始先手比后手快\(1\)时间,可以避免两个人同时结束一个柿子的情况朴素的\(dp\)是显然的,令\(f_{l,r,det}\)表示当前剩下区间\([l,r]\)中的柿子,先手比后手快了\(det\)秒,先手最多能比后......
  • 充电桩——微信小程序,缴纳的1000元交易保障金,问题解答。
    1、小程序后台,申请退款保障金有一条不符合要求,无法退款。 2、咨询客服,能否退款然后再以公司名义缴纳保证金,等待回复:暂不支持对公转账,只能微信扫码支付缴纳哈。退保的话,支持退回对公账户。详情请查看小程序交易保证金管理规定https://developers.weixin.qq.com/miniprogram/de......
  • P5531 [CCO2019] Human Error 题解
    可能是一个比较劣的做法。但复杂度是对的。思路我们容易发现状态数非常的稀少。一个比较宽松的上限时\(3^{13}\)种状态由于每个点每走一步会吃掉一个棋子。所以实际的状态是远远达不到这个上限。那么我们可以直接设\(dp_{i,0/1,0/1}\)为在\(i\)状态下,目前是Justin......