Game
题目描述:
小 A 和小 B 在玩一个游戏,他们两个人每人有 𝑛 张牌,每张牌有一个点数,并且在接下来的 𝑛 个回合中每回合他们两人会分别打出手中的一张牌,点数严格更高的一方得一分,然而现在小 A 通过某种神秘的方法得到了小 B 的出牌顺序,现在他希望规划自己的出牌顺序使得自己在得分尽可能高的前提下出牌的字典序尽可能大。
输入:
第一行一个正整数 𝑛 表示游戏进行的轮数。
接下来一行 𝑛 个整数,第 𝑖 个数表示第 𝑖 轮小 B 将要打出的牌的点数。
接下来一行 𝑛 个整数,表示小 A 拥有的牌的点数。
输出:
输出一行 𝑛 个整数,表示小 A 出牌的顺序。
这道题也是看起来挺简单的。
但是就当我什么话也没说。
考场的时候推了一个错误的贪心,大概就是先从小到大选,然后贪心地更改选中的数的值。然后这贪心是不是很傻啊?刚想出来三秒钟就想到反例了。
然后想了60pts的暴力,就去写后面两题了。
这道题事实上就是贪心。
首先我们可以求出来最大得分。
然后我们按位进行贪心。由于选的数具有二分性,所以可以用二分来判断。
其实这样的方法考场也不是没想过,但是这个最大值如何维护我就不会了。
所以看了 T J TJ TJ以后恍然大悟可以用线段树。
然后那些乱七八糟找前驱后继的就懒得写 S p l a y Splay Splay直接用 S e t Set Set了
(好像说的我会写 S p l a y Splay Splay一样
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100010;
inline void read(int &x)
{
char ch = getchar(); x = 0;
for(;ch < '0' || ch > '9';) ch = getchar();
for(;ch >=