图论 ---- F. Graph Traveler 记忆化搜索 + 思维预处理(数论同余恒等式)
题目链接
题目大意:
q∈[1,1e5],n∈[1,1000],mi∈[1,10]q\in[1,1e5],n\in[1,1000],m_i\in[1,10]q∈[1,1e5],n∈[1,1000],mi∈[1,10]
k,c∈[−1e9,1e9]k,c\in[-1e9,1e9]k,c∈[−1e9,1e9]
解题思路:
- 因为询问很多,那么我们不可能每次询问都暴力搜索而且k,ck,ck,c很大
- 我们观察一下mim_imi才101010,我们是不是可以枚举从每个点的不同的状态出发,处理出所以的状态?
- 我们发现对于mi∈[1,10]m_i\in[1,10]mi∈[1,10],那么lca(1,...,9,10)=2520lca(1,...,9,10)=2520lca(1,...,9,10)=2520就是一个状态循环节
- 就是从一个点出发累加上kik_iki,模上252025202520的y′y'y′和不模的yyy效果是一样的,因为252025202520是[1,10][1,10][1,10]里面的是倍数→y′≡y(modmi)\rightarrow y' \equiv y(mod\;m_i)→y′≡y(modmi)
- 那么我们就可以设状态为(x,y)(x,y)(x,y),就是到达了xxx这个点,现在的累加和%2520\%2520%2520为yyy的答案是多少
- 那么我们不能暴力搜索,但是整个状态就n∗2520n*2520n∗2520那么我们可以记忆化搜索
- 我们知道dfsdfsdfs是一条路径,实际上我们只是把一个点拆成了252025202520个,那么访问到了以前得状态得时候,那么是找到环了,那么我们可以去跟新答案了,就是找到这个环上有多少个不同得点?
- 在回溯的时候记得更新访问过所以点的答案
AC code
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 5e6 + 10, mod = 2520;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
int n, cnt[N], js[N]; // cnt保存路径上的点,js是用来去重的,去除重复的点
int ans[1010][mod+10];
int depth[1010][mod+10];
bool vis[1010][mod+10];
vector<int> G[1010];
int val[1010];inline int dfs(int u, int state) {vis[u][state] = 1;if(ans[u][state]) ans[u][state];int len = G[u].size();// system("pause");int nxtpoi = G[u][(state+val[u])%len];int nxtstate = (state+val[u]) % mod;if(vis[nxtpoi][nxtstate]) {// 如果下一个点是有答案的或者是访问过的if(ans[nxtpoi][nxtstate]) return ans[u][state] = ans[nxtpoi][nxtstate];// 这里记得赋值ans[u][state] 否则wa5int r = depth[u][state], l = depth[nxtpoi][nxtstate];for(int i = l; i <= r; ++ i) js[cnt[i]] = 0;for(int j = l; j <= r; ++ j) if(js[cnt[j]]==0) ans[u][state] ++, js[cnt[j]] = 1;return ans[u][state];}depth[nxtpoi][nxtstate] = depth[u][state]+1;cnt[depth[nxtpoi][nxtstate]] = nxtpoi;return ans[u][state] = dfs(nxtpoi,nxtstate);//每次return 都要跟新答案
}int main() {// IOS;cin >> n;for(int i = 1; i <= n; ++ i) cin >> val[i], val[i] = (val[i] % mod + mod) % mod; // 先把所以的点都mod上2520for(int i = 1; i <= n; ++ i) {int num;cin >> num;for(int j = 1; j <= num; ++ j) {int x;cin >> x;G[i].push_back(x);}}int m;cin >> m;while(m--) {int x, y;cin >> x >> y;y = (y % mod + mod) % mod;cnt[0] = x;cout << dfs(x,y) << "\n";// 记忆化搜索}return 0;
}
图论 ---- F. Graph Traveler 记忆化搜索 + 思维预处理(数论同余恒等式)相关推荐
- Codeforces Round #614 (Div. 2) E. Xenon's Attack on the Gangs(DP记忆化搜索+思维)
题目链接:https://codeforces.com/contest/1293/problem/E 题目大意: 给出一棵树,要求给树的每条边赋权值,使得树中所有点的 m e x ( x , y ...
- [P1434 [SHOI2002]滑雪](DFS,记忆化搜索)
P1434 [SHOI2002]滑雪 题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你 ...
- 常用的递归算法:dfs(深度优先搜索),记忆化搜索,分治
递归值函数调用自身: 一.DFS的介绍 概念很简单,但是还是得了解一下,下面介绍的内容是重点 1. 图的DFS (1)先看一下vector是怎么建图的? vector<int> vecMa ...
- 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...
- 【牛客练习赛13】 A B C D【康拓展开】 E【DP or 记忆化搜索】 F 【思维】
A 幸运数字Ⅰ 链接:https://www.nowcoder.com/acm/contest/70/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K, ...
- 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]
题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...
- 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】
任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K ...
- 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...
链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 【DFS反向建图记忆化搜索】UPC Contest2592 - 2020年秋季组队训练赛第十四场 问题 D: Mysterious Treasure
问题 D: Mysterious Treasure 时间限制: 1 Sec 内存限制: 128 MB 题目描述 WNJXYK and DIDIDI is playing a game. DIDIDI ...
最新文章
- SQL Server 高级操作 视图和存储过程
- DeepMind医疗业务几经动荡,现在团队并入Google
- ViewHolder VS HolderView ?
- Dell服务器相关操作
- OllyDbg完全教程
- 网友质疑特斯拉电动汽车电池不利于回收 马斯克回怼!
- 通过文件结构直接生成xls文件
- 自动将视频文件生成字幕的软件autosub安装及使用(支持英文、日语和法语)
- 人工神经网络与遗传算法,遗传算法和神经算法
- 【JZOJ3424】粉刷匠
- 从零开始搭建一个Vue项目
- 共享经济思考:标准化与个性化如何融合
- TREC之使用terrier进行信息检索
- 名帖329 王羲之 草书《游目帖》
- 计算机的防呆接口,电脑上有哪些“防呆设计”
- 教你在硬件不满足Windows 11最低硬件要求的情况下安装Windows 11(绝对有效)
- Ubuntu fcitx输入法占用内存越来越大(超过1G)
- twitter和新浪微博比较
- 大国重器“兵器谱”,了解一下
- Python Unable to allocate MiB for an array with shape