首页 > 其他分享 >题解:AT_arc184_a [ARC184A] Appraiser

题解:AT_arc184_a [ARC184A] Appraiser

时间:2024-09-23 10:38:26浏览次数:6  
标签:arc184 int 题解 long vector vec Appraiser define

本质上还是官方题解的分组并利用 \(M\) 不大的思路。

询问次数 \(Q\) 离最简单的每个扫一遍就可以知道答案的做法少了 \(50\) 次。我们考虑如何减少这个次数。

首先你可以发现一次询问可以覆盖到两个数,也就是说所有的数都被覆盖时只需要询问 \(500\) 次。

我们考虑把不同的对拉出来,然后把它剩下相同的对留下,最坏的情况是所有都被留下了。

此时继续重复上述操作,并把每个对看成一个整体,也就是说按照 \(2,4,8,...,2^n\) 的方式不断进行分组,你会发现,最坏的情况下至少在每 \(4\) 个为一组时至少会查出一组大小为 \(2\) 的不同类型组,因为 \(M=10\)。而在每 \(16\) 个为一组时就可以查出所有的不同组,所以我们只要分到 \(16\) 为一组时就不用再分了,这里总共使用了至多 \(937\) 次询问,请自行计算。

当然这样有个问题,就是在分的时候会出现末尾每办法分进去,我们就直接将其单独提出,这样的单独最多有 \(3\) 组。

最后剩下的相同组一定都是真币,所以只要单独提出其中一个然后与每个不同组比较,若不同组的前半与其不同,则前半为假币,若相同,则后半为假币,这里至多比 \(5\) 次。

对于单独组,它也可能是假币,所以也要比较,但是如果相同就不做处理,这里最多会比较 \(3\) 次。

最后询问次数将严格低于 \(937+3+5=945\) 次。比较劣,但是可过。

还要注意不要读错题,比如说看错 \(1\) 和 \(0\) 的意义之类的,否则你会像我一样调一个多小时。

赛时码风,丑陋轻喷。

#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 N 1010
using namespace std;
using namespace __gnu_pbds;
bool ask(int x, int y)
{
	cout << "? " << x << " " << y << "\n";
	fflush(stdout);
	bool ans;
	cin >> ans;
	return (!ans);
}
int m, cnt;
bitset<N> vis;
vector<pair<vector<int>, vector<int>>> ns;
vector<vector<int>> ss;
void solve(vector<vector<int>> a)
{
	if (cnt >= m || a.size() <= 70)
		return;
	int x, y, z, n = a.size();
	vector<vector<int>> a1;
	vector<int> vec1, vec2, vec;
	for (int i = 1; (i << 1) <= n; i++)
	{
		y = i << 1;
		x = y - 1;
		--x;
		--y;
		vec1 = a[x];
		vec2 = a[y];
		if (ask(vec1.front(), vec2.front()))
		{
			vec = vec1;
			for (auto val : vec2)
				vec.push_back(val);
			a1.push_back(vec);
		}
		else
		{
			cnt += vec1.size();
			ns.push_back(m_p(vec1, vec2));
			for (auto val : vec1)
				vis[val] = 1;
			for (auto val : vec2)
				vis[val] = 1;
		}
	}
	if (n & 1)
	{
		ss.push_back(a.back());
		for (auto val : a.back())
			vis[val] = 1;
	}
	return solve(a1);
}
signed main()
{
	int n, q, x, y, los = 1;
	cin >> n >> m >> q;
	vector<vector<int>> a;
	vector<int> vec;
	vec.resize(1);
	for (int i = 1; i <= n; i++)
	{
		vec[0] = i;
		a.push_back(vec);
	}
	solve(a);
	if (cnt == m)
	{
		for (auto vec1 : ss)
			for (auto val : vec1)
				vis[val] = 0;
		ss.clear();
	}
	for (int i = 1; i <= n; i++)
		if (!vis[i])
		{
			los = i;
			break;
		}
	vec.clear();
	for (auto [vec1, vec2] : ns)
	{
		if (ask(los, vec1.front()))
			for (auto val : vec2)
				vec.push_back(val);
		else
			for (auto val : vec1)
				vec.push_back(val);
	}
	for (auto vec1 : ss)
		if (!ask(los, vec1.front()))
			for (auto val : vec1)
				vec.push_back(val);
	sort(vec.begin(), vec.end());
	cout << "!";
	for (auto val : vec)
		cout << " " << val;
	cout << "\n";
	fflush(stdout);
	return 0;
}

话说这道题真的只普及吗?

还是我菜了。

标签:arc184,int,题解,long,vector,vec,Appraiser,define
From: https://www.cnblogs.com/wryyy-233/p/18426554

相关文章

  • 网站打不开数据库错误等常见问题解决方法
    当遇到网站打不开且出现数据库错误等问题时,可以采取以下步骤进行排查和解决:检查默认页面:如果网站显示“主机开设成功!”或者“恭喜,lanmp安装成功!”这样的信息,这可能是服务器默认放置的页面。检查wwwroot目录下是否有自己的程序文件,如果没有,上传正确的文件,并删除默认的index.ht......
  • [ABC371F] Takahashi in Narrow Road 题解
    洛谷题目链接Atcoder题目链接前言这道题我赛时想到了正解并打了出来,然后因为把\(l\)打成了\(1\)导致WA\(\times23\),然后又没场切六道题(悲。然后赛后有人说正解是珂朵莉树/线段树,然而我是珂朵莉树\(+\)线段树,呵。题意数轴上有\(n\)个人,第\(i\)个人初始在\(X_i\)处,每一次操作......
  • CF1239E Turtle 题解
    Description一只乌龟从\(2\timesn\)的棋盘的左上角走到右下角,只能往下或往右,需要给出一种方案来分配\(2n\)个数字使得乌龟走过的路径上的数之和的最大值最小。\(2\leqn\leq25,0\leqa_{1,i},a_{2,i}\leq5\times10^4\)。Solution设\(pre_{i}=\sum_{j=1}^{i}{a_{1,i}......
  • P5975 photo 题解
    Solution先离散化,记\(f(l,r,p)\)为覆盖了\([l,r]\)区间内纵坐标\(\gep\)的点最少矩形个数。则:\[f(l,r,p)=\min(f(l,r,p),f(l,mid,p)+f(mid+1,r,p))\]\[f(l,r,p)=\min(f(l,r,p),f(l,r,res)+1)\]令\(h\)为用面积为\(S\)的矩形去覆盖\([l,r]\)区间的高度,即\(S/(r......
  • P9192 Pareidolia 题解
    Statement给串\(t\),定义\(B(s)\)为\(s\)删一些字符后能出现最多多少个bessie,\(A(t)\)表示对\(t\)的所有子串\(s\)求\(B(s)\)的和,有\(q\)次单点修改,每次改完输出\(B(s)\).Solution动态dp,但是带矩乘\(6^3\)常数,不好.还是考虑分治咋做.现在有区间\([l,mid],......
  • P3703 树点涂色 题解
    Statement树,每个点有一个颜色,初始每个点颜色互不相同到根链涂上新颜色链颜色数\(u\)子树内点\(v\)到根路径的最多颜色数Solution首先,相同颜色的点一定构成一条从下往上的链考虑LCT,维护一个性质:一条实链的点的颜色相同.于是\(u\)到根的颜色数\(=\)\(u\)到根的虚......
  • 最长公共子串 题解
    StatementQ7.1.2.4,时限4s给一个串,定义\(\mathrm{LCS}\)为最长公共子串长度,\(q\)次询问,每次给出\(l,r\),求\[\operatorname{xor}_{i=1}^{r-l+1}\{i+\mathrm{LCS}(S[l,l+i-1],S[l+i-1,r])\}\]\(n\le10^5,q\le30\)Solutiontag:SA,线段树维护分治结构,orzhunction题目就是......
  • BZOJ 2555 = P5212 SubString 题解
    Statement给你一个字符串 \(\text{init}\),要求你支持两个操作:在当前字符串的后面插入一个字符串;询问字符串 \(s\) 在当前字符串中出现了几次?(作为连续子串)你必须在线支持这些操作。Solutionextend中link[cur]=q,相当于link,链加新建copy那里,相当于link,cut,链加询......
  • 2024 秋季模拟赛题解
    2024秋季模拟赛题解CSP-S模拟赛2024.9.8CSP-S模拟赛28T1签到题。对\(b\)分解质因数后便容易求解。T2考虑枚举\(\gcd(S)\)的取值\(x\),则\(\operatorname{lcm}(S)=m-x\)。那么同时变形\(\gcd\)和\(\operatorname{lcm}\)变为\(\gcd(S)=1,\operatorname{lcm}......
  • BZOJ 3277 串 题解
    Statement给 \(n\) 个串,问每个串有多少子串是所有 \(n\) 个串中至少 \(k\) 个串的子串。Solution1%%注意到\(\text{LCP}\)在后缀排序后一定是连续的一段,包含一个串的区间是连续的先预处理出对于所有左端点\(l\),最左的\(r\)满足\([l..r]\)中出现了至少\(k\)个......