USACO 2018 January Contest

比赛链接

T1 MooTube

题目链接

题目大意:给定一个图,两个点之间的距离是他们路径上边权的最小值。给定一个起点,求距离大于等于K的点有几个。

思路:考虑并查集。
- 将边权排序,将询问排序离线处理。
- 用两个指针,代表边加了多少和询问处理到第几个。
- 对于每一个询问,将所有边权小于等于它的边,全都加进去,也就是将两个端点所在并查集合并。

1A

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<map>
#include<vector>
#include<ctime>
#include<stack>
#include<cctype>
#include<set>
#define mp make_pair
#define pa pair<int,int>
#define INF 0x3f3f3f3f
#define inf 0x3f
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ull unsigned long longusing namespace std;inline ll read()
{long long f=1,sum=0;char c=getchar();while (!isdigit(c)){if (c=='-') f=-1;c=getchar();}while (isdigit(c)){sum=sum*10+c-'0';c=getchar();}return sum*f;
}
const int MAXN=100010;
struct node{int id,val,pos,ans;
};
node q[MAXN];
struct edge{int u,v,w;
}e[MAXN];
int fa[MAXN],sz[MAXN];
int find(int x)
{if (fa[x]!=x) fa[x]=find(fa[x]);return fa[x];
}
int main()
{freopen("mootube.in","r",stdin);freopen("mootube.out","w",stdout);int n,qnum;scanf("%d%d",&n,&qnum);for (int i=1;i<n;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);sort(e+1,e+n,[](edge a,edge b){return a.w>b.w;});for (int i=1;i<=qnum;i++)scanf("%d%d",&q[i].val,&q[i].pos),q[i].id=i;sort(q+1,q+1+qnum,[](node a,node b){return a.val>b.val;});for (int i=1;i<=n;i++)fa[i]=i,sz[i]=1;int j=1;for (int i=1;i<=qnum;i++){while (j<n && e[j].w>=q[i].val){int u=e[j].u,v=e[j].v;int f1=find(u),f2=find(v);if (f1!=f2){fa[f1]=f2;sz[f2]+=sz[f1];}j++;}q[i].ans=sz[find(q[i].pos)]-1;}sort(q+1,q+1+qnum,[](node a,node b){return a.id<b.id;});for (int i=1;i<=qnum;i++)printf("%d\n",q[i].ans);return 0;
}

T2 Cow at Large

题目链接

题目大意:给定一棵树,你要从其中一个点逃跑,跑到任意一个叶子节点,现在有一帮人要抓你,它的移动速度和你是一样的,他们可以分布在所有叶子节点上,问最少需要几个人才能保证抓住你(人不能安排在你的初始位置)。

思路:树形DP。对于每个非叶子节点,发现需要派一个人的条件是离它最近的叶子节点比它离你出现的位置要远,这样叶子节点的人就可以在你过来之前封死你的路。树形DP递归做即可。

1A

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<map>
#include<vector>
#include<ctime>
#include<stack>
#include<cctype>
#include<set>
#define mp make_pair
#define pa pair<int,int>
#define INF 0x3f3f3f3f
#define inf 0x3f
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ull unsigned long longusing namespace std;inline ll read()
{long long f=1,sum=0;char c=getchar();while (!isdigit(c)){if (c=='-') f=-1;c=getchar();}while (isdigit(c)){sum=sum*10+c-'0';c=getchar();}return sum*f;
}
const int MAXN=100010;
struct edge{int next,to;
};
edge e[MAXN*2];
int head[MAXN],cnt;
void addedge(int u,int v)
{e[++cnt].next=head[u];e[cnt].to=v;head[u]=cnt;
}
bool visit[MAXN];
int f[MAXN],deep[MAXN],minn[MAXN],sz[MAXN];
void dfs(int x,int fa)
{int tmp=0;sz[x]=1;for (int i=head[x];i;i=e[i].next){int v=e[i].to;if (v==fa) continue;deep[v]=deep[x]+1;dfs(v,x);sz[x]+=sz[v];tmp+=f[v];}if (sz[x]==1)minn[x]=0;minn[fa]=min(minn[fa],minn[x]+1);if (deep[x]>=minn[x]) f[x]=1;else f[x]=tmp;
}
int main()
{freopen("atlarge.in","r",stdin);freopen("atlarge.out","w",stdout);int n,k;scanf("%d%d",&n,&k);for (int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v),addedge(v,u);}int ans=0;memset(minn,inf,sizeof(minn));for (int i=head[k];i;i=e[i].next){int v=e[i].to;deep[v]=1;dfs(v,k);ans+=f[v];}cout<<ans;return 0;
}

T3 Stamp Painting

题目链接

题目大意:你有一个长为NNN的画布和M" role="presentation" style="position: relative;">MMM种颜色,还有个宽为KKK的刷子,你每次可以选择一个起点,刷上一种颜色,要求画布必须涂满,问最后有多少种颜色序列。

思路:考虑什么时候序列是可行的。
- 因为只能一刷子一刷子的涂,所以最后肯定有知道一个长度为K" role="presentation" style="position: relative;">KKK的颜色相同给的区间。
- 所以我们可以用总的情况数减去不合法的情况数即相同颜色区间长度不到KKK方案数。
- 那不到的方案数怎么求呢?
- DP。

f[i]={f[i−1]×m ,i≤K(f[i−1]+f[i−2]+f[i−3]+...+f[i−k+1])×(m−1)" role="presentation" style="text-align: center; position: relative;">f[i]=⎧⎩⎨f[i−1]×m ,i≤K(f[i−1]+f[i−2]+f[i−3]+...+f[i−k+1])×(m−1)f[i]={f[i−1]×m ,i≤K(f[i−1]+f[i−2]+f[i−3]+...+f[i−k+1])×(m−1)

f[i]= \begin{cases}f[i-1]\times m\ ,i\le K \\\\(f[i-1]+f[i-2]+f[i-3]+...+f[i-k+1])\times (m-1) \end{cases}
- 用总方案数mnmnm^n减去f[n]f[n]f[n]即可。

1A

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<map>
#include<vector>
#include<ctime>
#include<stack>
#include<cctype>
#include<set>
#define mp make_pair
#define pa pair<int,int>
#define INF 0x3f3f3f3f
#define inf 0x3f
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ull unsigned long longusing namespace std;inline ll read()
{long long f=1,sum=0;char c=getchar();while (!isdigit(c)){if (c=='-') f=-1;c=getchar();}while (isdigit(c)){sum=sum*10+c-'0';c=getchar();}return sum*f;
}
const int MAXN=1000010;
#define Mod 1000000007
ll quick_pow(int a,int b)
{int ans=1;while (b){if (b&1) ans=(ll)ans*a%Mod;b/=2;a=(ll)a*a%Mod;}return ans;
}
int f[MAXN];
int main()
{freopen("spainting.in","r",stdin);freopen("spainting.out","w",stdout);int n,m,k;scanf("%d%d%d",&n,&m,&k);int ans=quick_pow(m,n);f[0]=1;int sum=0;for (int i=1;i<k;i++)f[i]=(ll)f[i-1]*m%Mod,sum=((ll)sum+f[i])%Mod;for (int i=k;i<=n;i++)f[i]=(ll)sum*(m-1)%Mod,sum=((ll)sum-f[i-k+1]+f[i]+Mod)%Mod;ans=((ll)ans+Mod-f[n])%Mod;cout<<ans;return 0;
}

USACO 2018 January Contest相关推荐

  1. USACO 2018 January Contest Platinum A: Lifeguards 题解

    将所有的区间按左端点从小到大排序 我们处理那些被完全包含的区间,这些区间即使删除也不会使答案变坏 这样先删一波,如果发现这种小区间的个数多于k,就可以直接算答案了 否则我们要dp 设dp[i][j]为 ...

  2. USACO 2018 FEBURARY CONTEST :SILVER T1

    USACO 2018 February Contest, Silver Problem 1. Rest Stops Farmer John and his personal trainer Bessi ...

  3. Promotion Counting【USACO 2016 January Contest, Bronze】

    今天来分享一下我做过的几道Usaco的比较简单的题,Usaco是美国的一个c++竞赛比赛,但是全球各地的人都可以参加,Usaco没有监考,全凭诚信,但是你拿着这个 作弊 借鉴来的成绩,所有美国的大学都 ...

  4. USACO 2021 January Contest, BronzeProblem 3. Just Stalling题解

    题目描述 Farmer John 有 N 头奶牛(1≤N≤20),高度为 a1-aN.他的牛栏有 N 个牛棚,高度限制分别为b1-bN(例如,如果 b5=17,那么一头高度不超过 17 的奶牛可以住在 ...

  5. USACO 2012 January Contest, Silver Division Solution

    T1是一道构图然后跑最短路的题. T2是一道裸的dp 然而我看了以后觉得爆搜是一定可以过掉的== 于是我先来一发二进制枚举,然后two points 维护答案.. T3是一道神题 首先要分类讨论,然后 ...

  6. USACO 2021 January Contest, Bronze. Problem 1. Uddered but not Herd

    题目描述 一个鲜为人知的事实是,奶牛拥有自己的文字:「牛文」.牛文由 26 个字母 'a' 到 'z' 组成,但是当奶牛说牛文时,可能与我们所熟悉的 'abcdefghijklmnopqrstuvwx ...

  7. USACO 2018 February Contest, Silver-Rest Stops

    G: Rest Stops 时间限制: 1 Sec  内存限制: 128 MB 提交: 97  解决: 38 [提交][状态][讨论版][命题人:admin] 题目描述 Farmer John and ...

  8. usaco#2018#January#Silver

    T1-Lifeguards FJ为他的奶牛们建造了一个游泳池,FJ认为这将有助于他们放松身心以及生产更多牛奶. 为了确保奶牛们的安全,FJ雇佣了N头牛,作为泳池的救生员,每一个救生员在一天内都会有一定 ...

  9. USACO 2015 January Contest Bronze——奶牛的旅行路线

    文章目录 题目描述 输入格式 输出格式 数据范围 输入样例 输出样例 实现代码--奶牛只想走一条路线的情况下 题目描述 厌倦了农场寒冷的冬季天气,奶牛贝茜计划飞往一个温暖的目的地度假. 不幸的是,她发 ...

最新文章

  1. 计算机和路由器连接后IP地址受限制或无连接情况的处理
  2. Linux视频切片m3u8,使用ffmpeg+nginx使用视频切片播放
  3. 11.10/11.11/11.12 安装PHP5 11.13 安装PHP7
  4. python编程狮app题库_‎Python编程狮-零基础学Python im App Store
  5. 安全多方计算(MPC)从入门到精通:简易教程
  6. P1217 [USACO1.5]回文质数 Prime Palindromes(技巧+暴力枚举+线性筛)
  7. 花书+吴恩达深度学习(二六)近似推断(EM, 变分推断)
  8. 苹果Mac知识大纲管理神器:OmniOutLiner
  9. [讨论] AUTOCAD二次开发简介
  10. android dialog 隐藏键盘,android dialog 隐藏虚拟按键
  11. C语言课程设计日历题目
  12. 2023情人节送另一半什么好?四款适合送女友的数码好物分享
  13. ylbtech-公司-滴滴出行:滴滴出行
  14. Ubuntu14.04+Texlive2014+LYX-Linux下LYX的中文配置方案
  15. 嵌入式系统设计--课堂总结(概述)
  16. win7 安装超级终端
  17. DP4301— 国产 SUB-1G 高集成度无线收发芯片
  18. Ubuntu18.04无法显示屏扩展、亮度无法调节,只能设置最大亮度,wifi无法联网解决办法
  19. 连接mysql报错WARN: Establishing SSL connection without server‘s identity verification is not recommended
  20. JAVA计算机毕业设计心灵治愈服务平台Mybatis+源码+数据库+lw文档+系统+调试部署

热门文章

  1. 【WPS表格】数据透视表刷新后,保持格式不变
  2. 求可以进行图片抽签的小程序
  3. WinUSB安装以及与Linux通讯
  4. manjaro pacman,yaourt命令
  5. BitTorrent协议DHT网络爬虫BitTorrentNetworkSpider
  6. 学习,只有勤奋是不够的……
  7. iMeta | 德加合作揭示葛藤菌根真菌的遗传多样性和群落组成
  8. 文章还需自己写,论文抄袭误国家
  9. 修改系统默认的音频设备
  10. 网页怎么退出全屏,网页退出全屏有哪些快捷键?