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只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- 使用canvas来完成线性渐变和径向渐变的功能
fillStyle的第二种使用情况就是渐变色的填充.渐变色就分为线性渐变色和径向渐变色. 线性渐变:大致分为两步 这里又会使用到canvas的两个新的函数. 第一步 : 使用一个新的函数cre ...
- 关于STM32F103+ESP8266+阿里云过程之设备状态更新至阿里云(三)
设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,PM2.5值上报更新至阿里云. 1.查看Topic. 在阿里云平台上 设备->Topic列表中查看.在产品中也可以看到对应的Topi ...
- 【iOS】UIImageView 点击事件
UIImageView 并不像 UIButton 那样点击鼠标就可以关联点击事件,也不像 Android 里有 onClickListener,这个时候就需要借助 UITapGestureRecogn ...
- 洛谷P1510 题解
前言: 其实这道题挺水的,但我居然把ta想成了 贪心 啪啪打脸 好了,废话不多说. 思路: step 1:先翻译以下题意,其实就是求出最多消耗多少体力能把东海填满,如果不能填满,就输出"Im ...
- L1005矩阵取数游戏
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for ( ...
- jquery 动态载入页面,并且保证 url 变动
最近做一个新的项目,项目页头,导航,页尾是不变的,只有中间部分是通过加载其他页面,达到内容刷新的. 大概结构如下, 要求, 1. 正文部分可以通过加载一个页面达到刷新效果 2. 保留加载的页面 url ...
- Java实现调用Bartender控制条码打印机
官方提供的主要是C#支持. 基于java调用bartender二次开发官方给了一份1998年的J#代码,,,完全用不了,,,百度谷歌搜索万能的网友的答案,发现也没有可参考的.. 最后想到了之前用到了一 ...
- leetcode 29 两数相除
问题描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 ...
- 08_代码块丶继承和final
Day07笔记 课程内容 1.封装 2.静态 3.工具类 4.Arrays工具类 封装 概述 1.封装:隐藏事物的属性和实现细节,对外提供公共的访问方式 2.封装的好处: 隐藏了事物的实现细节 提高了 ...
- Mysql超详解
Mysql超详解 一.命令框基本操作及连接Mysql 找到Mysql安装路径,查看版本 同时按快捷键win+R会弹出一个框,在框中输入cmd 点击确定后会出现一个黑框,这是命令框,我们的操作要在这命令 ...