0%

Codeforces Round 1082 (Div. 2)-CF-1082-D. Recollect Numbers(太简单了,后悔花太多时间在C2上了)

题目大意

题目大意

2n2n 张卡片排成一排,卡片上分别写着数字 1,1,2,2,,n,n1, 1, 2, 2, \dots, n, n,初始时全部背面朝上。

你将使用以下“贪心”策略来进行翻牌游戏,每回合精确地翻开两张卡片:

  1. 如果你之前已经翻开过(且未被消除)两张数字相同的卡片,则直接翻开并消除它们。

  2. 否则,翻开从左到右第一张从未被翻开过的卡片,设其数字为 xx

  3. 接着,如果之前已经翻开过另一张数字为 xx 的卡片,则翻开并消除它。

  4. 否则,再次翻开从左到右第一张从未被翻开过的卡片。如果这两张卡片数字相同,则消除;如果不同,则重新翻回背面。

给定 nnkk,要求构造一个 11nn 各出现两次的排列,使得上述算法恰好需要 kk 个回合才能消除所有卡片。如果存在这样的排列,输出 YES 并输出该排列;否则输出 NO

输入格式

第一行包含一个整数 tt1t1031 \le t \le 10^3),表示测试数据组数。
接下来每组数据包含一行,包含两个整数 nnkk1n3×1051 \le n \le 3 \times 10^51k1061 \le k \le 10^6)。
保证所有测试数据中 nn 的总和不超过 3×1053 \times 10^5

输出格式

如果不存在满足条件的卡片排列,输出一行 NO
如果存在,输出一行 YES,并在下一行输出 2n2n 个整数 a1,a2,,a2na_1, a_2, \dots, a_{2n}1ain1 \le a_i \le n),表示卡片上的数字排列。如果有多个合法的排列,输出任意一个即可。

样例输入

1
2
3
4
5
6
7
6
2 3
3 4
3 2
3 5
6 10
6 67

样例输出

1
2
3
4
5
6
7
8
9
10
YES
2 1 2 1
YES
1 3 2 2 1 3
NO
YES
1 2 3 1 2 3
YES
2 1 3 4 5 4 1 2 6 5 6 3
NO

样例解释

对于第一组样例,初始排列为 2 1 2 1,每回合的操作如下:

  • 11 回合:翻开第一张未翻过的卡片(数字 22),之前没有记录,接着翻开下一张未翻过的卡片(数字 11)。数字不同,翻回背面。此时记下前两张卡片的数字为 2211

  • 22 回合:翻开第一张未翻过的卡片(第三张,数字 22),由于之前已经翻开过数字为 22 的卡片(第一张),因此翻开第一张,两张卡片相同并消除。

  • 33 回合:翻开第一张未翻过的卡片(第四张,数字 11),由于之前已经翻开过数字为 11 的卡片(第二张),因此翻开第二张,两张卡片相同并消除。
    游戏结束,共花费 33 个回合。

对于第四组样例,初始排列为 1 2 3 1 2 3,每回合的操作如下:

  • 11 回合:翻开第一、第二张从未翻过的卡片,数字分别为 1122。数字不同,翻回背面。

  • 22 回合:翻开第三、第四张从未翻过的卡片,数字分别为 3311。数字不同,翻回背面。

  • 33 回合:此时发现之前翻开过(且未消除)的卡片中存在两张数字相同的卡片(第一张和第四张均为 11),触发规则第一条,直接翻开这两张卡片并消除。

  • 44 回合:没有两张已翻开且相同的卡片。翻开第五张卡片(数字 22),由于之前翻开过数字 22(第二张卡片),因此翻开第二张卡片并消除。

  • 55 回合:翻开第六张卡片(数字 33),由于之前翻开过数字 33(第三张卡片),因此翻开第三张卡片并消除。
    游戏结束,算法恰好在 k=5k=5 回合赢得游戏。

注意啊,这是一个翻牌游戏,就是一开始你是不知道这些数字,它的大小,你需要翻开来你才知道。

image

思路讲解

这个题实在是太简单了,我操,哎呀,真的是后悔为什么没看这题。

image

不难发现,在这种位置交换一下,就会增加一次这个轮数,那么你就把所有的这些位置,就是你就交换他要求的这个轮数啊,当然是比N多的这个轮数然后就就好了。也就是把我们所找到的这个位置交换我们代码当中的REM次就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
ll rem=K-N;
for (int cnt=1,i=2;cnt<=rem;++cnt,i+=2) {
if (i>=N2) {
cout<<"NO\n";
return;
}
swap(ans_ls[i],ans_ls[i+1]);
}
cout<<"YES\n";
for (int i=1;i<=N2;++i) {
cout<<ans_ls[i]<<" ";
}
cout<<"\n";

AC代码

https://codeforces.com/contest/2202/submission/364156796