NOIP2016提高组模拟赛

——By wangyurzee7

中文题目名称

迷妹

膜拜

换数游戏

英文题目与子目录名

fans

mod

game

可执行文件名

fans

mod

game

输入文件名

fans.in

mod.in

game.in

输出文件名

fans.out

mod.out

game.out

每个测试点时限

1秒

1秒

1秒

测试点数目

20

16

16

每个测试点分值

10

6.25

6.25

题目类型

传统

传统

传统

运行内存上限

128M

128M

256M

注意:评测时不打开任何优化开关

迷妹

(fans.cpp/c/pas)

【问题描述】

小钟、小皓和小曦都是著名偶像派OI选手,他们都有很多迷妹。

现在,有n个妹子排成了一行,从左到右编号为1到n。这些妹子中,任意一个都是其中一个人的迷妹。

现在,蒟蒻wyz有Q个问题,第i个问题为:编号在l[i]到r[i]范围内的妹子中,分别有几个小钟的迷妹、小皓的迷妹、和小曦的迷妹。

【输入格式】

输入到fans.in

第一行2个正整数n,Q。

第2行到第n+1行每行一个正整数a[i],描述了第i个妹子是谁的迷妹。a[i]=1表示小钟的迷妹,a[i]=2表示小皓的迷妹,a[i]=3表示小曦的迷妹。

第n+2行到第n+Q+1行,每行2个整数,表示第i个问题。

【输出格式】

输出到fans.out

共Q行,每行3个用空格分开的整数,分别表示对于第i个问题,有多少小钟、小皓、小曦的迷妹。

【输入输出样例】

fans.in

fans.out

6 3

2

1

1

3

2

1

1 6

3 3

2 4

3 2 1

1 0 0

2 0 1

【数据范围】

对于10%的数据,保证1<=n<=10,Q<=10,

对于25%的数据,保证1<=n<=100,Q<=100,

对于45%的数据,保证1<=n<=1000,Q<=1000,

对于100%的数据,保证1<=n<=100,000,Q<=100,000。

保证1<=a[i]<=3,1<=l[i]<=r[i]<=n。

  1. //前缀和
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5.  
  6. #define maxn 1000002
  7.  
  8. using namespace std;
  9. int n,q,cnt;
  10. int a1[maxn],a2[maxn],a3[maxn],a[maxn];
  11. int s1[maxn],s2[maxn],s3[maxn];
  12.  
  13. inline int init()
  14. {
  15. int x=,f=;char c=getchar();
  16. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  17. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  18. return x*f;
  19. }
  20. int main()
  21. {
  22. freopen("fans.in","r",stdin);
  23. freopen("fans.out","w",stdout);
  24. n=init();q=init();
  25. for(int i=;i<=n;i++)
  26. {
  27. a[i]=init();
  28. if(a[i]==) a1[i]=;
  29. if(a[i]==) a2[i]=;
  30. if(a[i]==) a3[i]=;
  31. s1[i]=s1[i-]+a1[i];
  32. s2[i]=s2[i-]+a2[i];
  33. s3[i]=s3[i-]+a3[i];
  34. }
  35.  
  36. int l,r;
  37. for(int i=;i<=q;i++)
  38. {
  39. l=init();r=init();
  40. printf("%d %d %d ",s1[r]-s1[l-],s2[r]-s2[l-],s3[r]-s3[l-]);
  41. printf("\n");
  42. }
  43. fclose(stdin);
  44. fclose(stdout);
  45. return ;
  46. }

膜拜

(mod.cpp/c/pas)

【问题描述】

有一个n个点m条边的有向图,wyz可以从1号点出发在图上走,并且最终需要回到1号点。每个点都有一个神犇(包括1号点),每次经过一个没到过的点,wyz都会膜拜那位神犇。wyz希望膜拜尽可能多的神犇。

由于wyz膜拜神犇的欲望非常强烈,所以他可以有一次机会逆着一条有向边的方向走。(需要注意的是,这条边的方向不会改变)

你现在想知道,wyz最多能膜拜多少神犇?

【输入格式】

输入到mod.in

第一行2个整数n、m,分别表示图的点数和边数。

第2行到底m+1行,每行两个整数u,v,描述一条u到v的有向边。

【输出格式】

输出到mod.out

一行一个整数表示wyz最多能膜拜多少神犇。

【输入输出样例】

mod.in

mod.out

7 10

1 2

3 1

2 5

2 4

3 7

3 5

3 6

6 5

7 2

4 7

6

【数据范围】

对于25%的数据,保证n<=100,m<=250,

对于43.75%的数据,保证n<=3,000,m<=7,000。

对于100%的数据,保证n,m<=100,000。

  1. /*
  2. 可以先进行缩点 ,缩点后的点权为点所代表的原强连通分量中点的个数,这样我们就把它变成了更好处理的DAG。处理后的所有点总共能分成三类:
  3. 1.能到达点1的
  4. 2.从点1出发能到达的
  5. 3.和点1没有任何关系的
  6. 很显然可以删除第三类点,因为就算怎么翻转路径,第三类的点都和答案没有任何关系。而最终要反转的边在一开始一定是一条从第二类点到第一类点的边,我们把这样的边全部反转,把能达到点1的路径统统改成到达点n+1,这样问题就简化成了在DAG中找一条从点1到点n+1的点权和最大的路径,可以用拓扑+dp解决了;
  7. */
  8. #include<cstdio>
  9. #include<iostream>
  10. #include<cstring>
  11. #include<stack>
  12.  
  13. #define maxn 200000
  14.  
  15. using namespace std;
  16. struct point {
  17. int to,next;
  18. } edge[maxn],edge1[maxn][];
  19. int cnt,n,m,ans,t,tot;
  20. int head[maxn],head1[maxn][],d[maxn][];
  21. int dfn[maxn],low[maxn],v[maxn],q[maxn];
  22. int belong[maxn],f[maxn][],size[maxn];
  23. stack<int>s;
  24.  
  25. void add(int u,int v) {
  26. edge[++cnt].to=v;
  27. edge[cnt].next=head[u];
  28. head[u]=cnt;
  29. }
  30.  
  31. void add1(int u,int v,int ch){
  32. if (ch==) cnt++;
  33. d[v][ch]++;
  34. edge1[cnt][ch].to=v;
  35. edge1[cnt][ch].next=head1[u][ch];
  36. head1[u][ch]=cnt;
  37. }
  38.  
  39. void tarjan(int u) {
  40. dfn[u]=low[u]=++t;
  41. s.push(u);
  42. for(int i=head[u]; i; i=edge[i].next)
  43. if(dfn[edge[i].to]==)
  44. {
  45. tarjan(edge[i].to);
  46. low[u]=min(low[u],low[edge[i].to]);
  47. }
  48. else if (!v[edge[i].to])
  49. low[u]=min(low[u],dfn[edge[i].to]);
  50. if (dfn[u]==low[u]) {
  51. tot++;
  52. int now=;
  53. while (now!=u)
  54. {
  55. now=s.top();
  56. s.pop();
  57. v[now]=true;
  58. belong[now]=tot;
  59. size[tot]++;
  60. }
  61. }
  62. }
  63.  
  64. void find(int ch) {
  65. f[belong[]][ch]=size[belong[]];
  66. int ta=;
  67. for (int i=; i<=tot; i++)
  68. if (d[i][ch]==) q[++ta]=i;
  69. while(ta>) {
  70. int p=q[ta--];
  71. for(int i=head1[p][ch];i;i=edge1[i][ch].next) {
  72. f[edge1[i][ch].to][ch]=max(f[edge1[i][ch].to][ch],f[p][ch]+size[edge1[i][ch].to]);
  73. if(--d[edge1[i][ch].to][ch]==) q[++ta]=edge1[i][ch].to;
  74. }
  75. }
  76. }
  77.  
  78. int main()
  79. {
  80. freopen("mod.in","r",stdin);
  81. freopen("mod.out","w",stdout);
  82. int x,y;
  83. scanf("%d%d",&n,&m);
  84. for (int i=; i<=m; i++) {
  85. scanf("%d%d",&x,&y);
  86. add(x,y);
  87. }
  88. t=;
  89. for(int i=;i<=n; i++) if (!v[i]) tarjan(i);
  90. cnt=;
  91. for(int i=;i<=n;i++)
  92. for(int j=head[i]; j; j=edge[j].next)
  93. if(belong[i]!=belong[edge[j].to]) {
  94. add1(belong[i],belong[edge[j].to],);
  95. add1(belong[edge[j].to],belong[i],);
  96. }
  97. memset(f,0xef,sizeof f);
  98. find();
  99. find();
  100. ans=size[belong[]];
  101. for(int i=; i<=n; i++)
  102. for(int j=head[i]; j; j=edge[j].next)
  103. if(belong[i]!=belong[edge[j].to])
  104. ans=max(ans,f[belong[edge[j].to]][]+f[belong[i]][]-size[belong[]]);
  105. printf("%d\n",ans);
  106. fclose(stdin);
  107. fclose(stdout);
  108. return ;
  109. }

换数游戏

(game.cpp/c/pas)

【问题描述】

咸鱼wyz最近沉迷于一款游戏,叫做换数游戏。

游戏开始时,有n个1到40之间的整数排成一排。wyz每次可以将两个相邻的相等的正整数替换成一个比原数大一的正整数(需要注意的是,合并后的数可以大于40)。

wyz可以在任意时刻结束游戏。结束时wyz的得分为所有剩余的数中最大的数。

现在给定一个初始局面,你想知道wyz能获得的最高得分。

【输入格式】

输入到game.in

第一行一个正整数n。

第2行到第n+1行每行一个正整数,描述第i个数a[i]。

【输出格式】

输出到game.out

一行一个整数表示wyz能够获得的最高得分。

【输入输出样例】

game.in

game.out

4

1

1

1

2

3

【数据范围】

对于6.25%的数据,保证n<=5。

对于12.5%的数据,保证n<=20。

对于43.75%的数据,保证n<=1024。

对于100%的数据,保证n<=262144。

数据保证1<=a[i]<=40。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define maxn 666666
  5.  
  6. using namespace std;
  7. int n,num,cnt,now,NOW;
  8. int a[maxn],v[maxn];
  9.  
  10. void find(int x)
  11. {
  12. for(int i=;i<=n;i++)
  13. {
  14. now=;NOW=;cnt=;
  15. if(a[i]==x&&a[i+]==x)
  16. {
  17. now=i,NOW=i;
  18. while(a[now]==x)
  19. now++;now--;
  20. int d=now-NOW+;
  21. if((d%&&a[NOW-]<a[now+]&&NOW!=)||(d%&&now==n)) now-=;
  22. else if((d%&&a[NOW-]>a[now+]&&now!=n)||(d%&&NOW==&&now!=n))NOW+=;
  23. d/=;
  24. for(int j=NOW+;j<=n;j++) a[j]=a[j+d];n-=d;
  25. while(cnt<d)
  26. {
  27. a[NOW+cnt]+=;
  28. v[a[NOW+cnt]]=;
  29. cnt++;
  30. }
  31. i+=d;
  32. }
  33. else continue;
  34. }
  35. }
  36.  
  37. int main()
  38. {
  39. // freopen("ai.in","r",stdin);
  40. // freopen("game.out","w",stdout);
  41. scanf("%d",&n);
  42. for(int i=;i<=n;i++)
  43. scanf("%d",&a[i]);
  44. for(int i=;i<=n;i++)
  45. v[a[i]]=;
  46. for(int i=;i<=;i++) if(v[i]) find(i);
  47. int ans=;
  48. for(int i=;i<=n;i++)
  49. {
  50. // if(a[i]==a[i+1]) a[i]+=2;
  51. ans=max(ans,a[i]);
  52. }
  53. printf("%d\n",ans);
  54. // fclose(stdin);
  55. // fclose(stdout);
  56. return ;
  57. }

正解:

  1. /*
  2. : nxt[i]表示从第i个数开始能够凑出k来的下一个位置
  3. 每一步都依赖于前一步的状态 nxt[nxt[i]]=i+1 意思是如果以当前i能凑出k-1来,并且以下一位开头也能凑出k-1来,就把他的下一位置调到第二个能凑出k-1之后,然后更新答案=k。
  4. */
  5.  
  6. #include <bits/stdc++.h>
  7. #define N 300005
  8.  
  9. using namespace std;
  10. inline int read(){
  11. int ret=;char ch=getchar();
  12. while (ch<''||ch>'') ch=getchar();
  13. while (''<=ch&&ch<=''){
  14. ret=ret*-+ch;
  15. ch=getchar();
  16. }
  17. return ret;
  18. }
  19.  
  20. int a[N],n;
  21. int nxt[N];
  22.  
  23. int main(){
  24. // freopen("game.in","r",stdin);
  25. // freopen("game.out","w",stdout);
  26. n=read();
  27. for (int i=;i<=n;++i) a[i]=read();
  28. memset(nxt,,sizeof(nxt));
  29. int ans=;
  30. for (int k=;k<=;++k)
  31. for (int i=;i<=n;++i)
  32. if (a[i]==k) nxt[i]=i+,ans=k;
  33. else if (nxt[i]&&nxt[nxt[i]]) nxt[i]=nxt[nxt[i]],ans=k;
  34. else nxt[i]=;
  35. printf("%d\n",ans);
  36. return ;
  37. }

4.28 QBXT模拟赛的更多相关文章

  1. QBXT模拟赛2

    总结 期望得分:\(100 + 40 + 0 = 140\) 实际得分:\(0 + 0 + 0 = 0\) 鬼知道为什么我代码没有交上..自测\(10 + 50 + 0\)--这是心态爆炸的一场考试 ...

  2. QBXT模拟赛1

    总结 期望得分:\(100 + 80 + 10 = 190\) 实际得分:\(90 + 80 + 10 = 180\) 这是在清北的第一场考试,也是在清北考的最高的一次了吧..本来以为能拿\(190\ ...

  3. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  4. 2017.10.3 QBXT 模拟赛

    题目链接 T1 模拟 #include <cstring> #include <cstdio> #define N 105000 int L,R; char s[N]; int ...

  5. EZ 2018 02 28 NOIP2018 模拟赛(二)

    我TM的终于改完了(其实都是SB题) 题目链接:http://211.140.156.254:2333/contest/53 T1送分,T2前40%送分,还有骗分机制在里面,T3暴力50 所以200应 ...

  6. 2017.10.28 QB模拟赛 —— 下午

    题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...

  7. 2017.10.28 QB模拟赛 —— 上午

    题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set  死慢.. #include <cstdio> int t; long long p; int ma ...

  8. 2017.10.7 QBXT 模拟赛

    题目链接 T1 容斥原理,根据奇偶性进行加减 #include<iostream> #include<cstdio> using namespace std; typedef ...

  9. 2017.10.6 QBXT 模拟赛

    题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...

随机推荐

  1. Fleecing the Raffle(NCPC 2016 暴力求解)

    题目: A tremendously exciting raffle is being held, with some tremendously exciting prizes being given ...

  2. 这几道Java集合框架面试题在面试中几乎必问

    Arraylist 与 LinkedList 异同 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 2. 底层数据结构: Arraylis ...

  3. Python面向对象一些阶段性总结

    什么时候用面向对象??? 1.共同的方法,提出来.共同的方法可以产生一个连接,其他方法可以使用,例如传文件,和执行命令都需要建立连接,关闭连接 例如 获取连接,...操作..关闭连接 2.创建模板.造 ...

  4. Linux学习笔记(五) 账号管理

    1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...

  5. Xshell(smarTTY)连接Linux虚拟机失败(未开放22端口)解决办法

    1.关闭防火墙: 命令:sudo ufw disable 2.安装openssh-server以及openssh-client: 命令:sudo apt-get install openssh-ser ...

  6. python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!

    是时候给你说说 爬虫框架了 使用框架来爬取数据 会节省我们更多时间 很快就能抓取到我们想要抓取的内容 框架集合了许多操作 比如请求,数据解析,存储等等 都可以由框架完成 有些小伙伴就要问了 你他妈的 ...

  7. cmake 学习笔记(一) buildsystem

    参见网址: http://www.cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html Introduction 基于CMake的构建 ...

  8. noip模拟赛 圆桌游戏

    [问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...

  9. 【页面传值6种方式】- 【JSP 页面传值方法总结:4种】 - 【跨页面传值的几种简单方式3种】

    阅读目录 1. URL 链接后追加参数 2. Form 3. 设置 Cookie 4. 设置 Session JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总 ...

  10. I - 最少拦截系统

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ],su ...