SDOI模拟赛 #9

2018.10.14 8:00~11:30

Powered By _C_H_M_ , Marser

(Please Read The Instructions On This Page Carefully)

一、题目概览

题目名称

流星

Hash键值

麦田

灯光

紫罗兰

英文名称

meteor

hash

field

lighting

violet

可执行文件名

meteor

hash

field

lighting

violet

输入输出文件

meteor.in/out

hash.in/out

field.in/out

lighting.in/out

violet.in/out

时间限制

1000 ms

1000 ms

150 ms

1000 ms

5000ms

空间限制

128 MB

128 MB

128 MB

128 MB

512MB

题目类型

传统型

传统型

传统型

传统型

传统型

编译命令

-lm

-lm

-lm

-lm -Wl,--stack=102400000

-lm -Wl,--stack=102400000     -O2

测试点(包)数目

20

3

10

10

2

测试点是否等分

二、注意事项

1. 文件名(源程序名和输入输出文件名)必须使用小写。

2. 评测在windows下lemon中进行。输入输出long long int 类型数值请使用cin/cout 或“%lld”。

3. main函数的返回值类型必须是int,程序正常结束时返回值必须是0。

4. 题目较水,请AK的同学不要D出题人,没AK的同学也不要D出题人。赛后会向AK的同学、前三名同学以及AC附加题的同学发放奖品。

5. 本次采用OI赛制,在比赛结束后统一交题,祝大家RP=INT_MAX。

第一题:

题目:

流星(meteor)

【题目背景】

我带着深藏骨血的仇恨与酝酿多年的阴谋

把自己变成一个死而复生的幽灵 沉入沼泽,沉入深渊

我想埋下腐烂的根系 长出见血封喉的荆棘 刺穿这个虚伪的文明

我到了淤泥深处…… 捡到了一颗星星。

晨光起于白塔尖顶,终将铺满阴霾之地。

【题目描述】

Marser正在和副词看星星。这时,他们发现了一颗流星划过天际。Marser出于习惯,记录下了这颗流星出现和消失的位置。Marser用两组坐标来描述这两个位置。你可以认为它们被Marser放在了一个原点由Marser指定的笛卡尔坐标系中。

现在,副词为了考验Marser的智商,想问他一个问题:按照Marser的坐标系定义,这颗流星一共经过了多少个格点?这里,格点被定义为坐标均为整数的点。

Marser用了1ms就完成了这个问题,于是他想用这个问题来测试您的智力。当然,为了简化您的操作,您可以把流星的运动轨迹看成一条直线。这样,您可以把这个问题转化为求一条线段除了端点外经过了多少个格点。

【输入格式】

从文件meteor.in中读入。

读入两行,每行两个整数x,y,表示线段的两个端点的坐标。

【输出格式】

输出到文件meteor.out中。

输出一行一个整数,表示除了两个端点外,线段经过的格点数量。

【输入输出样例】

meteor.in

meteor.out

1 11

5 3

3

【数据范围与约定】

解析:

我们想象把这条线段的一个端点已到原点,则另一点变为(x2-x1,y2-y1),所以这道题目就变为在函数y=(y2-y1)/(x2-x1)x中,(0<x<=x2-x1)找到有多少个整数x使得y也为整数,我们代入一个数值去算,那么必然是先将(y2-y1)/(x2-x1)化为最简形式,x2-x1/x2-x1(化解后)即为答案,其实这个值就是他们之前化解的倍数即为gcd(x2-x1,y2-y1);

错点:

1、数据范围,注意使用long long定义;

2、特判端点重合,线段与x,y轴平行的情况

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define ll    long long
using namespace std;
ll gcd(ll x,ll y){if(y>x)return gcd(y,x);if(y==0)return x;return gcd(y,x%y);
}
int main(){freopen("meteor.in","r",stdin);freopen("meteor.out","w",stdout);ll x1,x2,y1,y2;cin>>x1>>y1>>x2>>y2;if(x1==x2&&y1==y2){printf("0");return 0;}x2-=x1;y2-=y1;if(x2<0)x2-=2ll*x2;if(y2<0)y2-=2ll*y2;ll d=gcd(x2,y2);if(y2==0)printf("%lld",x2-1);else if(x2==0)printf("%lld",y2-1);else printf("%lld",d-1);return 0;
} 

View Code

第二题:

题目:

Hash键值(hash)

【题目背景】

所有的苦难与背负尽头,

都是行云流水般的此世光阴。

一生所渴求的,全都伤人至深。

而一生所憎恶的,全都令人魂牵梦萦。

【题目描述】

Marser沉迷hash无法自拔,然而他发现自己记不住hash键值了……

Marser使用的hash函数是一个单纯的取模运算,每一个数i被对应到i mod p。他现在有一个数列,他采用这种方法,把每一个数对应到一个键值i mod p。他想知道对于给定的模数p和键值r,所有对应到该键值的数的和为多少。同时,Marser可能会发现他的数列出了一些问题,所以他还想随时更改数列中任意一项的值。

现在Marser有q个请求,每个请求可能是修改或是询问。对于每一个询问,你需要给出正确的答案。如果你不能在1s内正确回答所有询问,Marser就会让hotwords把你给续了。

【输入格式】

从文件hash.in读入。

第一行两个整数n,q,表示数列长度和请求数量。

第二行n个整数,表示初始的序列。

接下来m行,每行三个整数opt,x,y;

若opt=1,则询问在mod x时,所有对应到键值y的数的和。

若opt=2,则将数列第x项修改为y。

【输出格式】

输出到文件hash.out中。

对于每个询问,输出相应的答案。

【输入输出样例1】

hash1.in

hash1.out

10 5

1 2 3 4 5 6 7 8 9 10

1 2 1

2 1 20

1 3 1

2 5 1

1 5 0

25

41

11

【输入输出样例2】

见下发文件中的hash2.in/ans

该样例满足子任务二的性质。

【输入输出样例3】

见下发文件中的hash3.in/ans

该样例满足子任务三的性质。

【数据范围与约定】

解析:

其实子任务1和2都较容易实现,(2尚未成功),而总体的解决方案其实是在这两个之间折中选择

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int n,m,q;
int a[101010],sum[1010][1010];
int opt,x,y;
int main(){freopen("hash.in","r",stdin);freopen("hash.out","w",stdout);scanf("%d%d",&n,&q);m=sqrt(n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);for(int j=1;j<=m;j++)sum[j][i%j]+=a[i];}int ans=0;while(q--){scanf("%d%d%d",&opt,&x,&y);if(opt==1){if(x<=m)printf("%d\n",sum[x][y]);else{ans=0;for(int i=y;i<=n;i+=x)ans+=a[i];printf("%d\n",ans);}}else{for(int i=1;i<=m;i++)sum[i][x%i]=sum[i][x%i]-a[x]+y;a[x]=y;}}return 0;
}

View Code

第三题:

题目:

麦田(field)

【题目背景】

我心里有一簇迎着烈日而生的花,

比一切美酒都要芬芳,

滚烫的馨香淹没过稻草人的胸膛,

草扎的精神,从此万寿无疆。

凝视深渊的人,深渊也在凝视你。

我不是凝视深渊的人,我就是深渊。

【题目描述】

Marser来到了一片麦田。他想穿过这片麦田,去找副词一起学习。

但是,他发现这片麦田有一些特殊的性质。我们可以把麦田抽象成一片的网格,每个格子上都有一个数字。同时,Marser按如下的方式表示前进的方向:

如果往与所在格子上数字相同的方向前进,Marser不需要花费体力;而往其他方向前进时,Marser就需要额外花费1单位的体力。

现在,Marser想知道,从给定的起点前进到给定的终点,最少需要消耗多少体力?

【输入格式】

从文件field.in读入。

第一行两个整数n,m,表示麦田的大小。

接下来n行,每行一个长度为m的字符串,表示每个格子上的数字。

接下来一行,四个整数,表示起点和终点的位置。

【输出格式】

输出到文件field.out中。

输出一行一个整数,表示最少需要消耗的体力。

【输入输出样例1】

field1.in

field1.out

5 5

04125

03355

64734

72377

02062

4 2 4 2

0

【输入输出样例2】

field2.in

field2.out

5 5

04125

03355

64734

72377

02062

4 5 1 4

2

【输入输出样例3】

见下发文件中的field3.in/ans

该样例满足。

【数据范围与约定】

解析:

尝试模拟SPFA的SLF优化,就是若dis[j]<dis[i],就加到队头,否则加到队尾,对于这道题来说,就只有0和1两种权值,所以0加队首,1加队尾

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int mod=1000000;
int dis[1010][1010];//以x,y为起点,算到每个位置的花费;
int que[1010101][2];//因为有x,y两个坐标,所以是2
int dx[8]={-1,-1,0,1,1,1,0,-1};//为了后面判断后面要走0还是1
int dy[8]={0,1,1,1,0,-1,-1,-1};//要根据八个位子的数字来修改x,y
char map[1010][1010];
int n,m,x1,y1,x2,y2;
int main(){freopen("field.in","r",stdin);freopen("field.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%s",map[i]+1);scanf("%d%d%d%d",&x1,&y1,&x2,&y2);dis[x1][y1]=0;int he=0,tai=1;memset(dis,0x3f,sizeof(dis));que[he][0]=x1,que[he][1]=y1;dis[x1][y1]=0;while(he!=tai){int x=que[he][0],y=que[he][1];he++; if(x==x2&&y==y2)break;for(int i=0;i<8;i++){int xx=x+dx[i],yy=y+dy[i];if(!xx||!yy||xx>n||yy>m)continue;//这样写很方便;if(dis[xx][yy]>dis[x][y]+(map[x][y]-'0'!=i)){dis[xx][yy]=dis[x][y]+(map[x][y]-'0'!=i);//如果条件成立就+1if(map[x][y]-'0'!=i){que[tai][0]=xx,que[tai][1]=yy;tai++;} else {he--;que[he][0]=xx,que[he][1]=yy;}//重点,因为先he就加过了所以-回来
            } }}printf("%d",dis[x2][y2]);
}

View Code

总结:

对于这类的题,要么不费力气,要么费一点,都有同样的做法,显然用这种速度是极快的;这样写有两个很方便的地方,一个是if(!xx||!yy||xx>n||yy>m)continue;这样有效避免了很多无谓的重复,还有就是dis[xx][yy]=dis[x][y]+(map[x][y]-'0'!=i);,如果成立就加1,否则加0,这样写也很方便;

转载于:https://www.cnblogs.com/linzeli/p/9795139.html

20181014NOIP模拟相关推荐

  1. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  2. curl模拟post请求

    另外可尝试 postman工具 或者用request 直接请求 CURL 发送POST请求curl -header "Content-Type: application/json" ...

  3. flask_模拟请求post,get

    #coding:utf-8 import requestsres = requests.post(url="http://192.168.135.105:8888/",data={ ...

  4. 模拟内存计算如何解决边缘人工智能推理的功耗挑战

    模拟内存计算如何解决边缘人工智能推理的功耗挑战 How analog in-memory computing can solve power challenges of edge AI inferen ...

  5. 为放大器模拟输入模块提供可靠的输入过电压保护

    为放大器模拟输入模块提供可靠的输入过电压保护 Signal Chain Basics #159: Provide robust input overvoltage protection for amp ...

  6. 模拟Servlet本质

    JavaWeb系列教程,持续更新 JavaWeb-Servlet 模拟Servlet本质 使用IDEA开发Servlet程序 Servlet对象的生命周期 适配器(GenericServlet)改造S ...

  7. 2021年大数据Flink(四十):​​​​​​​Flink模拟双十一实时大屏统计

    目录 Flink模拟双十一实时大屏统计 需求 数据 编码步骤: 1.env 2.source 3.transformation 4.使用上面聚合的结果,实现业务需求: 5.execute 参考代码 实 ...

  8. Python:模拟登录、点击和执行 JavaScript 语句案例

    案例一:网站模拟登录 # douban.pyfrom selenium import webdriver from selenium.webdriver.common.keys import Keys ...

  9. 杨老师课堂_Java核心技术下之控制台模拟文件管理器案例

    背景需求介绍: 编写一个模拟文件管理器的程序,实现控制台对文件和文件夹的管理操作. 要求在此程序中: 当用户输入指令 1 时,代表"指定关键字检索文件",此时需要用户输入检索的目录 ...

最新文章

  1. 语音信号处理_书单 | 语音研究进阶指南
  2. python判断哪个数最小_怎么用python比较三个数大小
  3. ubuntu报错:E: 仓库 “http://ppa.launchpad.net/docky-core/ppa/ubuntu bionic Release” 没有 Release 文件
  4. 有选择性的启用SAP UI5调试版本的源代码
  5. (转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
  6. android 补签控件,墨墨背单词怎么补签 看完你就懂了
  7. 指针05:const修饰指针
  8. 数据库系统原理笔记:关系数据库设计
  9. c语言游戏小型程序代码,C语言小游戏源码
  10. JBoss下载与安装
  11. Xpose 建立新工程
  12. eclipse保存文件出现save could not be completed. Try File Save As..
  13. 制作精良、功能强大、毫秒精度、专业级的定时任务执行软件功能详解 —— 定时执行专家
  14. 2018年年底PC浏览器使用率
  15. DOS操作系统基本使用方法
  16. Matebook xpro2019指纹驱动不可用
  17. Linux(程序设计):29---Zlib库(数据压缩与解压)
  18. 计算机夏令营英语自我介绍,保研夏令营英文自我介绍3篇
  19. 电影后台管理系统(实训)
  20. 如何获取LINUX主机所有的IP

热门文章

  1. VS2015问题:stack around the variable “XX” was corrupte
  2. Intel 正式宣布8代酷睿处理器:14nm、性能提升15%
  3. 使用id生成6位数(字母加数字),亲测不会重复
  4. iOS-app store 的应用下架,这个下架的应用名称 多久后才可以使用?
  5. iview实现table的可编辑
  6. 从C++转向Rust:两大主题值得关注!
  7. Pytorch 之修改Tensor部分值
  8. Redis巡检及优化建议
  9. 计算机word怎么选中全文,word选定全文快捷键是什么
  10. 企业微信会话存档功能开启