1147 - 最后你还是AK了

Time Limit:5s Memory Limit:256MByte

DESCRIPTION

今天HHHH遇到了一颗树,这个树有nn个点(nn为偶数),每条边都有一个长度ll,现在HHHH想把这nn个点两两匹配,匹配成n/2n/2对点,然后我们将匹配后的n/2n/2对点的距离求和,我们将所有匹配方案里距离和最大的那一个值定义为可爱值.

即我们将这nn个点分成了

定义dis(x,y)dis(x,y)为xx到yy的距离,那么可爱值为

max(∑n/2i=1dis(ai,bi))max(∑i=1n/2dis(ai,bi))

现在HHHH为了使这颗树变可爱,他可以使用kk次膜法,第ii次能使一条边的长度增加cici,但是被膜过的边就不能再被膜了,现在HHHH想知道使用了膜法以后,这颗树的可爱值最多能是多少.

INPUT
第一行是一个整数T(1≤T≤10)T(1≤T≤10),表示有TT组数据
对于每组数据输入一行2个整数n,k (1≤n≤105,0≤k≤n−1)n,k (1≤n≤105,0≤k≤n−1)表示这棵树总共有nn个点,HHHH可以使用kk次膜法.
接着一行n−1n−1行每行3个数:u,v,w(1≤u,v≤n,1≤w≤105)u,v,w(1≤u,v≤n,1≤w≤105)表示在uu和vv之间有一条长度为ww的边.
最后一行kk个整数,第ii个整数ci(1≤ci≤105)ci(1≤ci≤105)表示第ii种膜法能使得某一条边变长cici
保证nn为偶数且给出的是一颗树
OUTPUT
每组数据输出一行,一个整数,表示♂可♂爱♂值♂最多能是多少
SAMPLE INPUT
1
4 2
1 2 5
2 3 5
3 4 5
5 5
SAMPLE OUTPUT
35
HINT
对于样例,我们将1和4匹配,2和3匹配,然后对2和3之间的边使用膜法,对3和4之间的边使用魔法
若出现爆栈问题,改栈方法请参考1093题目代码
1093地址:http://www.ifrog.cc/acm/problem/1093
代码地址:http://ideone.com/Wk24ET
分析:不考虑加魔法时与加魔法是独立的;
   不加魔法时贪心的对每条边算贡献为min(son[x] , n - son[x] )*len ,可以想象一下是可行的;
   加入魔法时只需贪心的放min(son[x] , n - son[x] )大的边即可;
代码:
#define OPENSTACK
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <bitset>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <cassert>
#include <ctime>
#define rep(i,m,n) for(i=m;i<=(int)n;i++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define sys system("pause")
#define ls rt<<1
#define rs rt<<1|1
const int maxn=1e5+;
const int N=5e2+;
using namespace std;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qmul(ll p,ll q,ll mo){ll f=;while(q){if(q&)f=(f+p)%mo;p=(p+p)%mo;q>>=;}return f;}
ll qpow(ll p,ll q,ll mo){ll f=;while(q){if(q&)f=qmul(f,p,mo)%mo;p=qmul(p,p,mo)%mo;q>>=;}return f;}
int n,m,k,t,son[maxn],c[maxn],id[maxn];
vi e[maxn];
vi f[maxn];
ll ret;
bool cmp(int x,int y){return min(son[x],n-son[x])>min(son[y],n-son[y]);}
void dfs(int x,int y)
{
son[x]=;
int i;
rep(i,,e[x].size()-)
{
int z=e[x][i],w=f[x][i];
if(z==y)continue;
dfs(z,x);
ret+=1LL*min(son[z],n-son[z])*w;
son[x]+=son[z];
}
}
int main()
{
#ifdef OPENSTACK
int size = << ; // 64MB
char *p = (char*)malloc(size) + size;
#if (defined _WIN64) or (defined __unix)
__asm__("movq %0, %%rsp\n" :: "r"(p));
#else
__asm__("movl %0, %%esp\n" :: "r"(p));
#endif
#endif
int i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
rep(i,,n)id[i]=i,e[i].clear(),f[i].clear(),son[i]=;
rep(i,,n-)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
e[x].pb(y);
f[x].pb(z);
e[y].pb(x);
f[y].pb(z);
}
rep(i,,k)scanf("%d",&c[i]);
ret=;
dfs(,);
sort(c+,c+k+,greater<int>());
sort(id+,id+n+,cmp);
rep(i,,min(n,k))ret+=1LL*min(son[id[i]],n-son[id[i]])*c[i];
printf("%lld\n",ret);
}
#ifdef OPENSTACK
exit();
#else
return ;
#endif
}

玲珑杯1147 - 最后你还是AK了的更多相关文章

  1. “玲珑杯”ACM比赛 Round #18 1147 - 最后你还是AK了(思维,边的贡献)

    题目链接:http://www.ifrog.cc/acm/problem/1147 题解:这题很容易想到的是边的贡献也就是每条边最多被取到几次,和点的贡献类似,那些加边只要加在边贡献大的边上就行.然后 ...

  2. “玲珑杯”ACM比赛 Round #18--最后你还是AK了(搜索+思维)

    题目链接   DESCRIPTION INPUT OUTPUT SAMPLE INPUT 1 4 2 1 2 5 2 3 5 3 4 5 5 5 SAMPLE OUTPUT 35 HINT 对于样例, ...

  3. //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和

    //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...

  4. ural 1147. Shaping Regions

    1147. Shaping Regions Time limit: 0.5 secondMemory limit: 64 MB N opaque rectangles (1 ≤ N ≤ 1000) o ...

  5. 百度地图秘钥ak的获取

    今天打开网站的时候出现了这个问题“百度未授权使用地图API, 可能是因为您提供的密钥不是有效的百度开放平台密钥或此密钥未对本应用的百度地图JavasoriptAPI授权.....”经过研究终于知道什么 ...

  6. 百度地图LBS开放平台AK一直没有用

    http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924;114.21892734521,29.57542 ...

  7. 移动平台作业——天气预报——天气数据的获得——为应用申请百度ak码

    需求: 可切换城市 可实时更新(按钮或手势或下拉刷新) 可现实未来三日的天气 不限制横屏或者竖屏,不限制布局样式,但要求得到的数据均需显示(北京.天气数据.天气图标) 提示: 获得实时天气数据(任选一 ...

  8. 点分治练习:不虚就是要AK

    [题面] 不虚就是要AK(czyak.c/.cpp/.pas) 2s 128M czy很火.因为又有人说他虚了.为了证明他不虚,他决定要在这次比赛AK. 现在他正在和别人玩一个游戏:在一棵树上随机取两 ...

  9. 设正整数n的十进制表示为n=ak……a1a0(0<=ai<=9,0<=i<=k,ak!=0),n的个位为起始数字的数字的正负交错之和T(n)=a0+a1+……+(-1)kak,证明:11|n的充分必要条件是11|T(n);(整除理论1.1.2))

    设正整数n的十进制表示为n=ak……a1a0(0<=ai<=9,0<=i<=k,ak!=0),n的个位为起始数字的数字的正负交错之和T(n)=a0+a1+……+(-1)kak, ...

随机推荐

  1. java 监听机制模拟(JButton按钮监听机制)

    一.概念 1.事件监听器 事件监听器就我个人的理解就是:被外部事件(键盘.鼠标)引发的程序,这段程序是被嵌入到事件源的类里面,它负责监听事件列表.而很多人把事件监听器理解成是实现EventListen ...

  2. DStream 转换操作----无状态转换

    DStream转换操作包括无状态转换和有状态转换. 无状态转换:每个批次的处理不依赖于之前批次的数据. 有状态转换:当前批次的处理需要使用之前批次的数据或者中间结果.有状态转换包括基于滑动窗口的转换和 ...

  3. linux_bash_shell_cheat_sheet(自译)

    [说明] 发现错误或不足请务必联系我!!! linux_bash_shell_cheat_sheet.pdf (英文原本以及译本下载,链接失效请私信或邮箱联系)

  4. P2924 [USACO08DEC]大栅栏Largest Fence

    传送门 反正我是看不出来这题和凸包有什么关系--大佬们是怎么想到的-- 不准确一点的说,本题就是要我们求一个边上点数最多的凸包 我们可以先把所有的边都取出来,然后按极角排序.枚举这个凸包的起点,然后做 ...

  5. [Swift通天遁地]五、高级扩展-(2)扩展集合类型

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. 我正在学英语是用learning english还是用studying english?

    学一门语言用 learn. study 表示深入研究,一般指在大学里.如果大学里的专业是英语,就可以说 study English. 1. If you study hard, you will le ...

  7. linux,apache,mysql,php常用查看版本信息的方法

    1. 查看linux的内核版本,系统信息,常用的有三种办法: uname -a; cat /proc/version; -bash-4.2$ uname -a Linux apphost -.el7. ...

  8. DeltaFish 校园物资共享平台 第八次小组会议

    DeltaFish 校园物资共享平台 第八次小组会议 记录人:娄雨禛 2018.7.31 会议总结 1. 对前端界面进行改进,具体改进内容如下: 2. 后端从登录和注册的具体实现做起,熟悉流程之后完成 ...

  9. jQuery导航插件One-Page-Nav演示-显示命名锚记

    jQuery导航插件One-Page-Nav演示-显示命名锚记 简介 使用 选项 示例 推荐 简介 电商网站的分类比较明确,比如1楼是手机通讯产品,2楼是家用电器,3楼是服装鞋包等等,旁边还会有一个固 ...

  10. WinServer2008配置任务计划

    window server 2008下配置任务计划 打开window servers 2008下任务计划配置工具 点击“开始”-->“管理工具”-->“任务计划程序”,打开任务计划配置工具 ...