首页 > 其他分享 >题解 ARC154D【A + B > C ?】

题解 ARC154D【A + B > C ?】

时间:2023-01-24 20:35:13浏览次数:52  
标签:sort ARC154D return int 题解 rep void pos1

显然 \(1+1>x\) 对任意大于 \(1\) 的正整数 \(x\) 都不成立。利用这一点,我们可以在 \(n-1\) 次询问内问出 \(1\) 的位置。具体地,首先假设 \(p_1\) 为 \(1\),记我们假设的为 \(1\) 位置为 \(k\)。依次枚举 \(2\sim n\) 的每个数 \(x\),问 \(p_k+p_k>p_x\) 是否成立。若成立,意味着 \(p_k>1\),令 \(k\gets x\) 然后继续循环;若不成立,意味着 \(p_x>1\),继续循环。循环结束后,\(p_k=1\) 一定成立。

注意到 \(p_i+1>p_j\iff p_i\ge p_j\),我们有了比较操作,只需对 \(p\) 进行排序即可。可以手写归并排序,但更方便的方法是写一个比较函数传进 stable_sort 里面。注意这里用 sort 可能会被卡,原因是 sort 递归到 \(n\) 小后就会使用插入排序,导致比较次数超限(次数限制比较紧)。

// Problem: D - A + B > C ?
// Contest: AtCoder - AtCoder Regular Contest 154
// URL: https://atcoder.jp/contests/arc154/tasks/arc154_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;
const int N = 2e3+5;

int n, a[N], p[N];
template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}
int ask(int x, int y, int z) {
	printf("? %d %d %d\n", x, y, z);
	fflush(stdout);
	char s[4];
	scanf("%s", s);
	return s[0] == 'Y';
}
void give(int* p, int n) {
	printf("! ");
	rep(i, 1, n) printf("%d%c", p[i], " \n"[i==n]);
	fflush(stdout);
}

int main() {
	scanf("%d", &n);
	int pos1 = 1;
	rep(i, 2, n) if(ask(pos1, pos1, i)) pos1 = i;
	rep(i, 1, n) a[i] = i;
	stable_sort(a+1, a+1+n, [=](int i, int j) {
		return !ask(i, pos1, j);
	});
	rep(i, 1, n) p[a[i]] = i;
	give(p, n);
	// system("pause");
	return 0;
}

标签:sort,ARC154D,return,int,题解,rep,void,pos1
From: https://www.cnblogs.com/ruierqwq/p/arc154d.html

相关文章

  • 莫比乌斯函数(P3455 题解)
    题目链接。我们定义\(n\)的莫比乌斯函数为\(\mu_n\)。我们将\(n\)分解质因式后为\(n=p_1^{\alpha_1}p_2^{\alpha_2}\cdotsp_k^{\alpha_k}\)则\(\mu_n=\begin......
  • CF1726D 题解
    EdgeSplit。一开始nt了,以为红边为一颗树,蓝边为剩余边,蓝边就不会有环了。假设有\(n\)个点,\(m\)条边,且这些边没有出现环,那么连通块的数量为\(n-m\),因为不存在环,......
  • AT_abc285_e 题解
    WorkorRest。我们考虑相邻两个假期之间的工作效率和。设\(len\)为相邻两个假期间隔的天数。举个例子,如果假期为\(\{1,3,7\}\),那么\(len\)为\(\{1,4\}\)。根......
  • CF1768C 题解
    \(\mathcalSolution\)【题意】题目要你构造两个序列\(p,q\),满足\(\max\{p_i,q_i\}=a_i\)。【分析】如果满足\(\max\{p_i,q_i\}=a_i\),则满足\(p_i=a_i,q_i\le......
  • CF1768D 题解
    \(\mathcalSolution\)【题意】我们可以交换任意两个数,求最小操作几次能让逆序对变成\(1\)。【分析】如果逆序对为\(1\)的排列一定是:\(2,1,\cdotsn\)\(1,3,......
  • ABC281E 题解
    \(\mathcalSolution\)本题的思路类似于对顶堆。用两个multiset来维护。\(S_1\)为第一个multiset;\(S_2\)为第二个multiset。\(S_1\)维护前\(K\)个值,\(S_2\)......
  • AT_abc277_e 题解
    \(\mathcalSolution\)【题意】给定无向图,当\(a_i=1\)时,该条边才能走。在给我们\(k\)个点,\(S_1,S_2,\cdots,S_k\),到了这些点可以选择是否取反\((1\to0,0\t......
  • 2023牛客寒假算法基础集训营1 个人题解(ACDHKL)
    A.WorldFinal?WorldCup!(I)题意:给10场比赛的点球输赢情况,奇数为A队点球,偶数为B队点球思路:用两个变量x,y来分别存A队当前赢的场次和B队当前赢的场次然后就就扫......
  • CodeForces-907#B 题解
    正文设数组\(c_{x,y,i,j}\)代表\((x,y)\)位置的大格子中\((i,j)\)位置的小格子。很显然,输入中字符的输入顺序是要调整的,实际的顺序是\(x,i,y,j\)。对于输入的\(......
  • 题解
    前言只对SubTask2的选手看过来!!!很好的一道模拟题。坑点分析题目里说的很明白了:只要有\(\ge1\)个带有注释的,就是一定是祖宗人,哪怕在后面或者前面出现过符合乐子人......