1. 程式人生 > >2017年多校聯合訓練 第五場(吉如一)

2017年多校聯合訓練 第五場(吉如一)

官方題解

1006 Rikka with Graph
hdoj6090題目連結
貪心加邊
m<=n-1時,邊都從同一個點出發向不同的點連邊,呈菊花狀
中心點與其餘有邊的點的距離和:2*m
除中心點外有邊的點間的距離和:m(m1)2*2*2(第一個乘2是因為每個點對間的距離為2,第二個乘2是因為每個點對要算兩次)
對於沒邊的點,最少要連的邊數為m+1條,最多要連的邊數是n-1條,等差數列求和。這部分的距離和為:(m+1+n1)[n1(m+1)+1]2*n*2
(乘n是每個點對的距離,乘2是因為每個點對要算兩次)
三個部分累加即得第一種情況下的距離和
m>n時,前n-1條邊按照按照上面的情況貪心加完成為一朵完好的菊花,先把m=n-1帶入第一情況得到一個初始值2*(n-1)+2*(n-1)*(n-2)
剩下的邊加在不直接相連的點對之間,每加一條使得兩點之間的距離減1,對整體距離和的影響為減2
注意:m有可能大於n

(n1)2;答案一定大於等於n*(n-1)

#include<bits/stdc++.h>
using namespace std;
long long n,m;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld",&n,&m);
        if(m<=n-1) printf("%lld\n",2*m+2*m*(m-1)+(m+n)*(n-m-1)*n);
        else printf("%lld\n",max(2
*(n-1)*(n-1)-2*(m-n+1),n*(n-1))); } }

1008 Rikka with Subset
hdoj6092題目連結
這題就是母函式的逆過程昂
針對這個題目列出的等式為:
(1+xa1)(1+xa2)...(1+xan)=b0x0+b1x1+...+bmxm
回顧一下母函式的係數(b陣列的操作過程)
之前:bji...bj
之後:bji...bj
bj=bji+bi
我們存放係數的是同一個陣列b,所以需要從後往前操作才能避免覆蓋帶來的錯誤
再回到此題,需要採取逆操作,即從前往後操作,詳見程式碼

#include<bits/stdc++.h>
using namespace std; long long b[10005]; int main() { int t,n,m,i,j,k; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(i=0;i<=m;i++) scanf("%lld",&b[i]); for(j=i=1;i<=n;i++){ while(!b[j]) j++; b[j]--; if(i>1) printf(" "); printf("%d",j); if(i==n) { puts("");break; } for(k=j+1;k<=m;k++) b[k]-=b[k-j]; } } }

1011 Rikka with Competition
hdoj6095題目連結
簽到快樂

#include<bits/stdc++.h>
using namespace std;
int t,n,k,i,s,a[100005];
int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&k);
        for(i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        for(s=1,i=n-1;i;i--,s++) if(a[i+1]-a[i]>k) break;
        printf("%d\n",s);
    }
}