Noip模拟 Day6.12
第一题:贪吃蛇(snake)
本题其实就是判断一个有向图中有没有环,做一次拓扑排序就可以了,如果所有点都入队了,就表示没有环,否则就有环。或者就是dfs一次,每个点只需要被访问一次,这样也是O(n)的。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std; #define N 1000010 struct edge
{
int next,to;
}e[N<<1];
int head[N<<1];
int cnt; int n,m,T;
int u,v; int flag;
int vis[N<<1],f[N<<1]; void link(int x,int y)
{
e[++cnt]=(edge){head[x],y};
head[x]=cnt;
} void dfs(int x,int i)
{
if (f[i])
{
flag=1;
return ;
}
if (vis[i])
return ;
f[i]=1;
vis[i]=1;
int t=head[i];
while (t)
{
dfs(x,e[t].to);
if (flag)
break;
t=e[t].next;
}
f[i]=0;
} int main()
{
freopen("snake.in","r",stdin);freopen("snake.out","w",stdout);
scanf("%d",&T);
while (T--)
{
memset(f,0,sizeof(f));
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
flag=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
scanf("%d%d",&u,&v),link(u,v);
for (int i=1;i<=n;i++)
{
if (!vis[i])
dfs(i,i);
if (flag)
break;
}
if (flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
第二题:营养计划(egg)
本题可以使用递推方法解决,应用堆积木的思想。
记f[i,j]为将i个鸡蛋分j天的方案总数
由于方案与顺序无关,那么每次考虑怎么处理给最少鸡蛋的那天,
给最少的那天再加上一个,每一天就都要加上一个;或者最少的那天不再加了,就继续将i个鸡蛋分j-1天即可。
即:f[i,j]=f[i-j,j]+f[i,j-1]
边界:f[i,0]=1
那么ans=f[n,m]
本题需要取模,因为加法是满足a mod mo+b mod mo=(a+b) mod mo的,所以直接加一下模一下就可以了。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; #define MOD 19940714
#define N 2010 int n,m;
int ans; int f[N<<1][N<<1]; int main()
{
freopen("egg.in","r",stdin);freopen("egg.out","w",stdout);
scanf("%d%d",&n,&m);
f[0][0]=1;
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
f[i][j]=(f[i-1][j-1]+f[i][j-i])%MOD;
for (int i=1;i<=m;i++)
ans=(ans+f[i][n])%MOD;
printf("%d\n",ans);
return 0;
}
第三题:购物狂人(shopping)
本题是简单数据结构的应用。
由于每个商店只会被算一次,而且本题中的操作是区间型的,那么可以考虑使用链表或类似并查集的方法来做到对所有操作均摊O(1)的时间复杂度。
类似并查集的方法,记f[i]为i这个商店所在的连续的这一段已被覆盖过的商店的最右边的那个,对于每次操作,将L~R这一段都并入R所在的集合即可。可是答案怎么统计呢?其实可以就用一个布尔数组存每个商店有没被覆盖过,在将指针扫过L~R时,顺便统计一下连续的若干段的平方和加进答案即可。
其实,本题也是可以用线段树做的,方法略微复杂一点
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define N 300010 LL n,m;
LL l,r;
LL ans; LL f[N],b[N]; int find(LL x)
{
return x==f[x] ? f[x] : f[x]=find(f[x]);
} int main()
{
freopen("shopping.in","r",stdin);freopen("shopping.out","w",stdout);
scanf("%lld%lld",&n,&m);
for (int i=1;i<=n+1;i++)
f[i]=i;
for (int i=1;i<=m;i++)
{
scanf("%lld%lld",&l,&r);
LL j=find(l),k=0;
while (j<=r)
{
if (!b[j])
k++,b[j]=1,f[j]=r,j++;
else
ans+=(k*k),k=0,f[j]=r,j++;
j=find(j);
}
ans+=(k*k);
}
printf("%lld",ans);
return 0;
}
第四题:精彩比赛(match)
本题的题目描述相当繁琐,但关键信息在规定2,要求取第一组的连续的几个人和第二组的连续几个人之间的所有比赛,如果记g[i,j]表示第一组的i号选手和第二组的j号选手之间的比赛关注度(没比赛就是0),容易想到本题其实就是求一个矩阵g的最大子矩阵。
至于最大子矩阵的求法,这里介绍一种O(n^3)的算法
记f[i,j,k]为前i行第j~k列的最大子矩阵(第i行必须选),s[i,j]=sigma(g[i,1]~g[i,j])
有f[i,j,k]=max{f[i-1,j,k],0}+s[i,k]-s[i,j-1]
那么ans=max{f[i,j,k]}
至于空间的话,可以使用滚动数组把空间复杂度优化到O(n^2)
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define N 310 int n,m;
int x,y,w; LL ans; LL sum[N];
int g[N][N]; int main()
{
freopen("match.in","r",stdin);freopen("match.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
scanf("%d%d%d",&x,&y,&w),g[x][y]+=w;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
sum[j]=g[i][j];
for (int j=i+1;j<=n;j++)
{
for (int k=1;k<=n;k++)
sum[k]+=g[j][k];
LL res=0;
for (int k=1;k<=n;k++)
{
res+=sum[k];
if (res<0)
res=0;
else
ans=max(ans,res);
}
}
}
printf("%lld\n",ans);
}
Noip模拟 Day6.12的更多相关文章
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】
[题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...
- NOIP模拟赛12
期望得分:100+100+50=250 实际得分:100+100+30=230 A 约数之和(count.pas/c/cpp) TL:1S ML:128MB[Description]我们用 D(x)表 ...
- Noip模拟 Day6.13 By LD T1
一.哲哲回家 出题人的解答: 可以将其转化成最短路模型. 这个地方转车怎么转移有点困难,有两种方法: 1.我们可以再把每一个点拆成M个点,我们用F[i,j]表示从1号点到i这个点并且坐在j路车上的最少 ...
- 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」
164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...
- NOIP模拟测试12
T1 斐波那契 一道找规律题,被我做成了贼难的题. 观察图片可知x=f[i-1]+j.(j为x的父亲)且j<=f[i-1],然后就二分找父亲没了. #include<bits/stdc++ ...
- [NOIP模拟测试12]题解
A. 找规律题.儿子的编号减去 小于它编号的最大的fibonacci数 即可得到它父亲的编号. 然后两个节点都暴力上跳就好了.预处理一下fibonacci数,每次二分查找即可. #include< ...
随机推荐
- HYSBZ - 3750 Pieczęć(模拟)
题目: 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色. 你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要满足以下要求: ...
- Kafka生产者----向kafka写入数据
开发者可以使用kafka内置的客户端API开发kafka应用程序.除了内置的客户端之外,kafka还提供了二进制连接协议,也就是说,我们直接向kafka网络端口发送适当的字节序列,就可以实现从Kafk ...
- linux学习系列博客地址汇总
2018-09-28 16:03:43 CentOS7 yum命令:这是一个用来管理rpm包进行自动化安装的C/S模式的一个程序. CentOS7(无图形界面)支持中文显示的办法:系统安装好之后,有可 ...
- CSU 2018年12月月赛 A 2213: Physics Exam
Description 高中物理老师总认为给学生文本形式的问题比给纯计算形式的问题要求更高.毕竟,学生首先得阅读和理解问题. 因此,他们描述一个问题不像”U=10V,I=5A,P=?”,而是”有一个含 ...
- [LUOGU] P1113 杂物
题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务完成是必要的,因为 ...
- centos6 rpm安装mysql(5.5版本)包括 error : Failed dependencies:libaio的解决办法.
1.先在/opt目录下放了两个rpm包 2.先看系统中是否有其他版本的mysql的rpm包 rpm -qa | grep -i mysql 命令结果如下图: 如果没有此步跳过,否则执行一下命令将其删除 ...
- Maven 的相关配置
第一步: 官方下载路径: http://maven.apache.org/download.cgi maven官方网站:http://www.mvnrepository.com/ 第二步: 请下载这个 ...
- [学习资料] Tiny210(S5PV210) u-boot移植
Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...
- node学习的一些网站
Node.js 包教不包会 篇幅比较少 node express 入门教程 nodejs定时任务 一个nodejs博客 [NodeJS 学习笔记04]新闻发布系统 过年7天乐,学nodejs 也快乐 ...
- STM32F407 串口通信实验 第26节 个人笔记
前言 这篇笔记对应正点原子STM32F407探索者 ,教学视频第26节,网址如下: https://ke.qq.com/webcourse/index.html#cid=279403&term ...