刷題#R9

這裏寫圖片描述
立方體
cube.in/.out/.cpp
【問題描述】
在 n 維空間中,一個單位立方體由 2^n 個點組成。
他們的座標形如 (x 1 ,x 2 ,…,x n ),x i ∈ {0,1}。
定義 n 維空間中兩點的距離爲其曼哈頓距離,點 p (p 1 ,p 2 ,…,p n ) 與點
q (q 1 ,q 2 ,…,q n ) 的距離爲
∑ n
i=1 |p i − q i |。
現在給你單位立方體上一點 p 以及一個整數 k,問你與點 p 距離爲 k
的單位立方體上點的數量。
因爲這樣的點可能很多,所以請對 10 9 + 7 取模。
【輸入格式】
輸入共兩行。
第一行兩個數字,表示 n 和 k。
第二行n 個數字,表示 p 的座標。
【輸出格式】
一行一個個數字,表示點的數量。
【樣例輸入】
3 2
1 1 0
【樣例輸出】
3
3
【樣例解釋】
距離 (1,1,0) 爲 2 的點共三個 (0,0,0), (0,1,1), (1,0,1)。
【數據規模和約定】
對於 30% 的數據,滿足 n ≤ 15。
對於 60% 的數據,滿足 n ≤ 10^3 。
對於 100% 的數據,滿足 1 ≤ k ≤ n ≤ 10^6

JD 公司是 C 國最大的網上商城。JD 公司爲了保證快遞質量決定⾃建
倉庫,對商品進行配送。
已知 C 國有 n 個城市,城市間有 m 條雙向道路,每條路有限重。JD
公司想修建一些倉庫來實現對 C 國所有城市的配送,倉庫必須修建在某個
城市。送達每個城市的貨物可以由任意一個倉庫發出,不過在運輸途中必須
滿足限重的要求。
現在 JD 公司的高管在考慮要修建多少個倉庫。高管發現如果修建 n
個倉庫,那配送的重量就不會受到道路限重的限制 (每個城市貨物由本地發
出),但 JD 公司要付出修 n 個倉庫的成本。如果修建 1 個倉庫,那配送的重
量只能是所有道路限重的最小值,但 JD 公司只用付出修 1 個倉庫的成本。
JD 公司想讓你設計一個程序來幫助高管決策,q 次詢問,每次詢問計
算如果想配送重量爲 w 的物品,最少需要建多少個倉庫。

輸入格式】
一行三個數字 n,m,q。
接下來 m 行,每個三個數字 x,y,z。表⽰有⼀條從 x 到 y 的無向邊,限
重爲 z。
接下來 q 行,每行一個數字 w。
【輸出格式】
輸出共 q 行,每行一個整數表示答案。
【樣例輸入】
3 2 3
1 2 1
5
2 3 2
1
2
3
【樣例輸出】
1
2
3
【樣例解釋】
配送重量爲 1 的物品,可以只修建一個倉庫在任意一個城市上。
配送重量爲 2 的物品,需要在城市 1 修建一個倉庫,再修建一個倉庫
在城市 2 或城市 3。
配送重量爲 3 的物品,需要在每個城市都修建一個倉庫。
【數據規模和約定】
對於 30% 的數據,1 ≤ n,m,q ≤ 10^3 。
對於 60% 的數據,1 ≤ n,m,q ≤ 10^4 。
對於 100% 的數據,1 ≤ n,m,q ≤ 10^5 ,1 ≤ x,y ≤ n,0 ≤ z,w ≤ 10^9 。


T1
在n位數中,k個來和自己不一樣,那麼就是

Ckn

了。
需要用到逆元,因爲p是質數,費馬小定理和快速冪就搞定了。
T2
方法一:離線來做,我們構建一個最大生成樹,根據查詢,從大到小倒着加邊,每次加進幾條邊,集合就會減少幾個。
方法二:在線做,同樣先構建出最大生成樹,再把樹上的邊按照從小到大排序,對於每一個詢問,用lower_bound()來查找有幾個不小於它的邊,那麼就會有n-t個集合。
方法一是我自己想的,方法二是題解,其實這兩種基本差不多。

T1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int MOD=(1e9)+7;
int n,k,c;
LL ans=1;
LL q_pow(LL x,LL p)
{
    LL s=1;
    while(p)
    {
        if(p&1) s=(s*x)%MOD;
        x=(x*x)%MOD;
        p>>=1;
    }
    return s;
}
int main()
{
    freopen("cube.in","r",stdin);
    freopen("cube.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%d",&c);

    for(LL i=1;i<=n;i++) ans=(ans*i)%MOD;
    LL x=1;
    for(LL i=1;i<=k;i++) x=(x*i)%MOD;
    for(LL i=1;i<=(n-k);i++) x=(x*i)%MOD;

    ans=(ans*q_pow(x,MOD-2))%MOD;
    printf("%lld\n",ans);
    return 0; 
}

T2
一、

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int N=100009;
struct H{
    int x,y,z;
}e[N];
int n,m,Q,cnt;
int f[N],E[N];
bool cmp(H a,H b)
{
    return a.z>b.z;
}
int find(int x)
{
    return x==f[x]?x:f[x]=find(f[x]);
}
int main()
{
    freopen("warehouse.in","r",stdin);
    freopen("warehouse.out","w",stdout);
    scanf("%d%d%d",&n,&m,&Q);
    for(int i=1;i<=m;i++)
     scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++)
    {
        int u=find(e[i].x),v=find(e[i].y);
        if(u==v) continue;

        E[++cnt]=e[i].z;
        f[u]=v;
    }
    sort(E+1,E+cnt+1);
    while(Q--)
    {
        int x;
        scanf("%d",&x);
        int t=lower_bound(E+1,E+cnt+1,x)-E;
        printf("%d\n",t);
    }
    return 0;
}

二、

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int N=100009;
struct H{
    int x,y,z;
}e[N],E[N]; 
struct QE{
    int id,x;
}q[N];
int n,m,Q,f[N],cnt,ans[N];
bool cmp(H a,H b)
{
    return a.z>b.z;
} 
bool comp(QE a,QE b)
{
    return a.x>b.x;
}
int find(int x)
{
    return x==f[x]?x:f[x]=find(f[x]);
}
int main()
{
    freopen("warehouse.in","r",stdin);
    freopen("warehouse.out","w",stdout);
    scanf("%d%d%d",&n,&m,&Q);
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++)
      scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].z);
    sort(E+1,E+m+1,cmp);

    for(int i=1;i<=m;i++)
    {
        int u=find(E[i].x),v=find(E[i].y);
        if(u==v) continue;

        f[u]=v;
        e[++cnt]=E[i];
    }   
    for(int i=1;i<=Q;i++) scanf("%d",&q[i].x),q[i].id=i;

    sort(q+1,q+Q+1,comp);
    int t=1,num=n;
    for(int i=1;i<=Q;i++)
    {
        while(e[t].z>=q[i].x&&t<=n-1)
        {
            t++;
            num--;
        }
        ans[q[i].id]=num;
    }
    for(int i=1;i<=Q;i++)
     printf("%d\n",ans[i]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章