2013年7月28日

F. Journey

摘要: 题目链接:这儿题目大意:给一棵树T,每条边都有一个权值,然后又一条新增边,多次询问:从点x到点y在T上走的最短距离,在加上那条新增边之后,最短距离可以减少多少。思路:任意确定一个根root,DFS计算每个点到根的距离dis[],然后每两点间的最短距离为 dis[x]+dis[y]-2*dis[LCA(x,y)]。若新加入一条边u--v,那么如果我们必须经过u--v,那么从x到y的最短距离就为 dis(x,u)+dis(u,v)+dis(v,y)或dis(x,v)+dis(v,u)+dis(u,y)。这样在线处理答案就行。PS:至于求LCA的方法可以参考2007年郭华阳的论文《RMQ&L 阅读全文

posted @ 2013-07-28 17:02 SCNUACM 阅读(312) 评论(0) 推荐(0)

D. Divide

摘要: 题目链接:戳这里思路:用一个数组记录下每个二进制位上的值,满2进位,从高位到低位扫一遍,找到不能被均分的最高位(当前位为1而且不是进位获得的),该位置代表的值减去比它低位的值就是答案了AC Code: 1 #include 2 #include 3 #include 4 #define LL long long 5 const long M=110000; 6 LL pos[M],JinWei[M],ans[M],max_pos; 7 long n,t; 8 int main(){ 9 scanf("%d",&t);10 for (long l=1;l1){26 . 阅读全文

posted @ 2013-07-28 16:57 SCNUACM 阅读(217) 评论(0) 推荐(0)

A. A Big Dinner

摘要: 题目链接:猛戳这儿题意:求三个数的全排列AC Code: 1 #include 2 #include 3 #include 4 using namespace std; 5 long a[10],t; 6 long cmp(long x,long y){ 7 return x<y; 8 } 9 int main(){10 scanf("%d",&t);11 for (long i=1;i<=t;++i){12 for (long j=1;j<=3;++j)13 scanf("%d",&a[j]);14 sor... 阅读全文

posted @ 2013-07-28 16:52 SCNUACM 阅读(189) 评论(0) 推荐(0)

导航