首页 > 其他分享 >CodeForces 1918E ace5 and Task Order

CodeForces 1918E ace5 and Task Order

时间:2024-02-03 21:12:01浏览次数:26  
标签:typedef Task int CodeForces long ask op Order define

洛谷传送门

CF 传送门

世纪难题。

首先我们考虑先固定 \(x\),比如让 \(x = a_1\)(重复问 \(1\) 直到回答为 =),那么此时我们可以知道任意一个 \(a_i\) 和 \(a_1\) 的大小关系(问一次 \(i\) 再问一次 \(1\)),并且可以知道 \(a_i\) 的具体值。

那么剩下的数被分成了两个集合,一个 \(< a_1\) 一个 \(> a_1\)。发现我们可以对这两个集合递归地做上面的过程。递归时传需要求的位置集合和值域 \([l, r]\) 即可。

问题在于询问次数没有保障。考虑每次递归时从当前集合中随机一个数作为分界点。期望询问次数 \(O(n \log n)\)。\(40n\) 的次数限制很宽松所以能过。

code
// Problem: E. ace5 and Task Order
// Contest: Codeforces - Codeforces Round 922 (Div. 2)
// URL: https://codeforces.com/contest/1918/problem/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 2020;

int n, a[maxn];
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

inline int ask(int i) {
	printf("? %d\n", i);
	fflush(stdout);
	char op[9];
	scanf("%s", op);
	if (op[0] == '-') {
		exit(0);
	}
	return op[0] == '>' ? 1 : (op[0] == '<' ? -1 : 0);
}

void dfs(int l, int r, vector<int> S) {
	if (S.empty()) {
		return;
	}
	if (l == r) {
		a[S[0]] = l;
		return;
	}
	int p = S[rnd() % (int)S.size()];
	while (1) {
		if (ask(p) == 0) {
			break;
		}
	}
	vector<int> L, R;
	for (int i : S) {
		if (i == p) {
			continue;
		}
		int t = ask(i);
		if (t == -1) {
			L.pb(i);
		} else {
			R.pb(i);
		}
		ask(p);
	}
	int k = l + (int)L.size();
	a[p] = k;
	dfs(l, k - 1, L);
	dfs(k + 1, r, R);
}

void solve() {
	scanf("%d", &n);
	vector<int> S;
	for (int i = 1; i <= n; ++i) {
		S.pb(i);
	}
	dfs(1, n, S);
	printf("! ");
	for (int i = 1; i <= n; ++i) {
		printf("%d ", a[i]);
	}
	putchar('\n');
	fflush(stdout);
}

int main() {
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,Task,int,CodeForces,long,ask,op,Order,define
From: https://www.cnblogs.com/zltzlt-blog/p/18005203

相关文章

  • Linux调度pick_next_task_fair整体框架解读
    pick_next_task_fair是CFS调度类中选择next任务的主要路径,其主要功能是从当前CPU的就绪队列cfs_rq中选出一个可运行的任务作为"next任务",并将前一个任务prev重新放到就绪队列。 下面是这段代码框架流程解读。1判断rq->cfs.nr_running>0?如果不满足说明没有可运行任务则gotoidl......
  • [ABC328G] Cut and Reorder 题解
    [ABC328G]CutandReorder题解状压fw实锤思路观察到排列操作只会做一次,答案的编号一定是一段一段的。所以可以考虑\(f_s\)表示前\(popcount(s)+1\)个\(a\)元素,放进\(b\)中\(s\)的最小代价转移可以考虑放置一段,每放一段需要\(c\)的代价。专业看起来复杂度非......
  • left 2 Codeforces Round 916 (Div. 3)
    题目链接A.遍历字符串,用map记录下每个字符出现的次数最后遍历26个字母,若出现了相应次数答案+1#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){intn;cin>>n;strings;cin>>s;map<char,int>mp;......
  • 【解题报告】CodeForces523D:Statistics of Recompressing Videos
    CF523D解题报告CF523D先上结果:前两次语言选错了,编译一直不过(做这题是因为集训老师让我做我就做了,要不然我都快忘了我有CF账号了(思路省流:STL大法开一个小根堆存目前正在运行的服务器(也可以大根堆,但是存时间进去的时候存负的),如果有空机就直接处理,这个视频处理完的时间就......
  • Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)
    思路:分类讨论:当一个数字出现的次数大于等于k,那么最多有k个能被染色,当一个数字出现的次数小于k,南那么这些数字都可能被染色还有一个条件就是需要满足每个颜色的数字个数一样多,这里记出现次数小于k的所有数字的出现次数总和为sum,将所有这些数字排序后,前sum-sum%k个数字是都可以......
  • Codeforces Round 919 (Div. 2)
    A一笔带过,维护可能的最大值和最小值,并对于3操作特殊维护一下即可。B枚举第一个人删多少个数(贪心的想,一定删最大的几个,因为假如留着一定会对第二个人有利)第二个人一定是翻的越多越好,且翻的都是最大的几个数。使用前缀和容易计算答案。C妙妙题。枚举\(k\),接着发现\(a_i......
  • Codeforces Round 799 (Div. 4)G. 2^Sort
    暴力枚举每一个端点然后去check显然是复杂度为\(O(n^2)\)是来不及的。我们考虑大区间满足小区间一定满足,用两个指针维护一下当前满足不等式的区间,然后长度达到就计算答案。思路很简单,主要是这类双指针的题目里面的一些细节需要注意为了更好写我们总是先维护区间然后再计算答......
  • [Flink] Flink源码分析 : BoundedOutOfOrdernessTimestampExtractor
    0序言0.1缘起importorg.apache.flink.api.common.functions.MapFunction;importorg.apache.flink.api.java.tuple.Tuple;importorg.apache.flink.api.java.tuple.Tuple3;importorg.apache.flink.configuration.Configuration;importorg.apache.flink.configuration.......
  • Codeforces Round 922 (Div 2)
    CodeforcesRound922(Div.2)A-BrickWall贪心的去想水平的越多越好,k随意改,那么可以构造出没有垂直的,那么计算水平的有几块就行#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineAcodeios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#def......
  • Codeforces Round 922 (Div. 2)
    https://codeforces.com/contest/1918题目很有意思。A~Dvp中过了,但是太太太慢,亟须复健。E赛后过的,交互题真是难调!F看题解过的A.BrickWall*800用砖头砌墙有形状\(1\timesk\)的水平砖和形状\(k\times1\)的竖直砖,要不重不漏地铺满\(n\timesm\)的区域,问水平砖数量......