CodeForces 1200F
题意略。
思路:
如果是问一下然后搜一下,那必然是不现实的。因此我们要预处理出所有的答案。
我们令mod = lcm(m1,m2,...,mn)。可知,在任意一点,我们挑选两个不同的数c1、c2,其中c2 = k * mod + c1,这两种出发状态一定会走出相同的路径。
由此,我们把每个点拆成mod个状态点,那一共是n * mod个点,由每个状态点只引申出来一条只想别的点的边,我们其实就是要在这个有向图中找环,
找环后统计环上不同点的个数。
开始的时候,我以为环的个数不会超过实际点的个数,后来wa了一次,发现同一个实际点其实是可以在不同的环中的。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
const int maxm = ;
const int maxp = ; int connect[maxn],belong[maxn],scc[maxn],cnt;
int stk[maxn],tail;
bool visit[maxn]; int n,mstore[maxp],kstore[maxp],mod = ;
vector<int> graph[maxp];
set<int> st,sst; void add_e(int u,int v){
connect[u] = v;
}
int gcd(int a,int b){
return b == ? a : gcd(b,a % b);
}
int lcm(int a,int b){
int d = gcd(a,b);
return a / d * b;
}
void dfs(int p){
if(visit[p]) return;
st.clear();
sst.clear();
tail = ;
while(!visit[p]){
visit[p] = true;
stk[tail++] = p;
st.insert(p);
p = connect[p];
}
if(st.count(p)){
int idx = cnt++;
while(stk[tail - ] != p){
int cur = stk[--tail];
belong[cur] = idx;
cur = cur / mod + ;
sst.insert(cur);
}
--tail;
sst.insert(p / mod + );
belong[p] = idx;
scc[idx] = sst.size();
}
for(int i = ;i < tail;++i){
belong[stk[i]] = belong[p];
} } int main(){
scanf("%d",&n);
for(int i = ;i <= n;++i) scanf("%d",&kstore[i]);
for(int i = ;i <= n;++i){
scanf("%d",&mstore[i]);
int m = mstore[i],temp;
mod = lcm(mod,m);
for(int j = ;j < m;++j){
scanf("%d",&temp);
graph[i].push_back(temp);
}
}
for(int i = ;i <= n;++i){
int m = mstore[i];
for(int j = ;j < mod;++j){
int to = graph[i][j % m];
int keep = to;
to = j + kstore[to];
to = (to % mod + mod) % mod;
to = (keep - ) * mod + to;
int from = (i - ) * mod + j;
add_e(from,to);
}
}
int tot = n * mod;
for(int i = ;i < tot;++i) dfs(i);
int x,y,q;
scanf("%d",&q);
for(int i = ;i < q;++i){
scanf("%d%d",&x,&y);
y = (y + kstore[x]) % mod;
y = (y + mod) % mod;
int cur = (x - ) * mod + y;
int fa = belong[cur];
int ans = scc[fa];
printf("%d\n",ans);
}
return ;
}
CodeForces 1200F的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- 从0系统学Android-2.4隐式Intent
本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 使用隐式 Intent 相对于显示 Intent ,隐式 Intent 比较含蓄.这种方式不明确指出我们想要启动哪 ...
- 《VR入门系列教程》之14---面向大众的Unity3D
大众化的游戏引擎--Unity3D 并不是所有VR应用都是游戏,然而现在做VR开发的几乎都会用专业游戏引擎来做,因为游戏引擎既满足了一个引擎的要求又可以方便地制作出高品质的VR应用.一个游戏引 ...
- 为 Editor.md 编辑器插件增加预览和发布按钮
前言 一直在使用 Editor.md 插件作为博客的编辑器,用着挺好,但是在全屏下编辑时,每次想预览或者保存又必须切换到非全屏状态下才可以点击按钮,用着不舒服,所以花了一点时间在工具栏上增加了预览.保 ...
- Pinyin4j简单使用教程
Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换,拼音输出格式可以定制,在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,这时候Pinyin4j就可以派上用场 有自己私服的可以 ...
- On The Way—Step 1 :python入门之Python的历程
1.python的历史 2004 Django框架 python2 和 python3的区别 python2 源码不统一 有重复功能代码 python3 源码统一 没有重复功能代码 Python的发展 ...
- Redis Sentinel基本实现原理
一.出现的背景: Redis 主从复制模式下一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用这种场景的这种故障处理方式是非常浪费人力的.为了 ...
- JVM(二):画骨
### 概述 我们首先来认识一下`JVM`的运行时数据区域,如果说`JVM`是一个人,那么运行时数据区域就是这个人的骨架,它支撑着JVM的运行,所以我们先来学习一下运行时数据区域的分类和简单介绍. # ...
- Jquery事件和选择器 纠错
1: 试题分析:该题考的是jQuery中事件绑定的知识.绑定事件用bind()方法,选项A是正确的绑定事件语法,因此是正确的答案.选项BCD的语法是错误的. 2: 试题分析:opacity 必需.规定 ...
- MySQL操作命令梳理(2)
一.表操作 在mysql运维操作中会经常使用到alter这个修改表的命令,alter tables允许修改一个现有表的结构,比如增加或删除列.创造或消去索引.改变现有列的类型.或重新命名列或表本身,也 ...
- Unity经典游戏教程之:雪人兄弟
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...