[USACO 2018 Jan Gold] Tutorial
Link:
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的更多相关文章
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- [USACO 2017 Jan Gold] Tutorial
Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...
- [USACO 2018 Open Gold] Tutorial
Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- bzoj258 [USACO 2012 Jan Gold] Bovine Alliance【巧妙】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=111 传送门2:http://www.lydsy.com/JudgeOn ...
- 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 ...
- BZOJ1785[USACO 2010 Jan Gold 3.Cow Telephones]——贪心
题目描述 奶牛们建立了电话网络,这个网络可看作为是一棵无根树连接n(1 n 100,000)个节点,节点编号为1 .. n.每个节点可能是(电话交换机,或者电话机).每条电话线连接两个节点.第i条电话 ...
- [USACO 2017 Open Gold] Tutorial
Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...
- [USACO 2017 Feb Gold] Tutorial
Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...
随机推荐
- 【BZOJ】2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛
[算法]树形DP [题解]没有上司的舞会?233 f[x][0]=∑max(f[v][0],f[v][1]) f[x][1]=(∑f[v][0])+1 #include<cstdio> # ...
- 【比赛】洛谷夏令营NOIP模拟赛
Day1 第一题 水题 第二题 题意:一个n*m的字符矩阵从左上到右下,经过字符形成回文串的路径数.n≤500 回文串,考虑两段往中间DP. f[k][x][y]表示走了k步,左上点横坐标为x,右下点 ...
- Problem E. Matrix from Arrays(杭电2018年多校第四场+思维+打表找循环节)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6336 题目: 题意:给你一个l个元素的数组a,用题目中的程序构造一个新的矩阵,询问q次,问以(x1,y ...
- 逃生(HDU4857 + 反向拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题面是中文题面,就不解释题意了,自己点击链接去看下啦~这题排序有两个条件,一个是按给定的那个序列 ...
- canvas利用formdata上传到服务器
1.首先绘制canvas图片 <canvas id="myCanvas" width="100" height="100" style ...
- Perl6 Bailador框架(5):利用正则匹配路径
use v6; use Bailador; =begin pod 我们在路径设置上, 可以利正则表达式捕获的字符串作为子例程参数 =end pod get '/perl6/(.+)' => su ...
- 【Android XML】Android XML 转 Java Code 系列之 style(3)
最近一个月把代码重构了一遍, 感觉舒服多了, 但总体开发进度没有变化.. 今天聊聊把style属性转换成Java代码的办法 先说结论: 引用系统style是无法完美的实现的, 我们如果有写成Java代 ...
- python基础===时间处理模块
时间模块 Python中有很多方便我们处理时间信息的模块 time 模块 datetime 模块 pytz 模块 dateutil 模块 这里我们着重介绍的是前两种 time模块 time.time( ...
- HighGUI图形图像界面初步——鼠标操作
OpenCV中的鼠标操作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的,创建和指定滑动条回调函数为createTrackbar, 而指定鼠标操作消息回调函数的函数为setM ...
- JS判断客户端是否是iOS或者Android手机移动端
var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...