首页 > 其他分享 >QOJ 1963 Squid Game

QOJ 1963 Squid Game

时间:2024-01-24 09:04:54浏览次数:24  
标签:std le frac bmod Squid Game swap 考虑 QOJ

令 \(a\le b\le c\)。
这显然是可以通过交换得到的。

考虑若 \(a = 1\) 怎么做。
考虑到若把 \(b\) 或者 \(c\) 给 \(a\),\(a\) 就会翻倍。
那就把 \(b\) 拆成二进制,考虑让 \(b\) 变为 \(0\)。
从低位到高位,如果 \(b\) 这一位为 \(1\) 就让 \(b\) 给 \(a\),否则 \(c\) 给 \(a\)。
那么 \(b\) 最高的一位 \(1\) 也没了后 \(b\) 就为 \(0\) 了。
因为 \(c\ge b\),所以让 \(c\) 消的那一部分是肯定比 \(c\) 小的。
操作次数 \(O(\log V)\)。

再考虑 \(a \not = 1\)。
那么接下来消就相当于是消 \(\lfloor\frac{b}{a}rfloor\) 的二进制。
那么最后得到的就是 \(b\bmod a\),考虑拿其当作下一轮的 \(a\)。
但这样复杂度有点错误,可能 \(b\bmod a = a - 1\),那就会有很多轮。
考虑当 \(b\bmod a \le \frac{a}{2}\) 时用其。
否则 \(a - b\bmod a \le \frac{a}{2}\),就用其作为下一轮的 \(a\)。

考虑怎么求出 \(a - b\bmod a\)。
那就相当于是消 \(\lfloor\frac{b}{a}\rfloor + 1\),但是特殊的是在最高位的 \(1\) 变为 \(a\) 给 \(b\)。

因为下一轮的 \(a'\le \frac{a}{2}\),所以最多只会有 \(O(\log V)\) 轮。
总操作次数 \(O(\log^2 V)\)。

#include<bits/stdc++.h>
using i64 = long long;
int main() {
    i64 a, b, c; scanf("%lld%lld%lld", &a, &b, &c);
    int ia = 1, ib = 2, ic = 3;
    std::vector<std::pair<int, int> > ans;
    auto pre = [&]() {
        a > b && (std::swap(a, b), std::swap(ia, ib), 1);
        a > c && (std::swap(a, c), std::swap(ia, ic), 1);
        b > c && (std::swap(b, c), std::swap(ib, ic), 1);
    };
    while (pre(), a) {
        i64 v = b / a;
        for (int i = 0; v; i++, a <<= 1) {
            if (v >> i & 1ll) {
                v ^= 1ll << i;
                b -= a;
                ans.emplace_back(ib, ia);
            } else {
                c -= a;
                ans.emplace_back(ic, ia);
            }
        }
    }
    printf("%zu\n", ans.size());
    for (std::pair<int, int> x : ans) printf("%d %d\n", x.first, x.second);
    return 0;
}

标签:std,le,frac,bmod,Squid,Game,swap,考虑,QOJ
From: https://www.cnblogs.com/lhzawa/p/17983804

相关文章

  • QOJ7206 Triple
    QOJ传送门大分讨恶心题。首先施容斥,变成求\(\sum|AB|>\max(|AC|,|BC|)\)。遇到这种三个点的路径问题,可以找出一个点\(X\),使得\(A,B,C\)在\(X\)的不同子树内,也就是\(A\toB,A\toC,B\toC\)的路径的唯一一个交点\(X\)。那么:\[[|AB|>\max(|AC|,|BC|)]=......
  • AT_arc170_d Triangle Card Game
    当Alice先出了一张牌\(A\),Bob又出了一张\(B\),分类讨论一下。当\(B\leqA\),如果Alice不再出一张\((A-B,A+B)\)中的牌Bob就赢了,所以这种情况Bob会出最小的牌。当\(B>A\),如果Alice不再出一张\((B-A,B+A)\)中的牌Bob就赢了,这时无法贪心,对每个\(B_i\)考虑,找到......
  • AtCoder Regular Contest 170 D Triangle Card Game
    洛谷传送门AtCoder传送门赛后调了40min,哈哈。首先先把\(a,b\)排序。考虑先枚举Alice选的数\(a_i\),然后若\(\forallj,\existsk\nei,(a_i,b_j,a_k)\)能组成三角形,Alice就赢了。考虑简化条件。\((x,y,z)\)能形成三角形的充要条件是\(z\in(|x-y|,x+......
  • QOJ 2486 Build the String
    考虑当字符串全为\(\texttt{b}\)时,可以通过\(\text{copy}\)\(n-1\)次再\(\text{fuse}\)\(n\)次。这启发从连续段来做,先按顺序构造出一个个连续段,最后\(\text{fuse}\)合为这个串。若第一个连续段为\(\texttt{a}\),则可以通过\(\text{swap}\)事先交换\(\texttt{ab}......
  • QOJ 4996 Icy Itinerary
    先转化题目条件。发现把\(n\)个点划分为\(2\)个点集,满足其中一个点集存在哈密顿路,另一个点集在补图中存在哈密顿路和原问题是等价的。令直接存在哈密顿路的点集为\(X\),其路径端点分别为\(S_X,T_X\);补图中存在哈密顿路的点集为\(Y\),路径端点分别为\(S_Y,T_Y\);考虑\(......
  • CF1895E Infinite Card Game 题解
    Solution根据贪心策略,可以发现出完一张牌后对手的出牌是固定的。同理可以算出Monocarp出完一张牌\(a\)后下一次出的牌\(to_a\)。\(a\)和\(to_a\)胜负状态相同。可以发现对所有\(a\)建\(a\toto_a\)后形成的图是内向基环树,一遍dfs即可求出答案。时间复杂度\(\m......
  • [AGC048D] Pocky Game 题解
    题目链接点击打开链接题目解法好难的题,想不出来一点!!!首先给出一个第一个结论:最优策略下,每个人每次只会取一个石子或者取完一堆石子题解区都没有严谨证明,\(at\)的\(editorial\)也没证,所以我只能感性理解:下面以先手为例。如果最左边的石子数\(>\)其余所有堆的石子数,那么先......
  • 13 Jellyfish and Game
    JellyfishandGame因为n,m很小,所有直接暴力就行#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ intn,m,k; cin>>n>>m>>k; vector<int>a(n+1); vector<int>b(m+1); for(inti=1;i<=n;i++)cin>......
  • otterctf内存取证-----4 - Name Game
    otterctf内存取证-----4-NameGame看到这题目,看看是不是浏览器登录,无果。这里似乎没有跟题干相关的答案。游戏登录了,登录进程里是不是包含账户信息,把进程dump下来看看。频道后面是不是账户名字,果然猜对了,上面都是假想自己做出来的,感觉蛮有意思的,所以记录下来,进程里居然也能藏历......
  • 使用 Python 和 Pygame 制作游戏:第六章到第八章
    第六章:贪吃虫原文:inventwithpython.com/pygame/chapter6.html译者:飞龙协议:CCBY-NC-SA4.0    如何玩贪吃虫贪吃虫是Nibbles的克隆。玩家开始控制一个不断在屏幕上移动的短蠕虫。玩家无法停止或减慢蠕虫,但他们可以控制它转向的方向。红苹果随机出现在屏幕上,玩家必......