1.cf C. Nastia and a Hidden Permutation https://codeforces.com/contest/1521/problem/C
交互题:题目大意,T组测试样例,每组输入一个n,代表一个n个数的序列,序列数字1~n,各不相同,每次可以用以下两种方式询问
t
=
1
:
m
a
x
(
m
i
n
(
x
,
p
i
)
,
m
i
n
(
x
+
1
,
p
j
)
)
;
t=1: max(min(x,pi),min(x+1,pj));
t=1:max(min(x,pi),min(x+1,pj));
t
=
2
:
m
i
n
(
m
a
x
(
x
,
p
i
)
,
m
a
x
(
x
+
1
,
p
j
)
)
.
t=2: min(max(x,pi),max(x+1,pj)).
t=2:min(max(x,pi),max(x+1,pj)).
要求不超过3*n/2+30次询问,确定该序列,并输出。(注意按照交互题的询问和输出方式进行,具体看原题)
思路:首先明确如果我们能找到该序列的最大值,即n,然后对于其他的值我们就很容易确定了,即通过
不妨令pj=n, 则通过: t=2: min(max(1,pi),max(2,pj)).(pj=n); 可以n-1次确定其他的值,
接下来就是怎么找到最大值,
通过t=1: val = max(min(n-1,pi),min(n,pj));
要么pi=n,要么pj=n。
(1)如果pj=n,则val=n。如果val=n,那么情况也是唯一的,即pj=n,因为min(n-1,pi)不可能产生n,只有在min(n,pj)可能出现n,而出现n 的唯一方式就是pj=n,所以一旦val=n,则pj=n。
(2)如果pi=n,则val=n-1,但val=n-1,pi不一定是n,所以不能通过val=n-1来确定pi=n。所以需要pi,pj进一步验证pi是不是n,如果不是则继续。val=n-1的情况三种:pi=n,pi=n-1,pj=n-1,所以最多需要询问n/2+3次。
接下来n-1次t=2询问,来确定其他的数
2.C. Berland Regional https://codeforces.com/contest/1519/problem/C
模拟题:题目大意不好表述,通过题目链接了解大意。
思路很好想,关键是优化,如果纯暴力枚举k,枚举学校,人数,肯定超时。
最简单的优化,离散化处理学校,然后将每个学校的学生能力值从大到小排序,并记录前缀和。
仅仅这样还不够,接下来是分块,用O(1)时间复杂度输出一个学校的战力。可以发现每个学校派出的最多的人数为
该学校人数/组数(下取整)* 组数,这样就可以用O(1)的时间算出一个学校的能力值了。
仅仅这样还是不行,继续优化,根据学校人数,从大到小排序,第一次出现k>总人数的情况就可以直接break了。
虽然还是二重循环,但因为break的存在,会有很多无效的循环,类似于剪枝。