首页 > 其他分享 >CF516E 做题记录

CF516E 做题记录

时间:2024-05-09 16:13:10浏览次数:27  
标签:记录 ml ll ht CF516E maxn id define

link

纪念一下独立切的 *3100 的数论 + 贪心题,思考时的思路一波三折,像极了考试中的我。

个人感觉难度至少 *3300。

考虑先求出 \(d = \gcd(n, m)\),那么编号根据模 \(d\) 结果分成了 \(0...d-1\) 共 \(d\) 个部分,每个部分里的人不能和外面的人玩。

因此当 \(d> b + g\) 时一定无解,接下来我们对 \(d\) 个部分分开处理。

我们考虑求出使得全部女生快乐的最小天数,求男生的天数只需要把两堆人对调。

考虑编号为 \(0\) 的男生,第一次和编号为 \(0\) 的女生玩,第二次和编号为 \(n\bmod m\) 的女生玩,第三次和编号为 \(2n\bmod m\) 的女生玩,以此类推。

那么我们把 \(0...m-1\) 建一个环,对于环上的一个点 \(u\),向 \((u+n) \bmod m\) 连边。

钦定环上一个点的 id 为从 \(0\) 开始走的步数,我们容易使用 exgcd 算出一个点的 id。

把所有快乐的女生编号对应的 id,以及快乐的男生编号 \(\bmod m\) 对应的 id 拎出来,排个序。

对于每个拎出来的点 \(u\),算出环上 id 为 \(u-1\) 的女生的答案,容易通过拎出来的前一个点算出,可以发现这考虑了所有女生的答案。

时间复杂度 \(O(n\log n)\)。

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define fi first
#define se second
#define pir pair <ll, ll>
#define mkp make_pair
#define pb push_back
using namespace std;
void read(ll &x) {
	char c; ll f = 1;
	while(!isdigit(c = getchar()))
		if(c == '-') f = -1;
	x = c - '0';
	while(isdigit(c = getchar())) x = x * 10 + c - '0';
	x *= f;
}
const ll maxn = 4e5 + 10, inf = 1e17;
ll nl, ml, n, m, g;
vector <ll> v1[maxn], v2[maxn];
ll ans;
void exgcd(ll a, ll b, ll &x, ll &y) {
	if(!b) {
		x = 1, y = 0;
		return;
	}
	exgcd(b, a%b, x, y);
	ll t = x;
	x = y, y = t - a / b * y;
}
ll Get(ll i) {
	ll x, y;
	exgcd(nl, ml, x, y);
	x *= i, y *= i;
	x = (x % ml + ml) % ml;
	return x;
}
ll iGet(ll i) {return i * nl % ml;}
ll h[maxn], ht, mn[maxn], vis[maxn];
void solve(ll u) {
	ht = 0;
	for(ll i: v1[u]) {
		ll x = i / g;
		ll id = Get(x % ml);
		h[++ht] = id;
	}
	for(ll i: v2[u]) {
		ll x = i / g;
		ll id = Get(x);
		h[++ht] = id;
	}
	if(!ht) {ans = inf; return;}
	sort(h + 1, h + 1 + ht);
	ht = unique(h + 1, h + 1 + ht) - h - 1;
	for(ll i = 1; i <= ht; i++)
		mn[i] = inf, vis[i] = 0;
	for(ll i : v1[u]) {
		ll x = i / g;
		ll id = Get(x % ml);
		ll Id = lower_bound(h + 1, h + 1 + ht, id) - h;
		mn[Id] = min(mn[Id], i);
	}
	for(ll i : v2[u]) {
		ll x = i / g;
		ll id = Get(x);
		ll Id = lower_bound(h + 1, h + 1 + ht, id) - h;
		mn[Id] = min(mn[Id], i), vis[Id] = 1;
	}
	for(ll i = 1; i <= ht; i++) {
		ll x = (h[i] + ml - 1) % ml, j = (i + ht - 2) % ht + 1;
		if(x == h[j] && vis[j]) continue; 
		ll ret = mn[j] + (x - h[j] + ml) % ml * nl * g;
		ans = max(ans, ret);
	}
}
int main() {
	read(nl), read(ml), read(n);
	g = __gcd(nl, ml);
	nl /= g, ml /= g;
	if(g > 2e5) {puts("-1"); return 0;}
	for(ll i = 1, x; i <= n; i++) {
		read(x);
		v1[x % g].pb(x);
	}
	read(m);
	for(ll i = 1, x; i <= m; i++) {
		read(x);
		v2[x % g].pb(x);
	}
	for(ll i = 0; i < g; i++) {
		sort(v1[i].begin(), v1[i].end());
		sort(v2[i].begin(), v2[i].end());
	}
	for(ll i = 0; i < g; i++)
		solve(i);
	for(ll i = 0; i < g; i++) swap(v1[i], v2[i]);
	swap(nl, ml);
	for(ll i = 0; i < g; i++)
		solve(i);
	if(ans == inf) ans = -1;
	printf("%lld", ans);
	return 0;
}

标签:记录,ml,ll,ht,CF516E,maxn,id,define
From: https://www.cnblogs.com/Sktn0089/p/18182518

相关文章

  • 学习记录+vcode+GPIO例程+正点原子 DNESP32S3 开发板教程-IDF 版
    第一个程序:UART模式和JTAG模式,配置完成不同。配置主要就是.vscode文件夹中 c_cpp_properties.json,tasks.json,launch.json,settings.json四个文件。一个想法:备份UART模式和JTAG模式的配置文件,用时直接文件替换。简单粗暴方式是.vscode文件夹替换。当然每次要选好串口、设置目标......
  • 计网Quizzes学习记录
    写在前面这篇记录的是计网练习记录,包含错题和需要注意的点。网址点这里,直接进去改chapter后面的数字就可以换章chapter24TCPUDP虽然运输层数据分组被称作segment,但是UDP的分组常被称为数据报(datagram),UDP本身就是UserDatagramProtocol的缩写。UDP的首部是固定的8个......
  • 5月记录
    76.CF1967CodeforcesRound942(Div.1)CF1967ACF1967B1\[b\times\gcd(a,b)|a+b\toqi^2|(p+q)i\toqi|(p+q)\toq|p\tob|a\]反过来也能推到。CF1967B2\[a+b|b\times\gcd(a,b)\to(p+q)i|qi^2\to(p+q)|qi\to(p+q)|i\]枚举\(p,q\),因为\(p<i,pi&......
  • 记录: 小红书笔记采集接口 获取用户笔记列表
    为了维护公司在小红书平台上的账号数据以及运营分析,需要用到小红书数据采集相关的公开接口进行辅助管理。近期调研发现iDataRiver平台https://idatariver.com上有开箱即用的小红书公开API,可以按需调用。本人简单测试了一下效果还可以,故记录下来以备日后使用。接口使用详情请参......
  • 讨论 :银弹真的有用么? 在学习通提交解答的同时,可以同步发布在团队和个人博客上,作为
    银弹在项目管理和团队协作中是一种特殊的工具,其有效性和适用性取决于具体的团队和项目环境。这里是关于银弹的一些讨论点和考虑因素:优点:快速决策:当团队成员之间出现争执时,银弹可以帮助快速做出决策,避免争论持续下去,节省时间和精力。明确权威:银弹赋予特定角色(Dev/Test/PM)决策权,......
  • 2024.5 做题记录
    五一之后临时决定要来脱产。谢谢所有认可我的决定,支持我的人。P1935[国家集训队]圈地计划注意到相邻两项不同就会产生贡献的条件不好处理,所以考虑对行列进行黑白染色,将一种颜色格子的\(a,b\)交换,这样条件就变成了相邻两项不同才会产生贡献。然后套用文理分科的做法就可......
  • spring刷题记录——to be continue
    在牛客网刷的题目,类似于补基础了?这里按照知识点进行分类,因为发现有些同样的知识点不同的题目还是很痛苦。这里就不用颜色标记了,因为我觉得都要记。Spring容器篇Spring容器也叫做Ioc容器(Ioc,在我之前写的随笔里面也有谈到),本质上就是一个工厂。Sp......
  • NGINX配置记录
    ####NGINX配置记录server{listen80;server_namewww.222.com;charsetutf-8;#roothtml/222/wap/dist;#location/robots.txt{#301重定向#return301http://www.333.com;if($time_iso8601~"(\d{4})-(\d{2})-(\d{2})"......
  • 银河麒麟V10——问题记录
    1.在桌面登录用户后无法进入桌面,又退回到登录页面。权限问题:切到后台ctrl+alt+F1,进入主目录,chown-R用户名:用户名.Xauthority如仍解决不了问题,查看~.xesession-error日志,借助日志解决问题,如出现privatesocketdirermissiondeniedchmod 777 /tmp,修改/tmp权限。2......
  • C# 相关记录
     程序转成Windows服务varoptions=newWebApplicationOptions{Args=args,ContentRootPath=WindowsServiceHelpers.IsWindowsService()?AppContext.BaseDirectory:default};varbuilder=WebApplication.CreateBuilder(options); webservices服务转成cs类......