首页 > 其他分享 >CF1056G Take Metro 题解

CF1056G Take Metro 题解

时间:2022-11-09 22:36:09浏览次数:42  
标签:Metro int 题解 然后 环长 -- Solve Take

*2900 的题,评到黑题是因为 std 做法要用可持久化平衡树,然而有一种更简洁的做法。

注意到 \(t\) 很大,然后每一步只和 \(t\bmod n\) 的大小有关系,因此你想先求出 \(t=n\) 时每一个点最后会走到哪些点,然后倍增处理,至于剩下的不能整除 \(n\) 的部分暴力跑即可(下面认为 \(t\) 已经暴力预处理掉了不能整除 \(n\) 的部分)。

然后你想推性质推出这个走到的点,结果你发现你推不出来,没有轨迹可循。

然后你想打个暴力输出来看一眼,然后发现似乎最后每个点能够走到的点构成的集合并不大,不过最大的也会有 \(\dfrac{n}{5}\) 左右,但是一般情况下 \(n=10^5\) 时大概有 \(4000\) 个左右。

但是这样还是没法处理,由于最后的点高度重合,于是你怀疑所有点最后会走到一个环里面,于是你决定处理出每个点走到哪个点之后环长大小。

然后你发现环长特别小,自己手造时最大值也才 10。

然后你猜测这个环很小,完全可以从起点直接预处理出这个环,然后在这个环上遍历,因为 \(t\) 每经过环长 \(\times n\) 的时间就会回到这个点,于是可以让 \(t\) 对这个值取模,然后 \(t\) 就很小了,又可以暴力跑了,当然你会发现起点不一定在环内,要先拉到环里面再跑,同时记得将 \(t\) 开成 long long。

然后你过了。

实际上最大环长某位评论区老哥胡出来期望是 \(O(\sqrt{n})\),但是不会证,而 \(O(n\sqrt{n})\) 照样能过。

写的全新风格的题解?我以前题解基本上看不到“你”这个字(

Code:

/*
========= Plozia =========
	Author:Plozia
	Problem:CF1056G Take Metro
	Date:2022/11/9
========= Plozia =========
*/

#include <bits/stdc++.h>
typedef long long LL;

const int MAXN = 1e5 + 5;
int n, m, s, Next[MAXN];
LL t;

int Solve(int x, int p) { return ((x + p) > n) ? (x + p - n) : (x + p); }

void Brute(int s, LL t)
{
	for (LL i = t; i >= 1; --i)
	{
		s = Solve(s, (s <= m) ? (i % n) : (n - (i % n)));
	}
	printf("%d\n", s);
}

int main()
{
	std::cin >> n >> m >> s >> t; int x = 0;
	for (int i = t % n; i >= 1; --i, --t) { s = Solve(s, (s <= m) ? i : (n - i)); }
	if (t == 0) { printf("%d\n", s); return 0; }
	for (x = s; !Next[x]; x = Next[x])
	{
		int tmp = x;
		for (int i = n; i >= 1; --i) tmp = Solve(tmp, (tmp <= m) ? i : (n - i));
		Next[x] = tmp;
	}
	int cnt = 0; for (int pz = s; pz != x; pz = Next[pz]) ++cnt;
	if (t <= 1ll * cnt * n) { Brute(s, t); return 0; }
	t -= 1ll * cnt * n; cnt = 1; s = x; for (int pz = Next[x]; pz != x; pz = Next[pz]) ++cnt;
	t %= 1ll * cnt * n; Brute(s, t); return 0;
}

标签:Metro,int,题解,然后,环长,--,Solve,Take
From: https://www.cnblogs.com/Plozia/p/16875410.html

相关文章

  • LuoguP1586 题解
    也可以在LuoguP1586(tencentcs.com)获得更好的阅读体验。Luogu_P1586题解一道比较简单的题目,看到求种类数,考虑DP。设\(f_{i,j}\)表示第\(i\)个数划分为\(j\)......
  • 11.7 模拟赛题解
    幸终简要题意给定一棵树,\(1\)号节点为根节点,记\(d_i\)为\(i\)号节点到根节点最短路径所经过的边数,\(mxd=max_{i=1}^nd_i\)。现在要把这棵树剖分成若干条链,每条链链......
  • 洛谷 [AGC021B] Holes 蓝 题解
    前言学校基础模拟赛的题,当时有思路但是不太会写凸包就没做,下来看了看,自己的思路大部分是正确的,有些细节没有想到,在此写篇题解。我用的是Andrew求凸包。思路答案为0......
  • 2022CSP-J题解
    2022CSP-J如期举行,<del>本人在封控区参加不了</del>,CCF收钱之后题目确实是变简单了,所以半场外人士写了一片题解,希望对各位大佬有帮助。#T1-乘方第一题往往没有**实现难......
  • 二分查找与二分答案题解
    此类题目的特征为数据量大,数据为升序或降序根本目的是通过二分法快速缩小答案范围,然后对比数据或验证答案2.1二分查找输出时注意mid是否为第一个出现的答案1#incl......
  • CF1285D Dr. Evil Underscores 题解
    给定一个序列\(a\),选取一个\(x\),使\(\max_{i=1}^na_i\oplusx\)最小。看到这种题直接按位考虑,如果最高位全是\(1\)那把\(x\)的这位全变成\(1\),如果最高位全是\(......
  • 洛谷P1605题解分析
    迷宫题目描述给定一个\(N\timesM\)方格的迷宫,迷宫里有\(T\)处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障......
  • CF1747 题解
    比赛链接:https://codeforces.com/contest/1747题解:AB水题//bySkyRainWind#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include......
  • P1688 新单词接龙问题 题解
    大家好,我喜欢Hash,所以我用Hash通过了这道题。思路:处理方法有点类似于P6521首先我们最终接出的字符串要求其中的小字符串按字典序排序,那么我们就将所有字符串排好序......
  • 问题解决-白鹭引擎Egret Wing3修改项目内容后进行调试,项目仍显示修改前样式
    问题描述:修改前: 修改后: 解决方法:点击上方菜单栏项目-清理,进行项目清理    点击菜单栏项目-调试  重新进行调试。  调试成功后,问题成功解......