[noip模拟20170921]模版题
今天考的是一套很基础的模版题,但是我这种蒟蒻竟然还是没有AK,不得不说,蒟蒻和大佬的差别不是一点点啊
1.暴走的猴子(walk.pas/c/cpp)
【题目描述】
从前有一个森林,森林里生活着一群猴子,这里猴子有个恶趣味——暴走。现在给你这个森林里的树木描述,你能计算出这只猴子在暴走k步后会蹦达到哪里吗(友情提示:由于你上周帮助猎人写程序打死了猴子父亲,所以今天猴子特别不爽,故意暴走了很多很多步来为难你,从而导致了k非常的大,做好心里准备噢~)
【输入数据】
第一行两个数n,m表示树木数和询问次数
接下来n行,第i个数一个数ai表示这只猴子当前在第i棵树的话,下一步会走到第ai棵树
接下来m行,每行两个数t,k,询问如果当前猴子在第t棵树,k步之后它会到第几棵树
【输出数据】
m行为每次询问的结果
【样例输入】
3 2
2
3
2
1 2
2 4
【样例输出】
3
2
【数据范围】
共十个测试点,每个测试点数据规模如下所示
1.n=10^2,m=n,k<=10^2
2.n=10^3,m=n,k<=10^3
3.n=10^4,m=1,k<=10^9
4.n=10^5,m=1,k<=10^9
5.n=10^5,m=1,k<=10^12
6.n=10^5,m=1,k<=10^15
7.n=10^5,m=1,k<=10^18
8.n=10^5,m=n,k<=10^12
9.n=10^5,m=n,k<=10^15
10.n=10^5,m=n,k<=10^18
【时限】
1s
【想法】
我自己一直没有把样例读懂所以一直没有做这道题,直到大佬Ztraveller给(gay)我解释了一下样例我才知道自己为啥错
可能刚刚读题我不一定会知道这是怎么做的(毕竟RMQ的题我刷的比较少了)
但是RMQ 确实是一个很有趣的算法,RMQ的定义一般都是f[i][j]表示从第i位开始往后数2^j个位置
RMQ我以前做过都是一般储存f[i][j]第i位起的2^j个位置的最大最小值
但是这道题要储存为第i位开始走2^j个位置后所在的位置
题不难,理解就好办了
这题可能唯一有理解方面的难度就是最后求值的位置,我先把代码放出来在解释一下
while(m--)
{
scanf("%d%I64d",&t,&k);
int sum=;
while(k!=)
{
if(k%!=)t=dp[t][sum];
k=k/;
sum++;
}
printf("%d\n",t);
}
内部的那个while循环为啥会那样写,我就给2个例子来说明(例子中第i个数都是到第i+1个数,就是一条链)
1.初始:t=1,k=11,sum=0;——>t=d[1,0]=2,k=5,sum=1;——>t=d[2,1]=4,k=2,sum=2;——>t=4,k=1,sum=3——>t=d[4,3]=12,k=0,sum=4,跳出
2.初始:t=1,k=12,sum=0——>t=1,k=6,sum=1;——>t=1,k=3,sum=2——>t=d[1,2]=5,k=1,sum=3——>t=d[5,3]=13,k=0,sum=4,跳出
从两个例子看出,其实这个东东是和二进制挂钩的,11可以分解成8+2+1是2的3,2,0次方,所以你可以发现在t的值有变化时,j的值就是这三个
同理,12分解为8+4是2的3,2次方,所以t的值变化对应的j也是这两个值
最后看一个完整的代码
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#define maxn 100005
using namespace std; long long k;
int ans,n,dp[maxn][],m,t; int main()
{
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&dp[i][]);
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
int nxt=dp[i][j-];
dp[i][j]=dp[nxt][j-];
}
while(m--)
{
scanf("%d%I64d",&t,&k);
int sum=;
while(k!=)
{
if(k%!=)t=dp[t][sum];
k=k/;
sum++;
}
printf("%d\n",t);
}
}
2.划分数列(seq.pas/c/cpp)
【题目描述】
给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小
【输入格式】
第一行两个正整数n,k
第二行为此数列ai
【输出格式】
一行一个数,为题目所求答案
【样例输入】
5 2
2 1 3 4 5
【样例输出】
9
【数据规模】
30%数据 n <= 30, k <= 10
100%数据 n <= 100000, k <= n, ai <= 10^9
150%数据 n <= 100000, k <= n, |ai| <= 10^9(附:这50分超越了noip难度,大家可以无视)
【时限】
1s
【想法】
150%的数据我自动无视了,我就只谈一谈100%的做法
连我这种蒟蒻都是一 眼看出是二分的题就肯定是二分的题了
对于这道题我错了我只想说:no zuo no die
我的原程序是正确的,但是脑子抽了去压代码去了,然后就全WA了
这道题没有啥思想难度,而且数据范围也好办,二分的r开始是总大小,l开始是1或者单个最大值都没问题,因为范围比较水
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
#include<cstdlib>
#include<cmath>
#define maxn 100005
using namespace std; int n,a[maxn],sum,l,r,ans=-,m; int check(int mid)
{
int tot=,k=;
for(int i=;i<=n;i++)
{
tot+=a[i];
if(tot>mid)
{
tot=a[i];
k++;
if(k==m)return ;//数字还没用完就已经不能再分区了
}
}
if(tot<=mid&&k<m)return ;//如果遍历完了(分区完了)还没跳,这时候的k会比正常的少1
else return ;
} int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
l=;r=sum;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid)){
if(mid<ans||ans==-){
ans=mid;
}
r=mid-;
}else l=mid+;
}
printf("%d",ans);
}
3.无聊的游戏(boring.pas/c/cpp)
【题目描述】
有一个很无聊的游戏,就是——根据递推公式计算数列
没错,这道题就是这么无聊!
给你数列f(0)=1, f(n)=f(n-1)^2+1 (n > 0)
求出f(n)
(既然题目已经这么无聊了,那就不让大家写高精度了,取个模好了)
【输入格式】
一个整数n
【输出格式】
一行一个整数f(n),结果对1200007取模
【样例输入】
3
【样例输出】
26
【数据规模】
10%数据 1<=n<=10
30%数据 1<=n<=10^6
100%数据 1<=n<=10^9
【时限】
1s
【思想】
这道题的暴力思路很容易想,但是你可以深入思考一下,这种题数据范围这么大,肯定有正常一点的方法
虽然很多大佬对于这种情况脱口而出:打表暴力
。。。。。。。。。。。这个嘛,打表也是可以A的
但是还有一个简单的方法,就是找规律。。。。。
找规律,怎么找???暴力呗。你的暴力思路怎么样的,你就怎么找,这个是要取模的,所以你可以先猜测,是不是会出现循环
如果是,那么是从哪里出现循环,循环节是多少
这个时候你就可以开始跑循环了,如果发现一个位置的取模后的值和之前一个位置是一样的,就说明这里面是有猫腻滴(建议这里用hash判重)
然后你就可以以这两个位置来判断一下下你检测的对不对,手动测几组相邻的数据
然后跑出来后发现循环开始是第803个数,然后循环节是570,意思是前802个数没有循环滴,从803才开始有的
然后这就很好想了吧。803+570=1373,你保个险,随随便便打个1500以内的暴力就行了呗,反正所有的值都在这个范围内
【总结第三题】
考试时,有些题可以先打暴力找规律滴,规律找到了你就可以开始逆天了
【代码】
#include<cstdio>
#include<algorithm>
#include<iostream>
#define mod 1200007
using namespace std;
long long f[],n;
int main(){
freopen("boring.in","r",stdin);freopen("boring.out","w",stdout);
f[]=;for(int i=;i<=;i++){f[i]=(((f[i-]%mod)*(f[i-]%mod))%mod+)%mod;}
cin>>n;if(n<=){cout<<f[n];}else{n-=;n%=;if(n==)n=;n=n+;cout<<f[n];} }
[noip模拟20170921]模版题的更多相关文章
- noip模拟赛 水题
题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽分别是xi和yi.对于第二副牌的每张牌长和宽分别是aj和bj.第一副牌的第i张牌能覆盖第二副牌的第 ...
- 2016 10 26考试 NOIP模拟赛 杂题
Time 7:50 AM -> 11:15 AM 感觉今天考完后,我的内心是崩溃的 试题 考试包 T1: 首先看起来是个贪心,然而,然而,看到那个100%数据为n <= 2000整个人就虚 ...
- [NOIP模拟测试9]题(Problem) 题解 (组合数全家桶+dp)
达哥送分给我我都不要,感觉自己挺牛批. $type=0:$ 跟visit那题类似,枚举横向移动的步数直接推公式: $ans=\sum C_n^i \times C_i^{\frac{i}{2}} \t ...
- NOIP 模拟 $23\; \rm 题$
题解 \(by\;zj\varphi\) 考虑 \(\rm DP\) 设 \(dp_{k}(S)\) 表示前 \(k\) 个人来后 \(S\) 集合中的苹果都存在的概率是否大于 \(0\) 考虑倒着转 ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
随机推荐
- Spring-Boot-应用可视化监控
图文简介 快速开始 1.Spring Boot 应用暴露监控指标[版本 1.5.7.RELEASE] 首先,添加依赖如下依赖: <dependency> <groupId>or ...
- fsLayuiPlugin联动表格使用(一)
简单联动表格使用 点击主表格,加载副表格数据, 演示地址:http://fslayuiplugin.fallsea.com/views/linkageDatagrid/index.html 联动表格配 ...
- css 进度条的文字根据进度渐变
需求 1.进度条里面的文字需要根据进度的长度而变化 原理 用两个一模一样的样式的 div 重叠起来 效果 字体开始为 蓝色,跟随进度条变为 白色 在线预览: https://jsfiddle.net/ ...
- 《高性能javascript》阅读摘要
最近在阅读这本Nicholas C.Zakas(javascript高级程序设计作者)写的最佳实践.性能优化类的书.记录下主要知识. 加载和执行 脚本位置 放在<head>中的javasc ...
- # 记一次Tomcat升级——幽灵猫
一.背景 近日Tomcat被爆出幽灵猫漏洞,覆盖的版本从6-9全部中招,因此升级是当前能做的手段,那么就来说一下SpringBoot内置的Tomcat如何升级. 二.升级过程 1 下载对应的版本 To ...
- .Net vs .Net Core,我改如何选择?看这一篇文章就够了
前言 .Net目前支持构建服务器端应用程序的两种实现主要有两种,.NET Framework和.NET Core.两者共享许多相同的组件,并且您可以在两者之间共享代码.但是,两者之间存在根本差异,在我 ...
- C++ 函数模板/类模板
#include <iostream> #include <vector> using namespace std; template < class T > // ...
- Linux系统之LNMP及nginx反向代理实现
1.编译安装LNMP,并安装wordpress 首先准备环境,编译安装LNMP可以是多台主机,也可以是单台主机,把nginx,mysql,php都集中安装在一个主机上:我这里以一台主机为例吧!! 一. ...
- Jmeter——如何使得token在各线程组间引用的游刃有余
在以前的博文中,有介绍过,jmeter基本的关联,关联就是将参数在各接口中动态传参,使得接口脚本变得灵活使用,非一次性脚本.今天再来介绍一种jmeter全局变量的设置与使用,可以让脚本运用更丰富,场景 ...
- Android UI性能测试——使用 Gfxinfo 衡量性能
Android官方文档翻译 原文地址:https://developer.android.com/training/testing/performance参考:https://www.jianshu. ...