首页 > 其他分享 >Atcoder Regular Contest 101

Atcoder Regular Contest 101

时间:2023-05-15 23:33:45浏览次数:62  
标签:Atcoder 右边 return int Regular maxn mod 101 first

F - Robots and Exits

\(n\) 个人,\(m\) 个出口在一条数轴上,坐标是正整数。你每次可以让所有人向左或向右一步,人在某个出口上后就离开。求多少种操作的方案使得人全部走光。两个方案相同当且仅当存在至少一个人在两次操作序列进行完成后从不同的出口消失。对 \(10^9+7\) 取模。

\(1\le n,m\le 10^5.\)


妙妙题。把每个点抽象成一个二维点 \((a_i,b_i)\),横坐标是到左边出口的距离,纵坐标是到右边出口的距离。当 \(a_i<a_j,b_i>b_j\) 的时候,假设 \(i\) 从右边出去,则 \(j\) 也一定从右边出去,左侧同理。把左右走抽象成一条折线,在 \((x,y)\) 这个位置代表从起点出发,最远的左侧点距离为 \(x\) 右侧为 \(y\)。把坐标向右上平移 \(0.5\) 个单位,那么折线下方的点都去右边,上方都去左边。假设我们已经确定了一个去右边的集合且满足上述性质,则一定可以找到一条满足条件的斜线。故我们可以直接dp,\(f_j=\sum\limits_{a_i<a_j,b_i<b_j}f_i+1\),这是个二维偏序问题,树状数组优化即可。

#include <bits/stdc++.h>
const int maxn = 1e5 + 5, mod = 1e9 + 7;
int qmod(int x) {
	if (x >= mod) {
		x -= mod;
	}
	return x;
}
int n, m, x[maxn], y[maxn], tot, tmp[maxn], cnt, f[maxn], c[maxn], ans;
std :: pair<int, int> p[maxn];
void add(int x, int v) {
	while (x <= cnt) {
		c[x] = qmod(c[x] + v);
		x += x & -x;
	}
}
int ask(int x) {
	int ret = 0;
	while (x) {
		ret = qmod(ret + c[x]);
		x -= x & -x;
	}
	return ret;
}
int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", x + i);
	for (int i = 1; i <= m; i++) scanf("%d", y + i);
	for (int i = 1; i <= n; i++) {
		int r = std :: lower_bound(y + 1, y + 1 + m, x[i]) - y;
		if (r > 1 && r <= m) p[++tot] = {x[i] - y[r - 1], y[r] - x[i]};
	}
	for (int i = 1; i <= tot; i++) tmp[i] = p[i].second;
	std :: sort(tmp + 1, tmp + 1 + tot);
	cnt = std :: unique(tmp + 1, tmp + 1 + tot) - tmp - 1;
	for (int i = 1; i <= tot; i++) {
		p[i].second = std :: lower_bound(tmp + 1, tmp + 1 + cnt, p[i].second) - tmp;
	}
	std :: sort(p + 1, p + 1 + tot, [&](std :: pair<int, int> a, std :: pair<int, int> b){
		if (a.first != b.first) return a.first < b.first;
		return a.second > b.second;
	});
	for (int i = 1; i <= tot; i++) {
		if (p[i].first == p[i - 1].first && p[i].second == p[i - 1].second) continue;
		f[i] = qmod(ask(p[i].second - 1) + 1);
		ans = qmod(ans + f[i]);
		add(p[i].second, f[i]);
	}
	printf("%d\n", qmod(ans + 1));
	return 0;
}

标签:Atcoder,右边,return,int,Regular,maxn,mod,101,first
From: https://www.cnblogs.com/zcr-blog/p/17403463.html

相关文章

  • AtCoder Beginner Contest 223 G Vertex Deletion
    洛谷传送门AtCoder传送门设\(f_{u,0/1}\)为\(u\)的子树,\(u\)是否在匹配内的最大匹配数。注意到对于一个匹配,在它深度较浅的点上才会被计入答案。转移大概是\(f_{u,0}\)取\(\sum\limits_{v\inson_u}\max(f_{v,0},f_{v,1})\),\(f_{u,1}\)要从儿子中选一个\(f_{v,0......
  • LeetCode 101. 对称二叉树
    题目链接:LeetCode101.对称二叉树题意:给你一个二叉树的根节点root,检查它是否轴对称。解题思路:1.递归法采用递归法思路就比较简单,因为要比较二叉树是否是轴对称的,因此就是比较左右子树是否轴对称,因此在遍历的过程中,就是比较左边的左子树与右边的右子树是否相等,以及左......
  • ABB工业中央控制器PCD244A101
    W;①⑧0③0①7775⑨ABB工业中央控制器PCD244A1013BHE042816R0101/ZUBA003203R0001/PEC80-SCC  REV.B,PCD231B3HHE025541R0101PCD231B1013BHE025541R0101PCD231B1013BHE025541R0101PCD232A3BHE022293R0101PCD235B11013BHE032025R1101PCD232A1013BHE022293......
  • AtCoder Beginner Contest 301
    title:AtCoderBeginnerContest301categories:算法题解description:咕咕咕tags:-Atcoder-贪心-BFS-DPcover:/img/chino/vec/chino17.jpgkatex:truedate:2023-05-1322:47:31A-OverallWinner(abc301a)题目大意给定一个字符串表示高桥和青木......
  • 欧姆龙 PLC CP1E 与电子称重仪表“柯力XK3101”Modbus RTU通信,稍微更改下Modbus通信地
    欧姆龙PLCCP1E与电子称重仪表“柯力XK3101”ModbusRTU通信,稍微更改下Modbus通信地址可以跟其他Modbus设备进行通信!YID:5545635998335748......
  • 1011 A+B 和 C(C++)
    一、问题描述:给定区间[−231,231]内的3个整数 A、B 和 C,请判断 A+B 是否大于 C。输入格式:输入第1行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。输出格式:对每组测试用例,在一行中输出 C......
  • AtCoder Regular Contest 129 C Multiple of 7
    洛谷传送门AtCoder传送门首先\(\text{7777...777}\)(\(x\)个\(7\))对能被\(7\)整除子串数量的贡献是\(\frac{x(x+1)}{2}\)。把\(n\)分解成若干\(x_i\)使得\(\sum\limits_{i=1}^m\frac{x_i(x_i+1)}{2}=n\),表示每段\(x_i\)个\(7\)。怎么把它们组合在一起呢?一个......
  • AtCoder Beginner Contest 163 F path pass i
    洛谷传送门AtCoder传送门感觉我的做法比较奇葩(容斥,总路径数减去只走点权为\(k\)的路径。设点权为\(k\)的点数为\(c_k\),点权不为\(k\)的点构成的每个连通块大小为\(s_i\),那么\(ans_k=\frac{n(n-1)}{2}-\sum\frac{s_i(s_i-1)}{2}+c_k\)。考虑快速计算\(\su......
  • 1011 World Cup Betting
    Withthe2010FIFAWorldCuprunning,footballfanstheworldoverwerebecomingincreasinglyexcitedasthebestplayersfromthebestteamsdoingbattlesfortheWorldCuptrophyinSouthAfrica.Similarly,footballbettingfanswereputtingtheirmoney......
  • AtCoder Beginner Contest 207 F Tree Patrolling
    洛谷传送门AtCoder传送门简单树形dp。设\(f_{u,i,p=0/1,q=0/1}\)为\(u\)的子树中被覆盖点数为\(i\),\(u\)有没有被覆盖,\(u\)有没有被选。转移树形背包合并即可,需要分类讨论。要注意如果\(u\)没被覆盖,\(v\)选了,或者\(u\)选了,\(v\)没被覆盖,被覆盖点数要\(+1\)。......