首页 > 其他分享 >CF516E Drazil and His Happy Friends 题解

CF516E Drazil and His Happy Friends 题解

时间:2024-02-27 22:03:06浏览次数:22  
标签:His int 题解 ll mx Drazil 快乐 男生 rep

题目传送门

记 \(d=\gcd(n,m)\),发现只有编号在模 \(d\) 意义下相同的人之间会产生影响,那么有解当且仅当每个剩余系内有至少一个人是快乐的。所以在 \(d>b+g\) 时直接输出 -1 即可。

对于剩下的情况,先令 \(n\leftarrow \frac n d,m\leftarrow \frac m d\),如果 \(n<m\) 那么把男女交换一下。考虑对每个剩余系分别算出最小的天数,最后再对 \(ans\times d+i\) 取个最大值即为答案。

对于一个剩余系,如果所有男女编号组成的集合大小等于 \(n\),那么它的答案一定 \(\le n\),可以直接求出来,先特判掉这种情况。那么对于剩下的情况,如果某一时刻男生全都是快乐的,所有人就都是快乐的,因为对于最后的 \(m\) 天,每个女生都恰好跟一个男生玩。

考虑求出使所有男生变快乐的最小天数。对于每个快乐的女生,将其编号对应的男生也标成快乐。如果编号为 \(i\) 的男生在第 \(t\) 天变快乐,那么编号为 \((i+m)\bmod n\) 的男生就会在第 \(t+m\) 天变快乐。考虑建一个图,对于每一个点 \(i\) 连一条边 \(i\xrightarrow{m} (i+m)\bmod n\) 连一条边,因为 \(\gcd(n,m)=1\),所以这个图形成了一个环。再对每个快乐的男生 \(i\) 连一条边 \(S\xrightarrow{i} i\),那么答案就是点 \(S\) 到每个点的最短距离的最大值。

对于每个快乐的男生求出从点 \(0\) 到他所经过的边的数量,按这个值将所有男生排序。

因为点 \(S\) 到男生 \(i\) 的最短距离不一定为 \(i\),所以要先更新两遍,每次枚举每个男生用他当前的最短距离更新环上下一个快乐的男生的最短距离,然后就得到了真正的最短距离。

记点 \(S\) 到男生 \(i\) 的距离为 \(d_i\),点 \(0\) 到他的距离为 \(p_i\),环上的下一个男生编号为 \(j\),那么该同余系的答案就是 \(\max_{i,j}\{d_i+((p_j-p_i)\bmod n-1)\cdot m\}\)。最后所有同余系的 \(ans\times d+i\)(\(i\) 是余数)取个最大值即可。

时间复杂度 \(\mathcal{O}((b+g)\log(b+g))\)。

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 200003
#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)
using namespace std;
int n,m,g,t1,t2,t,p[mxn],d[mxn],p1[mxn],p2[mxn];
set<int>st[mxn];
set<pair<int,int>>s;
vector<int>d1[mxn],d2[mxn];
bool v1[mxn],v2[mxn];
ll ans;
int exgcd(int a,int b,int &x,int &y){
	if(b==0){x=1,y=0;return a;}
	int d=exgcd(b,a%b,y,x);y-=x*(a/b);
	return d;
}
signed main(){
	scanf("%d%d",&n,&m);
	scanf("%d",&t1);
	rep(i,1,t1)scanf("%d",&p1[i]);
	scanf("%d",&t2);
	rep(i,1,t2)scanf("%d",&p2[i]);
	if(n<m)swap(n,m),swap(t1,t2),swap(p1,p2);
	g=__gcd(n,m);
	if(g>t1+t2){
		puts("-1");
		return 0;
	}
	rep(i,1,t1)st[p1[i]%g].insert(p1[i]/g),d1[p1[i]%g].pb(p1[i]/g);
	rep(i,1,t2)st[p2[i]%g].insert(p2[i]/g),d2[p2[i]%g].pb(p2[i]/g);
	n/=g,m/=g;
	int x,y;exgcd(n,m,x,y);
	y=(y%n+n)%n;
	rept(i,0,g){
		if(st[i].empty()){
			puts("-1");
			return 0;
		}
		if(st[i].size()==n){
			rept(j,0,n)v1[j]=v2[j]=0;
			for(int j:d1[i])v1[j]=1;
			for(int j:d2[i])v2[j]=1;
			ll mx=-1;
			rept(j,0,n)if(!v1[j]||!v2[j%m])mx=j,v1[j]=v2[j%m]=1;
			ans=max(ans,mx*g+i);
			continue;
		}
		s.clear();
		t=0;
		for(int j:st[i])s.insert({(ll)j*y%n,j});
		for(auto it:s)p[++t]=it.first,d[t]=it.second;
		rep(i,2,t)d[i]=min((ll)d[i],d[i-1]+(ll)m*(p[i]-p[i-1]));
		d[1]=min((ll)d[1],d[t]+(ll)m*(p[1]-p[t]+n));
		rep(i,2,t)d[i]=min((ll)d[i],d[i-1]+(ll)m*(p[i]-p[i-1]));
		d[1]=min((ll)d[1],d[t]+(ll)m*(p[1]-p[t]+n));
		ll mx=d[t]+(ll)(p[1]-p[t]+n-1)*m;
		rep(i,2,t)mx=max(mx,d[i-1]+(ll)(p[i]-p[i-1]-1)*m);
		ans=max(ans,mx*g+i);
	}
	cout<<ans;
	return 0;
}

标签:His,int,题解,ll,mx,Drazil,快乐,男生,rep
From: https://www.cnblogs.com/zifanoi/p/18038498

相关文章

  • [ARC140F] ABS Permutation (Count ver.) 题解
    洛谷题面传送门AT题面传送门发现不太好直接求,考虑将\(P\)映射到\(P^{-1}\)上,这样题目中的条件就变成了\(|P_i-P_{i+M}|=1\)。因此我们可以对模\(M\)的每个剩余系做\(M=1\)的情况,然后最后快速幂合并。考虑\(M=1\)的情况怎么做。记\(f_i\)表示\(K=i\)的方案数,......
  • [ARC112F] Die Siedler 题解
    题目传送门人类智慧题。发现\(2\)操作肯定是不劣的,所以能换则换。考虑将手上的牌转换成一个多进制的数,这样\(2\)操作就是其进位方法,\(1\)操作就是将当前的数加上牌包对应的数,答案就是其各位数字之和,不难发现其值为:\[\sum_{i=1}^nc_i\times2^{i-1}\times(i-1)!\]再考......
  • 2024.2.27模拟赛T2题解
    题目有一个神奇的结论\(\foralla<b<c,a\oplusc>min(a\oplusb,b\oplusc)\)然后就可以写出\(n^2\)dp,再用TRIE树优化即可code#include<bits/stdc++.h>usingnamespacestd;#defineN200005#defineintlonglongintn,k1,k2;inta[N],fl[2];constintm......
  • CF1392I Kevin and Grid 题解
    题目传送门\(\large\textbf{Statement.}\)给定两个序列\(a,b\),有一个\(n\timesm\)的网格图,每个点\((i,j)\)上有个权值\(a_i+b_j\),每个点和其上、下、左、右方相邻的点有连边。多次询问,每次给一个阈值\(x\),将图分为权值\(<x\)(蓝色)和\(\gex\)(红色)的两种连通块。一......
  • P10084 [GDKOI2024 提高组] 计算 题解
    题目传送门前置知识:单位根反演先考虑怎么求\(F(x,a,b)\),易得\(\gcd(x^a-1,x^b-1)=x^{\gcd(a,b)}-1\)。所以\(L=m^{\gcd(a,b)}+1,R=m^{\gcd(c,d)}\),然后发现\([L,R]\)中的数模\(m\)后每种余数出现次数相同,下面记其为\(n=\frac{R-L}{m}\)。考虑用生成函数做,易得答案为......
  • [ABC331G] Collect Them All 题解
    洛谷传送门AT传送门\(\textbf{Statement.}\)有\(M\)种颜色,用\(1\simM\)编号,每次抽奖抽中第\(i\)种颜色的概率为\(\frac{c_i}{N}\),其中\(\sumc_i=N\),求抽中每种颜色至少一次的期望次数。\(1\leM\leN\le2\times10^5\)。\(\textbf{Solution.}\)发现直接求不好......
  • [ARC087F] Squirrel Migration 题解
    洛谷题面AT题面如果两条路径不存在交点,则两条路径各选一个端点交换后两路径相交,答案不会变劣。考虑所有路径两两相交的情况,因为图是一棵树,所以这些路径会交于一点。以这个点为根,那么最大的子树大小一定不超过\(\fracn2\),所以这个点是树的重心,每条路径的端点一定在两个不......
  • 个人题解:2024 年湖北省省队选拔集训暨能力测试 第一试
    时与风对每条边进行BFS。二维偏序部分用vector存一下就行了。花神诞日引理:对于\(a<b<c\),\(\min(a\text{XOR}b,b\text{XOR}c)\leqa\text{XOR}c\)。证明:考虑比较\(a,c\)二进制下第一位不同,也就是\(a=(X0\dots)_{(2)},c=(X1\dots)_{2}\)。因为\(b\in(a,c)\)所以......
  • CSP-S 2023 题解
    T1一开始所有密码都没被标记。对于每个输入的状态枚举一遍所有没标记的密码,判断是否可能是正确密码,如果不行就标记一下。最后输出没被标记的密码个数。总共只有\(10^5\)个密码,可以轻松通过。难度:橙。T2见CF1223FStackExterminableArrays题解。难度:蓝。T3大模拟,直......
  • 2024牛客寒假算法基础集训营5 题解 ( A,C,G,H,I,L,M )
    2024牛客寒假算法基础集训营5题解(A,C,G,H,I,L,M)A mutsumi的质数合数题意有一个由\(n\)个正整数组成的数组,她想知道数组中质数和合数共有几个。思路由质数和合数的定义可知,正整数范围内除\(1\)外,要么是质数要么是合数,本题直接统计不是\(1\)的正整数的个数即可代码......