7.29NOIP模拟赛

T1

YSG (1s,64MB,ysg.in,ysg.out)

描述

ysg,yxy,azw 三人正在刷题。

他们每做一题的时间都是一个有理数。

如果在某一时刻,三人同时做完一道 题,那么,他们会开始谈笑风生。

现在,他们想知道,从时刻 0 开始,至少要等多久才能谈笑风生。

输入格式

一行 6 个整数 a1,b1,a2,b2,a3,b3,其中 ysg 每做一道题的时间是 a1/b1,

yxy 是 a2/b2,azw 是 a3/b3。不保证 a,b 互质。

输出格式

一行 2 个数 c,d,表示第一次谈笑风生是在时刻 c/d。其中 c,d 互质。

输入样例

  1. 3 6 4 5 3 1

输出样例

  1. 12 1

样例解释

在时刻 12,ysg 做了 24 道题,yxy 做了 15 道题,azw 做了 4 道题,他们开始 谈笑风生。

备注

对于 30%的数据,b1=b2=b3=1。 对于 100%的数据,a1,a2,a3,b1,b2,b3<=100

题解:

先将三个分数化简,

再三个分数通分(可以求最小公倍数,也可以分母直接相乘),同时乘以d,

求出通分后的数的最小公倍数c,

c/d化简一下即为答案

  1. 1 #include<iostream>
  2. 2 #include<cstring>
  3. 3 #include<cstdio>
  4. 4 using namespace std;
  5. 5 int a1,b1,a2,b2,a3,b3;
  6. 6 inline int gcd(int x,int y){
  7. 7 if(y>x) swap(x,y);
  8. 8 if(y==0) return x;
  9. 9 return gcd(y,x%y);
  10. 10 }
  11. 11 inline void huajian(int &x,int &y){
  12. 12 int g=gcd(x,y);
  13. 13 x/=g; y/=g;
  14. 14 }
  15. 15 inline int get_lcm(int a,int b,int c){
  16. 16 int l1=a*b/gcd(a,b);
  17. 17 return l1*c/gcd(l1,c);
  18. 18 }
  19. 19 int main()
  20. 20 {
  21. 21 freopen("ysg.in","r",stdin);
  22. 22 freopen("ysg.out","w",stdout);
  23. 23 scanf("%d%d%d%d%d%d",&a1,&b1,&a2,&b2,&a3,&b3);
  24. 24 huajian(a1,b1);
  25. 25 huajian(a2,b2);
  26. 26 huajian(a3,b3);
  27. 27 int lcm1=get_lcm(b1,b2,b3);
  28. 28 int lcm2=get_lcm(a1*lcm1/b1,a2*lcm1/b2,a3*lcm1/b3);
  29. 29 huajian(lcm1,lcm2);
  30. 30 printf("%d %d\n",lcm2,lcm1);
  31. 31 fclose(stdin); fclose(stdout);
  32. 32 return 0;
  33. 33 }

T2

YXY (1s,128MB,yxy.in,yxy.out)

问题描述

ysg,yxy,azw 三人正在刷题。

OJ 上一共有 n 道题,然而因为有的题的算法有人不会,所以他们决定每人做一道题。

现在他们已经分配好了做题任务,把每道题都指定给一个人做

但是如果有 人做的题数量比其他人多,他就会感觉不爽。

为了避免这种情况,他们只好选一些题不做,但是为了美观,他们做的题目 必须是连续一段。

他们现在想知道,有多少种选择的方案满足条件。

输入格式

输入数据有 n 行,每行一个字符串,为”ysg”,”yxy”,”azw”中的一个,

第 i 行代 表做第 i 题的人的名字。

输出格式

输出有多少种选择的方案

输入样例

  1. ysg
  2. yxy
  3. azw
  4. azw
  5. yxy
  6. azw
  7. yxy
  8. ysg
  9. yxy
  10. ysg
  11. ysg

输出样例

  1. 3

样例说明

有三种方案,选 1~3 一段,选 6~8 一段,选 3~11 一段,

每一段内三个名字,出现次数一样多

数据范围

对于 20%的数据,n <= 100。

对于 40%的数据,n <= 1000。

对于 100%的数据,n <= 100000

题解:

40pts:

搞三个前缀和数组,分别维护三个名字的出现次数,

O(n^2)查询,若一段区间内三个名字的出现次数相同,ans++

100pts:

从左到右扫一遍,记录两个值:

delta1:以now为结尾的前缀中ysy出现的次数-yxy出现的次数

delta2:以now为结尾的前缀中yxy出现的次数-azw出现的次数

显然,若在两个不同的位置l和r,delta1(l)==delta(r)且delta2(l)==delta2(r),

说明从l到r三个名字出现的次数是一样的,ans++

用map维护即可

  1. 1 #include<iostream>
  2. 2 #include<cstring>
  3. 3 #include<cstdio>
  4. 4 #include<map>
  5. 5 using namespace std;
  6. 6 #define N 100000
  7. 7 map<int,int> a[N*2+20];
  8. 8 int n,d1=N,d2=N,ans;
  9. 9 int main()
  10. 10 {
  11. 11 a[N][N]=1; char s[5];
  12. 12 while(scanf("%s",s)!=EOF){
  13. 13 if(s[0]=='y')
  14. 14 if(s[1]=='s')
  15. 15 d1++;
  16. 16 else {
  17. 17 d1--; d2++;
  18. 18 }
  19. 19 else d2--;
  20. 20 ans+=a[d1][d2];
  21. 21 a[d1][d2]++;
  22. 22 }
  23. 23 printf("%d\n",ans);
  24. 24 return 0;
  25. 25 }

T3

AZW (2s,256MB,azw.in,azw.out)

问题描述

ysg,yxy,azw 三人正在刷题。

在他们刷题的 oj 上,除第 0 题外,每道题都有一个父亲(父亲的编号不一定 比他自己小),

所以可以把这些题看成一个树形的结构。

他们在接下来的 m 天中,每天要么做一道新题,要么浏览一些题。

浏览的方法是:

先选两道题 x,y,然后把这两道题之间路径上的题全部浏览一遍。

在浏览的时候,他们有时会发现一道题似曾相识,可又想不起何时做过,

原来是他们做这道题的时间太过久远,以致记忆的模糊。

具体来说,如果一道题做 题时间距离浏览的时间已经超过了他们当天的记忆力,

他们就会出现这样的情况 (具体看样例)。

所以,现在对于每次浏览,他们想知道,这次浏览会看多少道题,以及有多少题似曾相识。

输入格式

第一行一个数 n,代表 oj 上有 n+1 题(从 0 到 n)。

第二行 n 个数,表示第 i 道题的父亲的编号。

第三行一个数 m,代表一共 m 天 接下来 m 行,先是一个数 1 或者 2,如果是 1,后面接三个数 x,y,c,表示当 天的浏览从 x 到 y,当天记忆力为 c,否则后面接一个数 x,表示当天做了第 x 题

输出格式

对于每次浏览,输出一行两个数,表示这次浏览会看多少道题,以及有多少 题似曾相识。

输入样例

  1. 7
  2. 0 1 1 2 2 3 3
  3. 6
  4. 1 4 7 0
  5. 2 1
  6. 2 4
  7. 2 7
  8. 1 4 7 1
  9. 1 4 7 3

输出样例

  1. 5 0
  2. 5 2
  3. 5 1

样例说明

3 次都是浏览 5 道题,分别是 4 号、2 号、1 号、3 号和 7 号。

其中,对于第 1 天,所有题都没有做过;

对于第 5 天,有 2 道题似曾相识,分别是 1 号和 4 号, 7 号虽然做过,但只隔 1 天,刚好等于记忆力,所以还想得起;

对于第 6 天,只有 1 号似曾相识。

数据范围

对于 20%的数据,n <= 100,m<=100。

对于 40%的数据,n <= 2000,m<=2000。

另有 20%的数据,没有做题的操作

另有 20%的数据,虽有做题操作,但每天的记忆力都是 0

对于100%的数据,n <= 200000,m<=200000,保证一道题不会做两遍

题解:

40pts:dfs暴力在树上走,每路过一个点就看他是不是之前做过,是在什么时候做的。
60pts:40+加上求lca,
80pts:60+树链剖分/dfs序,求路径上有多少做过的题
100pts:就是相当于先把每个点是在什么时候被做的预处理出来,然后每次询问一条链上面被做时间小于一个给定数的点有多少个,用树上主席树。

别人的代码:

  1. 1 #include<cstdio>
  2. 2 #include<vector>
  3. 3 #include<algorithm>
  4. 4 #define N 200011
  5. 5 using namespace std;
  6. 6
  7. 7 int n,m,a1[N],a2[N],a3[N],a4[N];
  8. 8 int cc[N],c[20*N][2],z[20*N],t;
  9. 9 vector<int>g[N];
  10. 10 int s[N],f[20][N],d[N];
  11. 11 int lca(int u,int v){
  12. 12 if(d[u]<d[v])swap(u,v);
  13. 13 for(int i=17;~i;i--)
  14. 14 if(1<<i<=d[u]-d[v])
  15. 15 u=f[i][u];
  16. 16 if(u==v)return u;
  17. 17 for(int i=17;~i;i--)
  18. 18 if(f[i][u]^f[i][v])
  19. 19 u=f[i][u],v=f[i][v];
  20. 20 return f[0][u];
  21. 21 }
  22. 22 int cx(int o,int p){
  23. 23 int ans=0;
  24. 24 for(int l=1,r=m;l^r;)
  25. 25 if(p>l+r>>1)ans+=z[c[o][0]],
  26. 26 o=c[o][1],l=(l+r>>1)+1;
  27. 27 else o=c[o][0],r=l+r>>1;
  28. 28 return ans;
  29. 29 }
  30. 30 int main(){
  31. 31 scanf("%d",&n);
  32. 32 t=++n;
  33. 33 for(int i=2;i<=n;i++){
  34. 34 scanf("%d",&f[0][i]);
  35. 35 g[++f[0][i]].push_back(i);
  36. 36 }
  37. 37 scanf("%d",&m);
  38. 38 for(int i=1;i<=n;i++)
  39. 39 cc[i]=m;
  40. 40 for(int i=1;i<=m;i++){
  41. 41 scanf("%d",&a1[i]);
  42. 42 if(a1[i]==1)scanf("%d%d%d",&a2[i],&a3[i],&a4[i]),a2[i]++,a3[i]++;
  43. 43 else scanf("%d",&a2[i]),cc[++a2[i]]=i;
  44. 44 }
  45. 45 d[1]=1;
  46. 46 for(s[s[0]=1]=1;s[0];){
  47. 47 int u=s[s[0]--];
  48. 48 z[u]=z[f[0][u]]+1;
  49. 49 for(int o=u,oo=f[0][u],l=1,r=m;l^r;){
  50. 50 int w=cc[u]>l+r>>1;
  51. 51 if(w)l=(l+r>>1)+1;
  52. 52 else r=l+r>>1;
  53. 53 c[o][w^1]=c[oo][w^1];
  54. 54 o=c[o][w]=++t,oo=c[oo][w];
  55. 55 z[o]=z[oo]+1;
  56. 56 }
  57. 57 for(int i=0;i<g[u].size();i++)
  58. 58 d[g[u][i]]=d[u]+1,s[++s[0]]=g[u][i];
  59. 59 }
  60. 60 for(int k=0;1<<k<n;k++)
  61. 61 for(int i=1;i<=n;i++)
  62. 62 f[k+1][i]=f[k][f[k][i]];
  63. 63 for(int i=1;i<=m;i++)
  64. 64 if(a1[i]==1){
  65. 65 int u=a2[i],v=a3[i],w=lca(u,v),p=i-a4[i];
  66. 66 printf("%d %d\n",d[u]+d[v]-2*d[w]+1,cx(u,p)+cx(v,p)-cx(w,p)-cx(f[0][w],p));
  67. 67 }
  68. 68 }

7.29NOIP模拟赛的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  3. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  4. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  5. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  6. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

  7. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  8. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

  9. BZOJ2741: 【FOTILE模拟赛】L

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1170  Solved: 303[Submit][Status] ...

随机推荐

  1. 案例47-crm练习登录校验拦截器

    1 LoginInterceptor package www.test.web.interceptor; import java.util.Map; import com.opensymphony.x ...

  2. javascript遍历表

    定义表结构 1. 通过id遍历 <html> <body> <table id="tb" border="1"> <t ...

  3. 经典算法详解(1)斐波那契数列的n项

    斐波那契数列是一个常识性的知识,它指的是这样的一个数列,它的第一项是1,第二项是1,后面每一项都是它前面两项的和,如:1,1,2,3,5,8,13,21,34,55,89,144,233…… 说明:由 ...

  4. Java工程路径及相对路径(转载)

    3. 新建文件,默认位于工程目录new File("xxx.txt").getAbsolutePath();例如输出,D:\workspaces\workspace1\myProj ...

  5. 1、块:ion-item

    因为ion-item 一般写于ion-list里 所以在ion-list里面我会仔细讲解. 1. ion-badge /* --- page1.html ---*/ <ion-navbar *n ...

  6. Cocos2d-js 开发记录:图片数据资源等的异步加载

    这里说的是在需要的使用加载图片,比如游戏中的某个关卡的图片,不用在游戏一开始就加载(万一用户玩不到那关,岂不是很冤,流量费了那么多),否则载入速度也慢.这种方式加载资源要用到cc.loader官方文档 ...

  7. Colorbox - a jQuery lightbox

    http://www.jacklmoore.com/colorbox/http://www.jacklmoore.com/colorbox/example5/ <script type=&quo ...

  8. Form表单元素

    Form表单元素 action method input: name value type: text password button radio checkbox file submit reset ...

  9. Linux虚拟系统安装——Ubuntu18.04 & CentOS6.5

    Linux虚拟系统安装--Ubuntu18.04 & CentOS6.5 摘要:Linux简介.虚拟系统安装.系统备份与文件介绍 1. Linux简介 (1)1968年,MIT.Bell实验室 ...

  10. Fragstats:使用R软件读取frag78b.asc文件

    Fragstats中,有一个用于熟悉Fragstats软件的demon,在tutorial中的1种,有reg78b.asc文件,其文件内容是包含了山歌图像的行数和列数以及分辨率大小等基本信息. 采用R ...