Codeforces 题面传送门 & 洛谷题面传送门

首先思考一个非常简单的性质:记 \(d=\gcd(n,m)\),那么每次在一起吃完饭的男女孩编号必定与 \(d\) 同余,而根据斐蜀定理可以得到另一方面的结论:对于每一个 \(\bmod d\) 的剩余类,如果其中至少有一个男孩/女孩是快乐的,那所有与这样的男孩/女孩编号 \(\bmod d\) 同余的男孩/女孩最终都会变得快乐。

这样 \(-1\) 的情况就很好判断了:只要检查每个 \(\bmod d\) 的剩余类都至少有一个男孩/女孩是快乐的即可,特别地,如果 \(d>b+g\) 那答案肯定是 \(-1\),而显然要解决答案不是 \(-1\) 的情况,只需要对每个 \(\bmod d\) 的剩余类 \(x\) 都做一遍 \(n,m\) 的互质的情况,设其答案为 \(ans\),然后令答案对 \(ans\times d+x\) 取 \(\max\) 即可。

考虑如何解决 \(n,m\) 互质的情况,考虑同余最短路(怎么想到的/bx,实是神仙),我们考虑这样建图:

  • 对于每个快乐的男孩 \(b\),连一条 \(S\to b\),权值为 \(b\) 的边。
  • 对于每个快乐的女孩 \(g\),连一条 \(S\to g\bmod n\),权值为 \(g\) 的边,表示这个女孩 \(g\) 最早会在 \(g\) 时刻带动男孩 \(g\bmod n\) 变得快乐。
  • 对于每个男孩 \(i\),连边 \(i\to(i+m)\bmod n\),权值为 \(m\),表示如果 \(i\) 变得快乐,那么 \(m\) 时间以后 \((i+m)\bmod n\) 也会变得快乐。

跑最短路即可,最后我们取源点到所有一开始不快乐的男孩距离的最大值,就是所有男孩变得快乐的时间的最大值,然后再对所有女孩做一遍同样的操作即可。

直接建图跑 dijkstra 复杂度是 \(n\log n\) 的,无法通过。我们发现第三类边构成了一个环,因此这个模型可以视作一个环上加了一些源点连到环上某个点的边,要求源点到所有非关键点的距离最大值,而关键点个数很小,因此我们考虑将关键点压进一个 set,然后对于两个相邻关键点 \(l,r\) 路径上的所有点,显然到源点距离最大的肯定是 \(r-1\),因此我们 \(\mathcal O(k)\) 地算出所有这样的 \(r-1\) 到源点的距离,然后取 \(\max\) 即可,这样复杂度就降到了 \(k\log k\),其中 \(k\) 为关键点个数。

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define mt make_tuple
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef long double ld;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){return (!x)?void():(recursive_print(x/10),putc(x%10^48),void());}
template<typename T> void print(T x){(!x)&&(putc('0'),0);(x<0)&&(putc('-'),x=~x+1);recursive_print(x);}
template<typename T> void print(T x,char c){print(x);putc(c);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
const int MAXN=2e5;
const ll INFll=0x3f3f3f3f3f3f3f3fll;
int n,m,B,G,N,M;
vector<int> b[MAXN+5],g[MAXN+5];
int gcd(int x,int y){return (!y)?x:gcd(y,x%y);}
void exgcd(int x,int y,int &a,int &b){
if(!y) return a=1,b=0,void();exgcd(y,x%y,a,b);
int tmp=a;a=b;b=tmp-(x/y)*b;
}
int getinv(int a,int mod){
int x,y;exgcd(a,mod,x,y);
return (x+mod)%mod;
}
ll solve(vector<int> &b,vector<int> &g,int n,int m){
map<int,bool> in;map<int,int> dis;set<int> pos;
for(int x:b){in[x]=1;pos.insert(x);dis[x]=x;}
for(int x:g){
pos.insert(x%n);
if(!dis.count(x%n)) dis[x%n]=x%n;
else chkmin(dis[x%n],x%n);
} int iv=getinv(m,n);
vector<pair<int,pii> > vec;int pos0=(*pos.begin());
for(int p:pos) vec.pb(mp(1ll*(p-pos0)*iv%n,mp(dis[p],in[p])));
vec.pb(mp(n,mp(0,1)));sort(vec.begin(),vec.end());ll mx=-1;
// for(int i=0;i<vec.size();i++) printf("%d %d %d\n",vec[i].fi,vec[i].se.fi,vec[i].se.se);
// printf("\n");
for(int i=1;i<vec.size();i++) if(!vec[i-1].se.se||vec[i].fi!=vec[i-1].fi+1)
chkmax(mx,1ll*(vec[i].fi-vec[i-1].fi-1)*m+vec[i-1].se.fi);
// printf("%d\n",mx);
return mx;
}
int main(){
scanf("%d%d",&n,&m);int d=gcd(n,m);N=n/d;M=m/d;
if(d>MAXN) return puts("-1"),0;
scanf("%d",&B);for(int i=1,x;i<=B;i++) scanf("%d",&x),b[x%d].pb(x/d);
scanf("%d",&G);for(int i=1,x;i<=G;i++) scanf("%d",&x),g[x%d].pb(x/d);
for(int i=0;i<d;i++) if(b[i].empty()&&g[i].empty()) return puts("-1"),0;
ll res=0;
for(int i=0;i<d;i++){
chkmax(res,1ll*d*solve(b[i],g[i],N,M)+i);
chkmax(res,1ll*d*solve(g[i],b[i],M,N)+i);
} printf("%lld\n",res);
return 0;
}

Codeforces 516E - Drazil and His Happy Friends(同余最短路)的更多相关文章

  1. Codeforces 986F - Oppa Funcan Style Remastered(同余最短路)

    Codeforces 题面传送门 & 洛谷题面传送门 感谢此题教会我一个东西叫做同余最短路(大雾 首先这个不同 \(k\) 的个数 \(\le 50\) 这个条件显然是让我们对每个 \(k\) ...

  2. CodeForces - 516B Drazil and Tiles(bfs)

    https://vjudge.net/problem/CodeForces-516B 题意 在一个n*m图中放1*2或者2*1的长方形,问是否存在唯一的方法填满图中的‘.’ 分析 如果要有唯一的方案, ...

  3. CodeForces 515C. Drazil and Factorial

    C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  4. CodeForces 515B. Drazil and His Happy Friends

    B. Drazil and His Happy Friends time limit per test 2 seconds memory limit per test 256 megabytes in ...

  5. codeforces 515C. Drazil and Factorial 解题报告

    题目链接:http://codeforces.com/problemset/problem/515/C 题目意思:给出含有 n 个只有阿拉伯数字的字符串a(可能会有前导0),设定函数F(a) = 每个 ...

  6. codeforces 515A.Drazil and Date 解题报告

    题目链接:http://codeforces.com/problemset/problem/515/A 题目意思:问能否从 (0, 0) 出发,恰好走 s 步,到达该位置(a, b). 首先容易知道, ...

  7. codeforces 515B. Drazil and His Happy Friends 解题报告

    题目链接:http://codeforces.com/problemset/problem/515/B 题目意思:有 n 个 boy 和 m 个 girl,有 b 个 boy 和 g 个 girl ( ...

  8. CodeForces 516C Drazil and Park 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/8990745.html 题目传送门 - CodeForces 516C 题意 在一个环上,有$n$棵树. 给出每一 ...

  9. CodeForces 516B Drazil and Tiles 其他

    原文链接http://www.cnblogs.com/zhouzhendong/p/8990658.html 题目传送门 - CodeForces 516B 题意 给出一个$n\times m$的矩形 ...

随机推荐

  1. C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案>.<C#开发BI ...

  2. Clusternet v0.5.0 重磅发布: 全面解决多集群应用分发的差异化配置难题

    作者 徐迪,腾讯云容器技术专家. 汝英哲,腾讯云高级产品经理. 摘要 在做多集群应用分发的时候,经常会遇到以下的差异化问题,比如: 在分发的资源上全部打上统一的标签,比如 apps.my.compan ...

  3. 4.1 The Example Domain 领域示例代码

    4.1 The Example Domain 领域示例代码 The examples will use some concepts those are used by GitHub, like Iss ...

  4. 初学python-day3 元组

    day2 列表已更新!

  5. 脚本注入1(boolean&&get)

    现在,我们回到之前,练习脚本支持的布尔盲注(get型). 布尔盲注的应用场景是查询成功和失败时回显不同,且存在注入点的地方. 这里以Less-8为例: 发现查询成功时,会显示:失败则无回显. 同时发现 ...

  6. 【二食堂】Beta - Scrum Meeting 1

    Scrum Meeting 1 例会时间:5.13 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 查阅资料,解决划词勾选和右键菜单的问题issue2. 修复了Alpha阶段的 ...

  7. Spring DeferredResult 异步请求

    Spring DeferredResult 异步请求 一.背景 二.分析 三.实现要求 四.后端代码实现 五.运行结果 1.超时操作 2.正常操作 六.DeferredResult运行原理 六.注意事 ...

  8. redis 的单机安装

    redis 单机安装 参考文档地址:https://www.cnblogs.com/withfeel/p/10655994.html 1,下载redis,下载地址http://download.red ...

  9. Docker安装配置Tomcat

    1.使用docker pull tomcat下载镜像(不加tag则是下载最新版本) 2.运行容器(-d 后台运行:-p 指定端口映射),接的是镜像ID 3.进入容器执行命令,接的是容器ID 4.宿主机 ...

  10. no space left on device 磁盘空间不足

    新挂载的目录,创建文件提示:no space left on device 1.执行命令:df -h ,查看盘是否挂载成功 2.用history命令查看历史命令,尴尬的发现挂载前忘记格式化了 3.取消 ...