「APIO 2019」奇怪装置
考虑推柿子
最开始的想法是如果两个\(t\)在\(mod\ B\)意义下相等,那么只需要比较一下\((t+\left \lfloor \frac{t}{B}\rfloor \right)mod\ A\)就好了
显然\(t=t\% B+B\times \lfloor \frac{t}{B} \rfloor\)
于是第一维就是$t%B+(B+1)\times \lfloor \frac{t}{B} \rfloor $
也就是说如果\(t\%B\)的是相等的,那么只要\((B+1)\times \lfloor \frac{t}{B} \rfloor\)在\(mod\ A\)意义下是相等的,那么两个\(t\)就是本质相同的
考虑求一下后面那个东西的循环节,显然是\(\frac{lcm(B+1,A)}{B+1}=\frac{A}{gcd(b+1,A)}\)
再考虑到\(t\%B\)的循环节是\(B\),所以整个的循环节就是\(\frac{AB}{gcd(B+1,A)}\),也就是说\(t\)和\(t+\frac{AB}{gcd(B+1,A)}\)是本质相同的
由此我们把这个问题转化成了一个\(mod\ \frac{AB}{gcd(B+1,A)}\)意义的区间覆盖,我们只需要把这些区间放上去覆盖就好了,最后就是求一下被覆盖的总面积,这个是一个非常普及的贪心问题
非常丢人的写错了区间覆盖
代码
#include <bits/stdc++.h>
#define re register
#define max std::max
#define LL long long
inline LL read() {
LL x = 0;char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3ll) + (x << 1ll) + c - 48, c = getchar();
return x;
}
int n, m;
LL A, B, L;
const int maxn = 1e6 + 5;
struct Seg {LL l, r;} a[maxn], b[maxn << 1];
LL gcd(LL a, LL b) { return !b ? a : gcd(b, a % b); }
inline void add(LL x, LL y) { b[++m].l = x, b[m].r = y; }
inline int cmp(Seg A, Seg B) { return A.l == B.l ? A.r > B.r : A.l < B.l; }
int main() {
n = read(), A = read(), B = read();
for (re int i = 1; i <= n; i++) a[i].l = read(), a[i].r = read();
for (re int i = 1; i <= n; i++) L = max(L, a[i].r);L++;
LL r = gcd(A, B + 1);
if (A / r <= L / B) L = A / r * B;
for (re int i = 1; i <= n; i++) {
LL x = a[i].r / L - a[i].l / L;
if (x >= 2) {add(0, L - 1);break;}
if (x == 1)
add(0, a[i].r % L), add(a[i].l % L, L - 1);
else
add(a[i].l % L, a[i].r % L);
}
std::sort(b + 1, b + m + 1, cmp);
int p = 1;LL ans = 0;
for (re int i = 1; i <= m; i = p) {
LL T = b[i].r;
while (b[p].l <= T && p <= m) T = max(T, b[p].r), p++;
ans += T - b[i].l + 1;
}
printf("%lld\n", ans);
return 0;
}
「APIO 2019」奇怪装置的更多相关文章
- #3144. 「APIO 2019」奇怪装置
#3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...
- 【LOJ #3144】「APIO 2019」奇怪装置
题意: 定义将一个\(t\)如下转换成一个二元组: \[ f(t) = \begin{cases} x = (t + \left\lfloor \frac{t}{B} \right \rfloor) ...
- #3146. 「APIO 2019」路灯
#3146. 「APIO 2019」路灯 题目描述 一辆自动驾驶的出租车正在 Innopolis 的街道上行驶.该街道上有 \(n + 1\) 个停车站点,它们将街道划分成了 \(n\) 条路段.每一 ...
- #3145. 「APIO 2019」桥梁
#3145. 「APIO 2019」桥梁 题目描述 圣彼得堡市内所有水路长度总和约 282 千米,市内水域面积占城市面积的 7%.--来自维基百科 圣彼得堡位于由 \(m\) 座桥梁连接而成的 \(n ...
- 「APIO 2019」桥梁
题目 三天终于把\(APIO\)做完了 这题还是比较厉害的,如果不知道这是个分块应该就自闭了 考虑一个非常妙的操作,按照操作分块 我们设一个闸值\(S\),把\(S\)个边权修改操作分成一块,把所有的 ...
- 「APIO 2019」路灯
题目 显然一个熟练的选手应该能一眼看出我们需要维护点对的答案 显然在断开或连上某一条边的时候只会对左右两边联通的点产生贡献,这个拿\(set\)维护一下就好了 那现在的问题就是怎么维护了 考虑一个非常 ...
- 「WC 2019」数树
「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...
- LOJ#3054. 「HNOI 2019」鱼
LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...
- 「UNR#1」奇怪的线段树
「UNR#1」奇怪的线段树 一道好题,感觉解法非常自然. 首先我们只需要考虑一次染色最下面被包含的那些区间,因为把无解判掉以后只要染了一个节点,它的祖先也一定被染了.然后发现一次染色最下面的那些区间一 ...
随机推荐
- poj1637Sightseeing tour
传送门 网络流解混合图欧拉回路,以前xy讲过,但是我一直没写. 把无向边随意定向,每个点权值为出度减入度,权值为奇数无解,权值大于0的从s向其连权值/2的边,小于0的向t连-权值/2的边,原图中无向图 ...
- NX二次开发-UFUN求两个对象最短距离UF_MODL_ask_minimum_dist
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize() ...
- [luogu 4389] 付公主的背包
题意:求一个较大的多重背包对于每个i的方案数,答案对998244353取模. 思路: 生成函数: 对于一个\(V\) 设: \(f(x) = \sum_{i=0}^{oo} x ^ {V * i} = ...
- hdu4352-XHXJ's LIS状压DP+数位DP
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门 原题目描述在最下面. 在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路: ...
- jdk自带的数据库derby的基本使用以及注意事项(mac为例),附java demo
文章目录 安装 环境变量 验证是否安装成功 启动 本地启动 允许远程连接的启动方式: 在启动过程中可能遇到的错误(远程连接的时候会出现): 1 2 连接测试,创建数据库 方法一(推荐) 方法二 jav ...
- 9、从命令行运行postman脚本及生成测试报告
本节建议直接看postman官网:https://www.npmjs.com/package/newman 环境准备: 安装nodejs和npm 参考 https://www.runoob.c ...
- ncurse 笔记
初始化与结束 为了使用 NCURSES 库,你应该 #include <curses.h>,在编译时,应该加上 -lncurses. stdscr 一般地,第一个函数调用必须是 inits ...
- [21]APUE:线程同步之记录锁(文件)
[a] 概念 建议锁:在遵循相同记录锁规则的进程/线程间生效,通常用于保证某个程序自身多个进程/线程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后 ...
- C4D中python初探
use_name = input('请输入账号') password = input('请输入密码') if use_name == 'alex' and password == 'alex3714' ...
- 【python】并集交集
set是用来去重的. 在list里使用union函数.这种方式不适用于元素为字典的. list(set(a)^set(b)) 这是求差集 所以交集就是并集和ab的差集. import random d ...