USACO2018JAN Gold
A.mootube(离线+并查集)
给定一棵n个点的树(n=1e5),有边权,两点间距离定义为两点路径上的边权最小值。m个询问(m=1e5),k,v,询问对于点v,距离>=k的点有多少个(不含v)离线+并查集,按k从大到小做,此时与v连通的所有点均为答案。
我已经菜到想不出这种题了qaq
B.lifeguards(树+贪心)
给定一棵有根树,wrx一开始在根,每个叶子节点都是出口,你可以在每个出口放一个守卫,每一单位时间内,wrx和守卫都可以移动到相邻的一个点,如果某一时刻守卫与wrx相遇了(在边上或点上均算),则wrx将被抓住。问你为了保证抓住wrx,最少需要几个守卫。显然最多叶子结点个数个,每个守卫每次都往他的父亲走是最优的。对于每个点i我们预处理出mn[i],表示i的子树中距i最近的叶子节点距i的距离。显然如果mn[i]<=dep[i],则i的子树均可以用这一个守卫守住,否则要去下面用更多的守卫。算一下答案即可。
C.spainting(计数dp)
一共有n个格子,m种颜色,你每次可以把连续K个格子涂成一种颜色。问你最后有多少种涂色结果。(不能留有空白格子)
我们考虑怎样的结果序列是合法的,显然必须有一段长度为k的连续区间为同一颜色,因为你最后一下肯定要刷k个相同。我们可以发现,只要满足有这么一段就都是合法方案。因此我们就是要统计至少有一段k个相同的数的序列个数。我们发现求它的补集更好求,即没有一段k个相同的数的序列个数。
那么答案就是总方案数m^n-补集方案数。(我就是这点没想到,gg了!)
那么这个就比较好求了,我们可以dp。
dp[i],表示i个格子的方案数,则i< k时,显然有dp[i]=midp[i]=m^i,
i>=k时,我们可以通过枚举最后一段相同颜色的长度j(显然是1~k-1的)来转移即可,有
dp[i]=∑j=1k−1dp[i−j]∗(m−1)。dp[i]=\sum\limits_{j=1}^{k-1}dp[i-j]*(m-1)。
然后后缀和优化一下就是O(n)的了。
A
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100010
#define ll long long
#define inf 0x3f3f3f3f
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,m,fa[N],ans[N],sz[N];
struct Edge{int x,y,val;
}e[N];
struct qu{int x,val,id;
}q[N];
inline bool cmp(Edge a,Edge b){return a.val>b.val;}
inline bool cmp1(qu a,qu b){return a.val>b.val;}
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline void merge(int x,int y){int xx=find(x),yy=find(y);fa[xx]=yy;sz[yy]+=sz[xx];
}
int main(){freopen("mootube.in","r",stdin);freopen("mootube.out","w",stdout);n=read();m=read();for(int i=1;i<n;++i) e[i].x=read(),e[i].y=read(),e[i].val=read();sort(e+1,e+n,cmp);for(int i=1;i<=n;++i) fa[i]=i,sz[i]=1;for(int i=1;i<=m;++i) q[i].val=read(),q[i].x=read(),q[i].id=i;sort(q+1,q+m+1,cmp1);int num=1;for(int i=1;i<=m;++i){while(num<n&&e[num].val>=q[i].val) merge(e[num].x,e[num].y),++num;ans[q[i].id]=sz[find(q[i].x)]-1;}for(int i=1;i<=m;++i) printf("%d\n",ans[i]);return 0;
}
B
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,rt,h[N],num=0,fa[N],dep[N],mn[N],ans=0;
struct edge{int to,next;
}data[N<<1];
inline void dfs(int x){int son=0;for(int i=h[x];i;i=data[i].next){int y=data[i].to;if(y==fa[x]) continue;son++;fa[y]=x;dep[y]=dep[x]+1;dfs(y);mn[x]=min(mn[x],mn[y]+1);}if(!son) mn[x]=0;
}
inline void calc(int x){if(mn[x]<=dep[x]){ans++;return;}for(int i=h[x];i;i=data[i].next){int y=data[i].to;if(y==fa[x]) continue;calc(y);}
}
int main(){freopen("atlarge.in","r",stdin);freopen("atlarge.out","w",stdout);n=read();rt=read();memset(mn,inf,sizeof(mn));for(int i=1;i<n;++i){int x=read(),y=read();data[++num].to=y;data[num].next=h[x];h[x]=num;data[++num].to=x;data[num].next=h[y];h[y]=num;}dfs(rt);calc(rt);printf("%d\n",ans);return 0;
}
C
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1000010
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,m,k,dp[N],sum=0;
inline int ksm(int x,int k){int res=1;for(;k;k>>=1,x=(ll)x*x%mod)if(k&1) res=(ll)res*x%mod;return res;
}
int main(){freopen("spainting.in","r",stdin);freopen("spainting.out","w",stdout);n=read();m=read();k=read();dp[0]=1;for(int i=1;i<k;++i) dp[i]=(ll)dp[i-1]*m%mod,sum=(sum+dp[i])%mod;for(int i=k;i<=n;++i){dp[i]=(ll)sum*(m-1)%mod;sum+=dp[i]-dp[i-k+1];if(sum<0) sum+=mod;sum%=mod;}int ans=ksm(m,n)-dp[n];if(ans<0) ans+=mod;printf("%d\n",ans);return 0;
}
USACO2018JAN Gold相关推荐
- Gold Code,Gold Sequence
Gold Code Gold Code是以Robert Gold的名字命名的.它是一组特殊的二进制随机(伪随机)序列,其中成员序列之间的相关性很小.由于这种特性(较小的相关性),它被广泛地用作各种无线 ...
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希)
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希) 洛谷上这道水题丧心病狂地把数据范围加到了500000 普通的做法肯定A不了了, ...
- 酷冷至尊官方psu计算工具_静静的挺你10年:酷冷至尊V650 GOLD全模组电源体验
装机糟坑多,菜鸟需谨慎.为了节省整机成本,把电源功率卡到满载线,或者只迷信标称功率值,忽视电源转换效率和做工用料,是装机初学者常犯的错误,笔点君就曾遭遇过劣质电源BOOM掉的悲惨经历.要知道,电源是一 ...
- 带你全面了解比特黄金(bitcoin gold)分叉
比特币基于的区块链技术,每一笔交易都被存储在区块中,而区块的大小在初始时候固定在1M大小,而每笔交易的大小则为4k,比特币区块链每十分钟产生一个新块,那么这就以为着每秒只能处理3条交易记录,这在比特币 ...
- WUTOJ 1284: Gold Medal(Java)
1284: Gold Medal 题目 有N个砝码,重量为:3i-1(1<=i<=N),有一块重量为 W 的金牌.现在将金牌放在天平的左边.你需要将砝码放在左边或右边使得天平平衡,如果 ...
- CodeForces - 1535E Gold Transfer(树上倍增+交互)
题目链接:点击查看 题目大意:给出一棵初始时只有一个点的树,每个点都有两个值:ai,cia_i,c_iai,ci,分别代表黄金的个数和单价.需要执行 mmm 次操作,每次操作分为两种类型: 1pi ...
- 0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维
题目四:0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人.每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不 ...
- 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 510 ...
- xbox可以录视频声音吗_什么是Xbox Live Gold,它值得吗?
xbox可以录视频声音吗 If you have an Xbox One or Xbox 360, Microsoft's Xbox Live Gold service is required to ...
最新文章
- 博弈最高位POJ 1704(Georgia and Bob-Nim博弈)
- 10件5G能实现但4G不能做的事情
- Cocos Creator中按钮组件数组的使用
- SqlServer之OutPut
- input输入框自动去除空格
- 分享15款堪称神器却鲜为人知的软件和网站
- 从零开始 DIY 智能家居 - 基于 ESP32 的智能语音合成播报模块
- 电容触摸按键实验(STM32F407)
- spyder配置python_快速了解Python开发环境Spyder
- 世界品牌新500强揭晓 中国移动央视海尔入前百名
- python切片原理_彻底理解Python list切片原理
- Pangu Separates Heaven and Earth(签到题)
- 【打表枚举+二分】喜爱
- 【1945. 字符串转化后的各位数字之和】
- 微信支付网页授权域名只能填1个,怎么破,教你一招搞定
- 《中国古代文化常识》读书笔记
- 联想笔记本进入pe_lenovo怎么进入pe系统?
- 根据某一字段值相同合并字符串
- JAVA Calendar详解
- 《大话设计模式》—— 读后感 (12)牛市股票还会亏钱?—— 外观模式