Link:

USACO 2018 Jan Gold 传送门

A:

对于不同的$k$,发现限制就是小于$k$的边不能走

那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小

为了优化建图过程,考虑离线,将询问和边都按权值从大到小排序,依次加边即可

维护连通性和连通块大小用并查集

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MAXN=1e5+;
struct query{int k,v,id;}qry[MAXN];
struct edge{int x,y,r;}e[MAXN<<];
int n,q,f[MAXN],sz[MAXN],res[MAXN]; bool cmp1(edge a,edge b){return a.r>b.r;}
bool cmp2(query a,query b){return a.k>b.k;} int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void merge(int x,int y)
{
int px=find(x),py=find(y);
if(px==py) return;
f[px]=py;sz[py]+=sz[px];
} int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
f[i]=i,sz[i]=;
for(int i=;i<n;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].r);
for(int i=;i<=q;i++)
scanf("%d%d",&qry[i].k,&qry[i].v),qry[i].id=i;
sort(e+,e+n,cmp1);sort(qry+,qry+q+,cmp2); int top=;
for(int i=;i<=q;i++)
{
while(e[top].r>=qry[i].k&&top<n)
merge(e[top].x,e[top].y),top++; res[qry[i].id]=sz[find(qry[i].v)]-;
}
for(int i=;i<=q;i++)
printf("%d\n",res[i]);
return ;
}

Problem A

B:

将出发点$k$作为根

维护每个点到最近叶子的距离$dist$和该子树内需要的叶子$sum$

如果$dist<dep$明显可以只用一个叶子,$sum=1$就好了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MAXN=1e5+;
struct edge{int nxt,to;}e[MAXN<<];
int n,k,x,y,head[MAXN],sum[MAXN],mn[MAXN],dep[MAXN],tot; void add_edge(int x,int y)
{
e[++tot].nxt=head[x];e[tot].to=y;head[x]=tot;
e[++tot].nxt=head[y];e[tot].to=x;head[y]=tot;
} void dfs(int x,int anc)
{
int cnt=;
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
dep[e[i].to]=dep[x]+;
cnt++;dfs(e[i].to,x);
sum[x]+=sum[e[i].to]; if(!mn[x]) mn[x]=mn[e[i].to]+;
else mn[x]=min(mn[x],mn[e[i].to]+);
} if(!cnt||dep[x]>=mn[x]) sum[x]=;
} int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),add_edge(x,y); dfs(k,);
printf("%d",sum[k]);
return ;
}

Problem B

C:

关于最终状态唯一能得到的性质为:一定会有连续至少$k$个相同的一段

结果我一开始全在想如何将可行方案去重……但明显补集更好求啊!

令$dp[i]$表示前$i$位连续最多$k-1$个相同的方案数

$dp[i]=(m-1)*\sum_{j=1}^{k-1} dp[i-j]$

用$suf$时刻保存$dp$数组的后缀和就能$O(n)$求出$dp[n]$了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MOD=1e9+,MAXN=1e6+;
ll n,m,k,suf,dp[MAXN]; ll quick_pow(ll a,ll b)
{
ll ret=;
for(;b;b>>=,a=a*a%MOD)
if(b&) ret=ret*a%MOD;
return ret;
} int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=;i<=k-;i++)
dp[i]=quick_pow(m,i),(suf+=dp[i])%=MOD;
for(int i=k;i<=n;i++)
dp[i]=suf*(m-)%MOD,(suf+=dp[i]-dp[i-k+]+MOD)%=MOD; printf("%lld",(quick_pow(m,n)-dp[n]+MOD)%MOD);
return ;
}

Problem C

[USACO 2018 Jan Gold] Tutorial的更多相关文章

  1. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  2. [USACO 2017 Jan Gold] Tutorial

    Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...

  3. [USACO 2018 Open Gold] Tutorial

    Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...

  4. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  5. bzoj258 [USACO 2012 Jan Gold] Bovine Alliance【巧妙】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=111 传送门2:http://www.lydsy.com/JudgeOn ...

  6. bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOn ...

  7. BZOJ1785[USACO 2010 Jan Gold 3.Cow Telephones]——贪心

    题目描述 奶牛们建立了电话网络,这个网络可看作为是一棵无根树连接n(1 n 100,000)个节点,节点编号为1 .. n.每个节点可能是(电话交换机,或者电话机).每条电话线连接两个节点.第i条电话 ...

  8. [USACO 2017 Open Gold] Tutorial

    Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...

  9. [USACO 2017 Feb Gold] Tutorial

    Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...

随机推荐

  1. Java 扑克牌发牌

    今天看到这个算法题,http://www.cnblogs.com/xishuai/p/3392981.html ,忍不住自己用Java做了一个. 初始化很重要,所有的52张牌按顺序放入到容器里边,标志 ...

  2. 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)

    题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...

  3. HDU 2639 Bone Collector II (dp)

    题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...

  4. It is possible that this issue is resolved by uninstalling an existi

    使用真机连接Android Studio测试时出现这样的错误: 解决方法: 设置Android Studio 中Instant Run中的选项为不选中 根据以下路径,找到Instant Run中的选项 ...

  5. nodewebkitV0.21.6版本的学习

    1.下载 https://nwjs.io/ 建议下载sdk版本,有调试功能,正式发布时,使用normal版本 下载以后解压,得到的文件目录如下 点击nw.exe,显示如下 2.hello world ...

  6. 2017-2018-1 20179205《Linux内核原理与设计》第三周作业

    <Linux内核原理与分析>第三周作业 教材学习总结 第三章 进程管理 进程是Unix操作系统抽象概念中最基本的一种,是正在执行的程序代码的实时结果:线程,是在进程中活动的对象.而Linu ...

  7. 利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单

    转载自:https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html 目标环境: 比如,目标存在一个上 ...

  8. appium===使用weditor代替ui automator viewer

    weditor 一个元素定位工具,并可实现通过wifi连接移动端进行定位. https://github.com/openatx/uiautomator2 python安装方式: pip instal ...

  9. Python简单的制作图片验证码

    -人人可以学Python--这里示范的验证码都是简单的,你也可以把字符扭曲 人人可以学Python.png Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使 ...

  10. 动画基础--基于Core Animation(3)

    参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1),动画基础--基于Core Animation(2) ...