2017 Multi-University Training Contest - Team 3
2017-08-02 13:06
351 查看
第三场前夕,早上五点才睡,九点半被宿舍的施工吵醒,再也没能睡着。比赛打到一个半小时就开始昏昏欲睡了。加上第三场比赛本身很难,中途AC2题的时候可以从RANK50一直排到RANK300。这场比赛不光是对算法能力的考验,更是对实现算法能力的考验。罚时成了RANK取胜的关键因素。
把1看成整棵树的根. 问题相当于把2\sim
n2∼n每个点一个[1,
k][1,k]的标号.
然后根据最小斯坦纳树的定义, (x,
fa_x)(x,fax) 这条边的贡献是
x 子树内不同标号的个数目dif_idifi.
那么显然有dif_i\leq
min(k, sz_i)difi≤min(k,szi), sz_iszi表示子树大小.
可以通过构造让所有dif_idifi都取到最大值.
所以答案就是\sum_{x
= 2}^{n}{w[x][fa_x] * min(sz_x, k)}∑x=2nw[x][fax]∗min(szx,k)时间复杂度O(n)O(n).
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans;
struct node{
int v,w;
node(int _v,int _w){
v=_v;
w=_w;
}
};
vector<node> e[1000005];
int n,k;
int sz[1000005];
void dfs(int id,int fa,int ww){
sz[id]=1;
for (int i=0;i<e[id].size();i++){
int ep=e[id][i].v;
if (ep==fa) continue;
int w=e[id][i].w;
dfs(ep,id,w);
sz[id]+=sz[ep];
}
if (fa==0) return;
int tmp=min(sz[id],k);
ans+=(ll)tmp*ww;
}
int main(){
while(scanf("%d %d",&n,&k)!=EOF)
{
for (int i=1;i<=n;i++) e[i].clear();
memset(sz,0,sizeof(sz));
for (int i=1;i<n;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
e[x].push_back(node(y,z));
e[y].push_back(node(x,z));
}
ans=0;
dfs(1,0,0);
printf("%lld\n",ans);
}
}
注意到一个数字xx必然会被唯一表示成a^2\times
ba2×b的形式.其中|\mu(b)|
= 1∣μ(b)∣=1。
所以这个式子会把[1,
n^k][1,nk]的每个整数恰好算一次.
所以答案就是n^knk,快速幂即可.
时间复杂度O(\log
k)O(logk).
#include<cstdio>
#include<iostream>
typedef long long ll;
const ll MOD=1e9+7;
ll power(ll n,ll k)
{
if (k==0)
{
return 1;
}
ll tmp = power(n,k/2);
if (k&1) return tmp*tmp%MOD*n%MOD;
return tmp*tmp%MOD;
}
int main()
{
ll n,k;
int t=1;
while (scanf("%lld %lld",&n,&k)!=EOF)
{
n%=MOD;
ll ans=power(n,k);
ans+=MOD;
ans%=MOD;
printf("Case #%d: %lld\n",t++,ans);
}
return 0;
}
一个签到题,目的在于吐槽浙江的高温
统计有多少数<=35<=35即可。
1005
把1看成整棵树的根. 问题相当于把2\simn2∼n每个点一个[1,
k][1,k]的标号.
然后根据最小斯坦纳树的定义, (x,
fa_x)(x,fax) 这条边的贡献是
x 子树内不同标号的个数目dif_idifi.
那么显然有dif_i\leq
min(k, sz_i)difi≤min(k,szi), sz_iszi表示子树大小.
可以通过构造让所有dif_idifi都取到最大值.
所以答案就是\sum_{x
= 2}^{n}{w[x][fa_x] * min(sz_x, k)}∑x=2nw[x][fax]∗min(szx,k)时间复杂度O(n)O(n).
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans;
struct node{
int v,w;
node(int _v,int _w){
v=_v;
w=_w;
}
};
vector<node> e[1000005];
int n,k;
int sz[1000005];
void dfs(int id,int fa,int ww){
sz[id]=1;
for (int i=0;i<e[id].size();i++){
int ep=e[id][i].v;
if (ep==fa) continue;
int w=e[id][i].w;
dfs(ep,id,w);
sz[id]+=sz[ep];
}
if (fa==0) return;
int tmp=min(sz[id],k);
ans+=(ll)tmp*ww;
}
int main(){
while(scanf("%d %d",&n,&k)!=EOF)
{
for (int i=1;i<=n;i++) e[i].clear();
memset(sz,0,sizeof(sz));
for (int i=1;i<n;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
e[x].push_back(node(y,z));
e[y].push_back(node(x,z));
}
ans=0;
dfs(1,0,0);
printf("%lld\n",ans);
}
}
1008
注意到一个数字xx必然会被唯一表示成a^2\timesba2×b的形式.其中|\mu(b)|
= 1∣μ(b)∣=1。
所以这个式子会把[1,
n^k][1,nk]的每个整数恰好算一次.
所以答案就是n^knk,快速幂即可.
时间复杂度O(\log
k)O(logk).
#include<cstdio>
#include<iostream>
typedef long long ll;
const ll MOD=1e9+7;
ll power(ll n,ll k)
{
if (k==0)
{
return 1;
}
ll tmp = power(n,k/2);
if (k&1) return tmp*tmp%MOD*n%MOD;
return tmp*tmp%MOD;
}
int main()
{
ll n,k;
int t=1;
while (scanf("%lld %lld",&n,&k)!=EOF)
{
n%=MOD;
ll ans=power(n,k);
ans+=MOD;
ans%=MOD;
printf("Case #%d: %lld\n",t++,ans);
}
return 0;
}
1011
一个签到题,目的在于吐槽浙江的高温统计有多少数<=35<=35即可。
相关文章推荐
- hdu 6073 Matching In Multiplication(2017 Multi-University Training Contest - Team 4 )
- 2017 Multi-University Training Contest - Team 4 HDU 6070 Dirt Ratio (二分+ 线段树)
- 2017 Multi-University Training Contest - Team 4 Questionnaire
- 2017 Multi-University Training Contest - Team 5 1006 Rikka with Graph
- 2017 Multi-University Training Contest - Team 5-1008 & hdu6092、Rikka with Subset
- 2017 Multi-University Training Contest - Team 7:1005. Euler theorem(答案是(n+3)/2)
- 2017 Multi-University Training Contest - Team 8 1011& HDU6143 Killer Names(容斥|| 第二类斯特林数)
- HDU 6165 - FFF at Valentine DFS暴力 2017 Multi-University Training Contest - Team 9
- 2017 Multi-University Training Contest - Team 9:Two strings
- 2017 Multi-University Training Contest - Team 8 Hybrid Crystals
- 2017 Multi-University Training Contest - Team 10
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
- 2017 Multi-University Training Contest - Team 1 1006 Function(思维 循环节)
- hdu 6034 Balala Power!(贪心)( 2017 Multi-University Training Contest - Team 1 )(无耻之sort)
- 2017 Multi-University Training Contest - Team 1(hdu 6043 KazaQ's Socks)
- hdu 6047 Maximum Sequence(2017 Multi-University Training Contest - Team 2)
- hdu 6045 Is Derek lying?(2017 Multi-University Training Contest - Team 2)
- hdu 6055 Regular polygon(判断正方形)(2017 Multi-University Training Contest - Team 2)
- 2017 Multi-University Training Contest - Team 2 && HDU6047
- 2017 Multi-University Training Contest - Team 1 HDU 6033 Add More Zero【对数】