启智树提高组day1T1 3436 : A:Doughnut

原题传送门

题目描述

Aloisia有很多很多甜甜圈。有一天,她在地上画了n+1个格子,想从第1个格子跳到第n+1个格子。规则是,Aloisia每到一个格子,都会放一个甜甜圈在里面。在第i个格子时,如果当前甜甜圈的数量是偶数,那么她会跳到第i+1个格子;否则她会跳到第Pi个格子(1≤Pi≤i)。若她到达了第n+1个格子,则立即结束。Aloisia想知道,她要跳多少次才能到达终点。答案对1000000007取模。

输入

输入的第一行包含一个正整数n,表示一共有n+1个格子;
第二行包含n个正整数Pi ,含义如题目描述中所述。

输出

输出一个整数,表示Aloisia需要跳的次数,对1000000007取模。

样例输入

Copy

样例输入1
2
1 2 样例输入2
4
1 1 2 3 样例输入3
5
1 1 1 1 1

样例输出

Copy

样例输出1
4 样例输出2
20 样例输出3
62

提示

对于20%的数据,有1 ≤ n ≤ 20;

对于40%的数据,有1 ≤ n ≤ 2000;

对于100%的数据,1 ≤ n ≤ 1000000。

要求

时间限制:2.0Sec    内存限制:256MB

建立模型

由样例可得,前进一格后,先放甜甜圈,再判断奇偶性。

故有:对于脚下的格子,如果是奇数次到达则回到p[i],如果是偶数次到达则向后走。

当然,知道这个,也许不能完全做出来。那么就要接下来的性质了。

性质:当第一次走到i+1个格子的时候,前i个格子里面的甜甜圈数量都为偶数个。

又因为,如果是奇数次(比如首次)到底必定回到p[i]后又会前进到i,故这个可以看作是一个递推。

f[i]=f[p[i]~i-1]+2;

f[i]表示第一次走到i格时,要走f[i]步才能走回到第i格

+2意为有两次从i-1走到i

最后,求f[p[i]~i]可以用前缀和(这是我的做法)

亦或,f[i]=f[i-1]+2+(f[i-1]-f[p[i])(std)

数据生成

 1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<map>
7 #include<set>
8 #include<queue>
9 #include<vector>
10 #include<ctime>
11 #define IL inline
12 #define re register
13 #define LL long long
14 #define ULL unsigned long long
15 using namespace std;
16 //当到达post时,前面的tt全都是偶数(再走过去就会变成偶数)
17 int n;
18
19 int main()
20 {
21 srand(clock());
22 cin>>n;
23 freopen("t1.out","w",stdout);
24 cout<<n<<endl;
25 for(int i=1;i<=n;i++) cout<<rand()%i+1<<" ";
26 return 0;
27 }

数据生成

注意p[i]应当小于等于i。

code

task1

 1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<map>
7 #include<set>
8 #include<queue>
9 #include<vector>
10 #define IL inline
11 #define re register
12 #define LL long long
13 #define ULL unsigned long long
14 using namespace std;
15 /*
16 Aloisia每到一个格子,都会放一个甜甜圈在里面。在第i个格子时,
17
18 如果当前甜甜圈的数量是偶数,那么她会跳到第i+1个格子;
19
20 否则她会跳到第Pi个格子(1≤Pi≤i)。
21
22 */
23
24 IL int read()
25 {
26 int ans=0;
27 bool fu=0;
28 char ch=getchar();
29 while((ch>'9'||ch<'0')&&ch!='-') ch=getchar();
30 if(ch=='-') fu=1,ch=getchar();
31 while(ch<='9'&&ch>='0') ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
32 if(fu) ans*=-1;
33 return ans;
34 }
35
36 const int M = 1000000007;
37
38 int n,ans;
39
40 int p[1000010];
41
42 int tt[1000010];
43
44 int main()
45 {
46 freopen("t1.out","r",stdin);
47 cin>>n;
48 for(int i=1;i<=n;i++) p[i]=read();
49 int post=1;
50 while(post<=n)
51 {
52 ans++;
53 if(ans>M) ans-=M;
54
55
56 // cout<<ans;
57 // cout<<"当前位置"<<post<<endl;
58 // cout<<"当前tt"<<tt[post]<<endl;
59
60 if(tt[post]&1) tt[post]++,post++;
61 else tt[post]++,post=p[post];
62 // getchar();
63
64 }
65 cout<<ans;
66 return 0;
67 }

暴力

task2

没打。

task3

 1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<map>
7 #include<set>
8 #include<queue>
9 #include<vector>
10 #define IL inline
11 #define re register
12 #define LL long long
13 #define ULL unsigned long long
14 using namespace std;
15 /*
16 Aloisia每到一个格子,都会放一个甜甜圈在里面。在第i个格子时,
17
18 如果当前甜甜圈的数量是偶数,那么她会跳到第i+1个格子;
19
20 否则她会跳到第Pi个格子(1≤Pi≤i)。
21
22 */
23
24 IL int read()
25 {
26 int ans=0;
27 bool fu=0;
28 char ch=getchar();
29 while((ch>'9'||ch<'0')&&ch!='-') ch=getchar();
30 if(ch=='-') fu=1,ch=getchar();
31 while(ch<='9'&&ch>='0') ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
32 if(fu) ans*=-1;
33 return ans;
34 }
35
36 const int M = 1000000007;
37
38 int n,ans;
39
40 int p[1000010];
41
42 bool tt[1000010];
43
44 int jump[1000010];
45
46 int qjump[1000010];
47
48 int main()
49 {
50 freopen("t1.out","r",stdin);
51 cin>>n;
52 for(int i=1;i<=n;i++){
53 p[i]=read();
54 jump[i]=2;
55 if(i!=p[i]){
56 // for(int j=p[i];j<i;j++) jump[i]+=jump[j];
57 jump[i]+=(qjump[i-1]+M-qjump[p[i]-1])%M;
58 }
59 qjump[i]=qjump[i-1]+jump[i];
60 qjump[i]%=M;
61 // cout<<i<<" "<<jump[i]<<endl;
62 ans+=jump[i];
63 ans%=M;
64 }
65
66 cout<<ans;
67 return 0;
68 }

std

 1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 typedef long long ll;
6
7 const int N = 1e6 + 10;
8
9 const int P = 1e9 + 7;
10
11 int n, p[N];
12
13 ll f[N];
14
15
16
17 int main(){
18
19 freopen("Doughnut.in", "r", stdin);
20
21 freopen("Doughnut.out", "w", stdout);
22
23 scanf("%d", &n);
24
25 for(int i = 1;i <= n; i++)
26
27 scanf("%d", &p[i]);
28
29 f[1] = 0;
30
31 for(int i = 1;i <= n; i++)
32
33 f[i + 1] = (f[i] + 1 + f[i] - f[p[i]] + 1) % P;
34
35 printf("%lld\n",(f[n + 1] + P) % P);
36
37 return 0;
38
39 }

小结

考试中得分100。

两天以来唯一一道AC题……(哭/(ㄒoㄒ)/~~

这种小题目要快速思考,给后面的题目留时间。

启智树提高组day1T1 3436 : A:Doughnut的更多相关文章

  1. 洛谷P1003 铺地毯 noip2011提高组day1T1

    洛谷P1003 铺地毯 noip2011提高组day1T1 洛谷原题 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n ...

  2. 洛谷P1003 [NOIP2011提高组Day1T1]铺地毯

    P1003 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号 ...

  3. noip2015 提高组 day1t1 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  4. luogu1097统计数字[noip2007提高组Day1T1]

    题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...

  5. 暑假提高组集训Day1 T1

    说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...

  6. Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组  时间限制: 1 s   空间限制: 128000 KB   题目等级 : ...

  7. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  8. 【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换

    [佛山市选2013]JZOJ2020年8月7日提高组T2 树环转换 题目 描述 给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1.树的节点编号从1开始.在 ...

  9. NOIP2018初赛总结(提高组)(试题+答案+简要解析)

    NOIP2018初赛总结(提高组) 更新完毕(纯手敲),如果有错误请在下面留言 单选题 T1.下列四个不同进制的数中,与其它三项数值上不相等的是 A.\((269)_{16}\) B.\((617)_ ...

  10. NOIP2018提高组省一冲奖班模测训练(二)

    比赛链接 NOIP2018提高组省一冲奖班模测训练(二) 今天发挥正常,昨天不在状态…… 花了很久A了第一题 第二题打了30分暴力 第三题投机取巧输出test1答案(连暴力都不知道怎么打,太弱了) 2 ...

随机推荐

  1. 【ABAQUS后处理】打印视口到文件

    abaqus cae 允许您在画布上打印一个或多个视口的快照,并将图像直接发送到打印机或文件以供以后使用,例如包含在嵌入打印报告的演示文稿中或以 html 格式显示document 打印的图像将在画布 ...

  2. ITSM运维管理整理总结

    ITSM 和我们平常所说的软件管理最大的不同? 目标不是管理技术,主要任务是管理用户和客户的IT需求 2.人员.技术.流程[重要] 3.几大模块 模块名称 干什么 备注 服务台 1.对接客户的前方,负 ...

  3. python3 ModuleNotFoundError: No module named 'CommandNotFound'

    前言 python3 报错:ModuleNotFoundError: No module named 'CommandNotFound' 这是 linux 安装多版本 python 时的一个遗留问题, ...

  4. 【Azure Fabric Service】演示使用PowerShell命令部署SF应用程序(.NET)

    问题描述 在中国区微软云Azure上使用Service Fabrics服务,本地通过Visual Studio 2022的发布.NET应用,发现无法发布! 在搜寻官方文档之后,可以通过PowerShe ...

  5. anaconda创建新环境

    博客地址:https://www.cnblogs.com/zylyehuo/ anaconda创建新环境 conda create -n 环境自定义的名称 python=版本号 anaconda指定路 ...

  6. bug|项目经验|记录某次页面div使用v-html标签渲染图片等内容的过程

    前言 记录某次页面div使用v-html标签渲染图片等内容的过程 一.结论: get请求但被设置Sec-Fetch-*请求头的图片无法展示. 二.原因: 1.本项目中的img标签发起get请求,目标链 ...

  7. 英语面试-Behavioral Question - first part

    前言 希望我总结的行为面试问题和答案能够给大家帮助. 学习方法:每个问题都有三部分组成. 第一部分是语料积累,这里是根据视频中的内容总结而来: 第二部分是中文描述,这里主要根据我自己的经历结合问题做出 ...

  8. MySQL-全句锁、表锁和元数据锁

    全局锁 全局锁是锁住整个数据库实例,只能读,任何关于更新操作的语句都会阻塞. 全局锁的适用场景 针对数据库做全库的逻辑备份操作时,需要使用全局锁. 全局锁的影响: 如果在主库上做全局锁操作,业务基本停 ...

  9. js将 2023-07-13T10:12:23+0800转为 YYYY-MM-DD HH:mm:ss格式

    // 封装的日期时间格式化函数 function formatDateTime(dateTimeString) { const inputDate = new Date(dateTimeString) ...

  10. 多态的前提--java进阶day02

    1.多态的前提条件 第一点和第二点都很好理解,第三点父类引用指向子类对象是什么意思?以下图进行讲解 我们以前的写法,如下图,叫做子类引用指向子类 那父类引用呢?就是把左边换成父类Animal即可 因为 ...