题目链接


题目大意:


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]


解题思路:

  1. 因为询问很多,那么我们不可能每次询问都暴力搜索而且k,ck,ck,c很大
  2. 我们观察一下mim_imi​才101010,我们是不是可以枚举从每个点的不同的状态出发,处理出所以的状态?
  3. 我们发现对于mi∈[1,10]m_i\in[1,10]mi​∈[1,10],那么lca(1,...,9,10)=2520lca(1,...,9,10)=2520lca(1,...,9,10)=2520就是一个状态循环节
  4. 就是从一个点出发累加上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​)
  5. 那么我们就可以设状态为(x,y)(x,y)(x,y),就是到达了xxx这个点,现在的累加和%2520\%2520%2520为yyy的答案是多少
  6. 那么我们不能暴力搜索,但是整个状态就n∗2520n*2520n∗2520那么我们可以记忆化搜索
  7. 我们知道dfsdfsdfs是一条路径,实际上我们只是把一个点拆成了252025202520个,那么访问到了以前得状态得时候,那么是找到环了,那么我们可以去跟新答案了,就是找到这个环上有多少个不同得点?
  8. 在回溯的时候记得更新访问过所以点的答案

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 记忆化搜索 + 思维预处理(数论同余恒等式)相关推荐

  1. 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 ...

  2. [P1434 [SHOI2002]滑雪](DFS,记忆化搜索)

    P1434 [SHOI2002]滑雪 题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你 ...

  3. 常用的递归算法:dfs(深度优先搜索),记忆化搜索,分治

    递归值函数调用自身: 一.DFS的介绍 概念很简单,但是还是得了解一下,下面介绍的内容是重点 1. 图的DFS (1)先看一下vector是怎么建图的? vector<int> vecMa ...

  4. 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...

  5. 【牛客练习赛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, ...

  6. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

  7. 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】

    任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K ...

  8. 牛客假日团队赛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 ...

  9. 【DFS反向建图记忆化搜索】UPC Contest2592 - 2020年秋季组队训练赛第十四场 问题 D: Mysterious Treasure

    问题 D: Mysterious Treasure 时间限制: 1 Sec 内存限制: 128 MB 题目描述 WNJXYK and DIDIDI is playing a game. DIDIDI ...

最新文章

  1. SQL Server 高级操作 视图和存储过程
  2. DeepMind医疗业务几经动荡,现在团队并入Google
  3. ViewHolder VS HolderView ?
  4. Dell服务器相关操作
  5. OllyDbg完全教程
  6. 网友质疑特斯拉电动汽车电池不利于回收 马斯克回怼!
  7. 通过文件结构直接生成xls文件
  8. 自动将视频文件生成字幕的软件autosub安装及使用(支持英文、日语和法语)
  9. 人工神经网络与遗传算法,遗传算法和神经算法
  10. 【JZOJ3424】粉刷匠
  11. 从零开始搭建一个Vue项目
  12. 共享经济思考:标准化与个性化如何融合
  13. TREC之使用terrier进行信息检索
  14. 名帖329 王羲之 草书《游目帖》
  15. 计算机的防呆接口,电脑上有哪些“防呆设计”
  16. 教你在硬件不满足Windows 11最低硬件要求的情况下安装Windows 11(绝对有效)
  17. Ubuntu fcitx输入法占用内存越来越大(超过1G)
  18. twitter和新浪微博比较
  19. 大国重器“兵器谱”,了解一下
  20. Python Unable to allocate MiB for an array with shape

热门文章

  1. Python RE库的贪婪匹配和最小匹配
  2. 这5种动态炫酷图,用Python就可以画!
  3. 【SLAM】卡尔曼滤波:究竟滤了谁?
  4. 同样都是调参,为什么人家的神经网络比我牛逼 100 倍?
  5. 详尽 | PyTorch动态图解析
  6. 智在生活 自在慵懒 科沃斯机器人X京东大牌秒杀日主题展亮相无锡
  7. Android知识点复习2(Service)
  8. vue-cli——vue-resource登录注册实例
  9. [dp之路]7.25test
  10. 无法删除文件,文件或目录损坏且无法读取的解决