第一题:贪吃蛇(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的更多相关文章

  1. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  4. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  5. NOIP模拟赛12

    期望得分:100+100+50=250 实际得分:100+100+30=230 A 约数之和(count.pas/c/cpp) TL:1S ML:128MB[Description]我们用 D(x)表 ...

  6. Noip模拟 Day6.13 By LD T1

    一.哲哲回家 出题人的解答: 可以将其转化成最短路模型. 这个地方转车怎么转移有点困难,有两种方法: 1.我们可以再把每一个点拆成M个点,我们用F[i,j]表示从1号点到i这个点并且坐在j路车上的最少 ...

  7. 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」

    164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...

  8. NOIP模拟测试12

    T1 斐波那契 一道找规律题,被我做成了贼难的题. 观察图片可知x=f[i-1]+j.(j为x的父亲)且j<=f[i-1],然后就二分找父亲没了. #include<bits/stdc++ ...

  9. [NOIP模拟测试12]题解

    A. 找规律题.儿子的编号减去 小于它编号的最大的fibonacci数 即可得到它父亲的编号. 然后两个节点都暴力上跳就好了.预处理一下fibonacci数,每次二分查找即可. #include< ...

随机推荐

  1. 扫黑除恶Team第四次团队作业

    二.博客撰写要求 文章开头给出团队序号,开发的软件名称,仓库地址. 给出完成本次冲刺需要做的事情(Sprint Backlog)及相应说明. 本次冲刺总结. 三.评分规则 注意:本次作业总分61分.发 ...

  2. Django之Ajax提交

    Ajax 提交数据,页面不刷新 Ajax要引入jQuery Django之Ajax提交 Js实现页面的跳转: location.href = "/url/" $ajax({ url ...

  3. Jbox 弹出窗口 子页面操作完成后关闭 父页面刷新

    父页面js //父页面js <script> var isFreshFlag = '1'; //添加会议活动 function addMeetingAct(){ var attendVip ...

  4. Python操作Redis、Memcache

       今天主要介绍如何通过python来对Redis和memcache进行操作,下面开始今天的内容: 一.Memcached操作 Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web ...

  5. jQuery中四个绑定事件的区别 on,bind,live,delegate

    1.jQ操作DOM元素的绑定事件的四种方式       jQ中提供了四种事件监听方式,bind.live.delegate.on,对应的解除监听的函数分别是unbind,die,undelegate, ...

  6. 将json格式转为url参数格式的方法(xjl456852整理修改)

    测试页面: <html> <head> <script type="text/javascript" src="jquery-1.11.3. ...

  7. mysql ab主从复制出错及解决过程

    一.mysql主从服务器报错描述:Slave_IO_Running=NO,Slave_SQL_Running=YES,Last_Errno=0 mysql slave stop ; mysql sla ...

  8. Codeforces915G. Coprime Arrays

    n<=2e6的数组,m<=2e6个询问,对1<=i<=m的每个i问:只用<=i的数字填进数组,有多少种方案使数组的总gcd=1.强制把每个询问的答案求出来. 比如说现在有 ...

  9. jquery控制Request Payload和Form Data

    Request Payload方式,会发起两次请求 Form Data只发起一次请求 若要把一个ajax请求改为Payload方式,设置contentType即可,发现请求参数不是对象,再把参数转换为 ...

  10. POJ3295 Tautology 解题报告

    直接上分析: 首先 弄清各种大写字母的操作的实质 K 明显 是 and   & A 是 or      | N 是 not   ! C  由表格注意到 当 w<=x 时 值为1 E  当 ...