首页 > 其他分享 >AT_agc064_c [AGC064C] Erase and Divide Game 题解

AT_agc064_c [AGC064C] Erase and Divide Game 题解

时间:2024-10-22 16:35:47浏览次数:6  
标签:node AGC064C Divide 题解 ll scanf pb s2 s1

先考虑所有 \(l_i=r_i\) 时怎么做,可以建出反向 Trie 树,问题转化为从根开始每次向左子树或右子树走,第一个拿到空子树的人输,直接在 Trie 上 dp 即可。

考虑从叶子层开始对每一层的点合并两个子树的 dp 值,发现每一层值相同的连续段是较少的。于是可以维护这些连续段,每次合并要将每个 \(f_i\) 与 \(f_{i+2^k}\) 合并,把连续段分成两部分双指针合并即可,时间复杂度 \(\mathcal O(N\log V)\)。

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
struct node{
	ll l,r;int x;
};
node operator+(node x,node y){
	return {max(x.l,y.l),min(x.r,y.r),x.x!=-1||y.x!=-1?x.x!=1||y.x!=1:-1};
}
int T,n;
vector<node>s,s1,s2;
signed main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n); 
		ll l,r,ls=0;
		s.clear();
		rept(i,0,n){
			scanf("%lld%lld",&l,&r);
			if(ls<l)s.pb({ls,l,-1});
			s.pb({l,r+1,1}),ls=r+1;
		}
		s.pb({ls,1ll<<60,-1});
		drep(i,59,0){
			ll k=1ll<<i;
			s1.clear(),s2.clear();
			for(node i:s){
				if(i.r<=k)s1.pb(i);
				else if(i.l>=k)s2.pb({i.l-k,i.r-k,i.x});
				else s1.pb({i.l,k,i.x}),s2.pb({0,i.r-k,i.x});
			}
			s.clear();
			for(auto i=s1.begin(),j=s2.begin();i!=s1.end()&&j!=s2.end();){
				ll r=min(i->r,j->r);
				s.pb(*i+*j);
				if(i->r==r)i++;
				if(j->r==r)j++;
			}
		}
		puts(s[0].x?"Takahashi":"Aoki");
	}
	return 0;
}

标签:node,AGC064C,Divide,题解,ll,scanf,pb,s2,s1
From: https://www.cnblogs.com/zifanoi/p/18493228

相关文章

  • 洛谷P2596 [ZJOI2006] 书架 题解 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P2596主要涉及的操作就是:找到某一个编号的点(这个操作可以不用splaytree维护)删除某个点将某一个点插入到最前面,最后面,或者某一个位置查询前序遍历为\(k\)的节点编号因为每次删除都会又把这个点加回去,所以可以复用\(n\)个......
  • [题解]CF825E Minimal Labels
    LPhang为什么是神?思路显然可以想到一个错误的贪心:直接拓扑排序,每一次选择当前可以拓展的点中最小的元素进行编号。由于可能存在一个值较小的元素被藏在一个较大的元素后面,这种贪心就会出问题。出问题的本质原因就是我们希望字典序最小,就得使得越小的位置分配到更小的值。不妨......
  • 历年CSP-J初赛真题解析 | 2017年CSP-J初赛完善程序(27-36)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客(快速幂)请完善下面的程序,该程序使用分治法求x......
  • CF2023D Many Games 题解
    赛时被创四了。思路考虑我们什么时候合并会比原来优。例如,我们现在要合并\(p_1,w_1\)和\(p_2,w_2\),同时保证,\(w_1\gew_2\)。那么有:\[\frac{p_1}{100}\timesw_1\le\frac{p_1}{100}\times\frac{p_2}{100}\times(w_1+w_2)\]\[\frac{p_2}{100}\timesw_2\le\frac{p_1}{......
  • 01 Eclipse使用Maven慢的问题解决
    1.Eclipse使用的是内置的MavenEclipse有可能使用了内置的Maven,而不是独立安装的Maven。如果使用Eclipse内置的Maven,默认的settings.xml可能并未生成。你可以按以下步骤检查或修改Maven设置路径:a.检查Eclipse使用的Maven配置点击Window->Preferences在......
  • 【题解】Solution Set - NOIP2024集训Day58 字符串
    【题解】SolutionSet-NOIP2024集训Day58字符串https://www.becoder.com.cn/contest/5658「CF1466G」SongoftheSirens考虑对于\(s_i\),算钦定必须覆盖到\(t_i\)的匹配个数\(f_i\)。注意到\(s\)每次长度都会\(\times~2\)左右,其长度在\(O(\log|w|)\)的时候就......
  • noi.ac775题解
    Gameb文件OI:gameb时限:1000ms空间:512MiBAlice和Bob正在玩一个游戏。具体来说,这个游戏是这样的,给定一个数列,从Alice开始,两个人轮流操作,每次操作可以从数列的头部或者尾部删去一个数字,当这个数列满足一定条件的时候,最后一次操作的人获胜。如果一开始就满足条......
  • ZZJC新生训练赛第七场题解
    难度分类(同一难度下按字典序上升)入门:C简单:G,D中等:E,H,F,A困难:BC-解题思路数一下每个字母的数量看是不是偶数就可以得到答案。C-代码实现#include<bits/stdc++.h>intmain(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout......
  • NOI2024 D1T1 - 集合 题解
    观察我们称\(x\)在一段序列中的“位置集合”为\(x\)出现的下标的集合。注意到,两段序列能够匹配,当且仅当两段序列的\(1\simm\)中的数的位置集合构成的多重集相等。快速比较集合,考虑哈希。哈希先实现一个从整数到整数的哈希\(f(x)\)。使用这个哈希的目的是为了提高随机......
  • 题解 P11220 / MX241020D【【MX-S4-T4】「yyOI R2」youyou 的三进制数】
    好长的标题题目描述现在有\(0\simn\)共\(n+1\)个数。定义\((x)_{3}\)表示十进制数\(x\)的三进制形式。如果没有特别强调,那么这些数均为十进制形式。youyou想构造一个序列长度为\(p\)(\(p\ge1\))的非负整数序列\(a\)。使之满足:\(a_i\in[0,n]\)。不存在\(i......