首页 > 其他分享 >CF1895E Infinite Card Game 题解

CF1895E Infinite Card Game 题解

时间:2024-01-19 19:11:30浏览次数:35  
标签:int 题解 REP suf2 Game suf1 ans Infinite se

Solution

  • 根据贪心策略,可以发现出完一张牌后对手的出牌是固定的。同理可以算出 Monocarp 出完一张牌 \(a\) 后下一次出的牌 \(to_a\)。
  • \(a\) 和 \(to_a\) 胜负状态相同。可以发现对所有 \(a\) 建 \(a\to to_a\) 后形成的图是内向基环树,一遍 dfs 即可求出答案。

时间复杂度 \(\mathcal{O}(n\log n)\)(将 \(n,m\) 看作同阶)。

Code

#include <bits/stdc++.h>
#define REP(i, l, r) for (int i = (l); i <= (r); ++ i)
#define DEP(i, r, l) for (int i = (r); i >= (l); -- i)
#define fi first
#define se second
using namespace std;
namespace Milkcat {
    typedef long long LL;
    typedef pair<LL, LL> pii;
    const int N = 1e6 + 5;
    LL n, m, suf1[N], suf2[N], qwq[N], to[N], ans[N], res[3]; pii a[N], b[N];
    int dfs(int u) {
    	if (ans[u] != -1) return ans[u];
		return ans[u] = 1, ans[u] = dfs(to[u]);
	}
    int main() {
		cin >> n;
		REP(i, 1, n) cin >> a[i].fi;
		REP(i, 1, n) cin >> a[i].se;
		cin >> m;
		REP(i, 1, m) cin >> b[i].fi;
		REP(i, 1, m) cin >> b[i].se;
		sort(a + 1, a + 1 + n);
		sort(b + 1, b + 1 + m);
		
		suf1[n + 1] = suf2[m + 1] = 0; 
		DEP(i, n, 1) suf1[i] = (a[i].se > a[suf1[i + 1]].se ? i : suf1[i + 1]); 
		DEP(i, m, 1) suf2[i] = (b[i].se > b[suf2[i + 1]].se ? i : suf2[i + 1]);
		REP(i, 1, m) qwq[i] = suf1[lower_bound(a + 1, a + 1 + n, pii(b[i].se + 1, 0)) - a];
		
		REP(i, 1, n) {
			int x = suf2[lower_bound(b + 1, b + 1 + m, pii(a[i].se + 1, 0)) - b];
			if (!x) { ans[i] = 0; continue; }
			if (!qwq[x]) { ans[i] = 2; continue; }
			to[i] = qwq[x], ans[i] = -1;
		}
		memset(res, 0, sizeof res);
		REP(i, 1, n) {
			if (ans[i] == -1) dfs(i);
			res[ans[i]] ++;
		}
		REP(i, 0, 2) cout << res[i] << ' ';
		cout << '\n';
		
        return 0;
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int T = 1; cin >> T;
    while (T --) Milkcat::main();
    return 0;
}

标签:int,题解,REP,suf2,Game,suf1,ans,Infinite,se
From: https://www.cnblogs.com/Milkcatqwq/p/17975410

相关文章

  • /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found问题解决
    有一个go实现的项目代码最近有更新,自己在开发环境上手动构建并运行都没有问题(构建和运行时相同环境,肯定没有问题^_^)。后面通过jenkins构建镜像也没有问题,运行时却报错 之前的版本在jenkins上构建也是成功的,后沟通得知jenkins集群版本最近有更新 那么,大概知道原因了,由于jenk......
  • CF1214E题解
    PetyaandConstructionSet题目传送门题解一个构造题,结论挺容易猜的。观察到关键信息:\(d_i\len\)。所以我们先把所有奇数编号的点按对应的\(d\)从大到小组成一条链,然后依次考虑偶数号点应该接在链上的哪个点后,容易知道这个点为链上的第\(i+d-1\)个。特殊的,如果接在了最后......
  • CF150C题解
    SmartCheater题目传送门题解首先显然的,每个乘客是独立计算的,然后我们发现,一个乘客在\(i\)到\(i+1\)不买票的期望贡献是一定的,为\(\dfrac{x_{i+1}-x_i}{2}-c*p_i\),所以我们其实就是要对于每个乘客的区间求最大子段和,简单线段树板子,感觉也没啥细节。代码:#include<bits/st......
  • CF1286C1题解
    Madhouse(Easyversion)题目传送门题解这种水题还能有蓝?不能因为困难版是黑就把简单版难度往上强拉啊!第一次问\([1,n]\),第二次问\([1,n-1]\),把读入的所有字符串先各自内部把字符排序(反正本来就是乱序)后存入map,第一次询问有,第二次询问没有的字符串就是原串后缀的乱序,都找出......
  • NOIP2023题解
    目录NOIP2023T1词典(dict)T2三值逻辑(tribool)T3双序列拓展(expand)T4天天爱打卡(run)NOIP2023T1词典(dict)考察:贪心题解Link题目传送门首先任意多次操作本质就是随意排序,所以如果要使\(w_i\)最小,我们一定会使\(w_i\)从\(a\)到\(z\)排,其它都\(z\)到\(a\)排......
  • CF1899G题解
    UnusualEntertainment题目传送门题解真的不要太典,,,考虑点\(u\)是\(v\)的后代等价于\(u\)在子树\(v\)中,dfs序直接走起,变成判断是否存在\(i\)使得:\[in_x\lein_{p_i}\leout_x,l\lei\ler\]二维数点,启动!代码:#include<bits/stdc++.h>usingnamespacestd;#defi......
  • CF1899F题解
    Alex'swhims题目传送门题解构造题,感觉比G更难?可能是我不擅长构造。考虑点的度数,发现一次操作\(u,v_1,v_2\)会使\(deg_{v_1}\)减\(1\),使\(deg_{v_2}\)加\(1\),即一次操作最多减少一个叶子,那如果存在一个时刻使我们的叶子数量大于\(3\)个,下一次若问\(n-1\)则直接......
  • P6550题解
    P6550[COCI2010-2011#2]LUNAPARK题目传送门题解论证简单,构造逆天(好吧其实就是烦了点)。每个格子是正整数,所以我们必然尝试多走格子。我们发现,只要\(r,c\)中有一个是奇数,我们就可以全部走到,构造很简单:我们找准奇数边,假设是\(r\),蛇形地走,显然在奇数行我们会结束在末尾,在偶数......
  • P5133题解
    P5133tb148的客人题目传送门题解唯一的一篇题解还是交错题的……很简单的一个二分加差分题。显然是二分答案,考虑检验。如果\(2mid+1\gen\),那么所有人可以自由去到任意位置,一定可行;否则,我们求出每个人可以去到的区间范围,并以此推出要满足这个人的限制,\(1\)号需要在哪个区......
  • P3867题解
    P3867[TJOI2009]排列计数题目传送门题解\(k\)很小,不是分讨就是突破口。如果我们用这种方式生成排列:将\(1\)到\(n\)按顺序插入当前状态,那么你会发现当前的数\(x\)的插入被很大程度的限制住了,我们只需记录当前\(x-k\)到\(x-1\)的位置即可枚举出所有可能的下一状态,因......