Asce's Summer Ranking No.9

来源:互联网 发布:冉启伟甘肃启航网络 编辑:程序博客网 时间:2024/06/05 17:10
时间限制 1000 ms 内存限制 65536 KB

题目描述

You are givin an array of integers, and you are to figure out the sum of differences between each pair of integers belonging to the array. SEE THE HINT FOR MORE INFORMATION.

输入格式

There are multiple test cases. The first line contains an integer n(n<=1e5), size of the array. The second line contains n integers, ai(|ai|<=100000), the array.

输出格式

For each case, output one line, the answer.

输入样例

41 1 2 2

输出样例

4hintfor the test case the answer is abs(1-1)+abs(1-2)+abs(1-2)+abs(1-2)+abs(1-2)+abs(2-2)=4.

就是求线段上的一点到其余各点的距离和,可以很方便的On推一遍算出来

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#define maxn 100005 using namespace std; int n;long long ab,sum;int a[maxn];int main(){    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        sort(a+1,a+1+n);        ab=0;sum=0;        for(int i=2;i<=n;i++) ab+=abs(a[i]-a[1]);        sum+=ab;        for(int i=2;i<=n;i++)        {            ab+=(long long)(i-1)*(long long)abs(a[i]-a[i-1]);            ab-=(long long)(n-i+1)*(long long)abs(a[i]-a[i-1]);            sum+=ab;        }        printf("%lld\n",sum/2);    }    return 0;}

----------------------------------------------------------------------------

时间限制 1000 ms 内存限制 65536 KB

题目描述

Mays王国的女王大人每天过着自由自在的生活,她最大的乐趣就是给邻国的帅气王子写信。但是最近,Mays王国的叔叔们变得很无聊,他们知道女王大人每次都把信委托给皇家小妹妹快递公司的小妹妹们,于是叔叔们给每一条路都设立了路障,只有小妹妹们给他们表演节目才会让小妹妹们过去。
在每一个路障,都有不同数量的叔叔,只有表演的小妹妹的数量不少与叔叔的数量的时候叔叔才会放她们过去。
可是七夕快要到了,Masy王国的每一个人都在给自己的情人写信。
Mays王国由n个地区组成,一些双向的道路连接着这些地区。注意两个地区之间可能有多条道路相通。
无聊的单身的beegerous已经算出了从一点到另一点送信最少需要的小妹妹的数量,为了表达对世界的不满,他脑补出了小妹妹们给任意两个点之间送信的画面,这样她们一共需要送n*(n-1)次信!如果所有的信件必须同一时间发出,这样每一次快递都需要由不同的小妹妹们来送!这样就会有好多好多小妹妹在Mays王国的道路上忙碌了。
请问,按上述脑补情形,皇家小妹妹快递公司一共需要派出多少小妹妹。

输入格式

输入第一行为数据组数T(T<=10),接下来T组数据,每组第一行为n,m,,2<=n<=10000,1<=m<=100000,表示Mays王国的道路由n个节点组成,接下来m行,每行一组u,v,c表示连接节点u,v的一条无向道路,且路障上有c个叔叔,1<=u,v<=n,0<=c<=100。
输入保证任意两点之间可达。

输出格式

每组数据输出一个数字,表示小妹妹快递公司最少需要派出的小妹妹数量。

输入样例

13 31 2 12 3 11 3 3

输出样例

6hint:9种送快递的方式及花费为:1 --> 2:  11 --> 3:  12 --> 1:  12 --> 3:  13 --> 1:  13 --> 2:  1答案为6
上次那道并查集的扩展,每合并两个集合的时候,把两个集合的节点个数相乘,加到总和里就好了~

还是注意要特判每条边为0的情况

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define maxn 10005#define maxm 100005using namespace std; struct Edge{    int a;    int b;    int value;}edge[maxm]; bool cmp(Edge x,Edge y){    return x.value<y.value;} int fa[maxn],sum[maxn]; int t,n,m;long long ans; int GetFather(int x){    if(x==fa[x]) return x;    fa[x]=GetFather(fa[x]);    return fa[x];}int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=1;i<=m;i++)            scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].value);        for(int i=1;i<=n;i++)        {            fa[i]=i;            sum[i]=1;        }        sort(edge+1,edge+m+1,cmp);         ans=0;        for(int i=1;i<=m;i++)        {            if(GetFather(edge[i].a)!=GetFather(edge[i].b))            {                if(edge[i].value==0) ans+=sum[GetFather(edge[i].a)]*sum[GetFather(edge[i].b)]*2;                else ans+=sum[GetFather(edge[i].a)]*sum[GetFather(edge[i].b)]*edge[i].value*2;                sum[GetFather(edge[i].a)]+=sum[GetFather(edge[i].b)];                fa[GetFather(edge[i].b)]=GetFather(edge[i].a);            }        }        printf("%lld\n",ans);    }    return 0;}

-----------------------------------------------------------------------------------

时间限制 1000 ms 内存限制 65536 KB

题目描述

大家都知道,学校里有很多路在修,修路需要砖块。这一天,Mr.F来到集训队,找学妹去帮忙搬砖块。善良的学长们不忍心让学妹劳动,就争先恐后的帮助学妹搬砖。于是聪明的学妹说,我出一个题,谁答出来谁就能帮我搬砖。
把学校要铺的地面看成是n*m的方格,每一块砖的大小是1*2,学妹想知道有多少种方法可以把这块地铺满。注意地上有可能会有花花草草,有爱心的学妹不忍心砖块把它们压死,所以这些点是不可以铺砖块的。

输入格式

输入多组数据,数据组数不超过20组。每组第一行为三个整数n, m, k,(1<=n, m<=10),k<=n*m,分别代表地面的长宽,以及花花草草的数量。接下来k行,每行一组x,y,表示花花草草的坐标。详细方向见样例。

输出格式

每组输出一个数,即最后的方案数。由于输出会很大,请输出答案mod 1000000007(10^9+7)。

输入样例

3 1 12 03 1 0

输出样例

10hint:第一组样例所示地面为:..*其中‘.‘表示空地,’*‘表示花花草草,一种方案可以铺满。
状压dp,(呵呵呵呵我是打的模板嘞)

田田讲了还可以用网络流做,是个匹配问题,待看吧今天被这final场虐得一点心情都没有

#include <iostream>#include <cstdio>#include <cstring>#define maxn 12#define mo 1000000007 using namespace std; int n,m,k;bool color[maxn][maxn];long long dp[2][1<<maxn]; void solve(){    long long *crt=dp[0],*next=dp[1];    crt[0]=1;    for(int i=n-1;i>=0;i--)    {        for(int j=m-1;j>=0;j--)        {            for(int used=0;used< 1<<m;used++)            {                if((used>>j &1) || color[i][j] )                {                    next[used]=crt[used & ~(1<<j)];                }                else                {                    int res=0;                    if(j+1<m && !(used>>(j+1) &1) && !color[i][j+1])                    {                        res+=crt[used | 1<<(j+1)];                    }                    if(i+1<n && !color[i+1][j])                    {                        res+=crt[used | 1<<j];                    }                    next[used]=res%mo;                }            }            swap(crt,next);        }    }    printf("%lld\n",crt[0]);} int main(){    while(~scanf("%d%d%d",&n,&m,&k))    {        memset(color,false,sizeof(color));        for(int i=1;i<=k;i++)        {            int tmpy,tmpx;            scanf("%d%d",&tmpy,&tmpx);            color[tmpy][tmpx]=true;        }        solve();    }    return 0;}

--------------------------------------------------------

时间限制 1000 ms 内存限制 65536 KB

题目描述

Mays王国的女王大人每天过着自由自在的生活,她最大的乐趣就是给邻国的帅气王子写信。而负责给她送信的就是皇家小妹妹快递公司。
Mays王国由n个地区组成,一些双向的道路连接着这些地区。
最近,女王大人听说了有叔叔设置路障为难小妹妹,于是下令清理了所有的叔叔,并且封锁了一些道路,在保证所有地区相互可达的情况下使得Mays王国的路最少,这样,Mays王国就变成了一颗树的形状,这样小妹妹们就再也不会迷路啦。女王大人还播下了很多很多经费,小妹妹快递公司的董事长决定重新盖一栋小妹妹大楼。
为了选择一个好的区域来盖大楼,董事长希望它给公司带来的压力是最小的,给公司带来的压力就是小妹妹们出发时,同一方向上最多的小妹妹的数量。每送一次快递,公司会派出n-1个小妹妹给其他n-1个区域送快递。
无聊的beegerous听到了这个消息之后很难过,满怀恶意的他对着地图删掉了Mays王国的一些区域,于是小妹妹公司得到一个新的压力值和区域数目值,小妹妹们发现了一个规律:新的压力值不小于新的区域数目的一半。
比如原来的Mays王国有五个区域,四条道路分别连接区域1,2,区域1,3,区域2,4,区域3,5,那么小妹妹公司的新址就是区域1,压力值为2,beegerous可以通过去掉区域3和5,使得新的压力值为2,而新区域数的一半为1.5。
现在请你计算有多少种删除的方法。
注意,热爱Mays王国的beegerous不会在删完某些区域之后使得Mays王国不连通。

输入格式

输入第一行为数据组数T(T<=10),接下来每组输入第一行为区域数n(1<=n<=200),接下来n-1行每行两个整数u,v(1<=u,v<=n),表示一条道路连接区域u,v。输入保证小妹妹公司的新址是唯一的。

输出格式

输出一个数,方案数对10007取模。

输入样例

4131 21 341 21 31 451 21 31 44 5

输出样例

0236
树上的背包。。至今仍然不会。。

第一步是求出树的重心,这个比较容易,树形dp做一下就好啦~

然后接下来和hdu 4863这个多校赛题就一样了。。参见我链接的blog这题还是不会啊0.0


0 0