清北考前刷题day5早安

/*
C(n,k)
*/
#include<iostream>
#include<cstdio>
#include<cstring>

#define ll long long
#define N 1000007
#define M 1000000007

using namespace std;
ll n,k,ans,cnt1,cnt0;
ll inv[N]={1,1},fac[N]={1,1},f[N]={1,1};

inline ll read()
{
    int x=0,f=1;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

inline void init()
{
    for(int i=2;i<=N;i++)
    {
        fac[i]=(fac[i-1]%M*i%M)%M;
        f[i]=((M-M/i)%M*f[M%i])%M;
        inv[i]=(inv[i-1]*f[i]%M)%M;
    }
}

inline ll C(ll a,ll b)
{
    return fac[a]%M*inv[b]%M*inv[a-b]%M;
}

int main()
{
    freopen("cube.in","r",stdin);
    freopen("cube.out","w",stdout);
    n=read();k=read();init();
    printf("%I64d
",C(n,k));
    return 0;
}

/*
做最大生成树时标记哪些边被加了进去。然后把这些边排序。
如果询问权值w的货物,就在边中查找小于w的最大值假设拍第k大
答案就是k+1。 复杂度O(qlogn) 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> 

#define N 100007

using namespace std;
int n,m,q,ans,cnt,num;
int head[N],fa[N];
struct edge{
    int u,v,w,net,pos;
    bool operator < (const edge &a) const{
            return w>a.w;
    }
}e[N<<1],E[N],tmp[N<<1];

inline int read()
{
    int x=0,f=1;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

inline void add(int u,int v,int w)
{
    e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;
    e[cnt].net=head[u];head[u]=cnt;
}

int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}

void kruskal()
{
    int r1,r2;
    sort(E+1,E+m+1);
    for(int i=1;i<=m;i++)
    {
        r1=find(E[i].u),r2=find(E[i].v);
        if(r1==r2)continue;
        fa[r1]=r2;num++;
        add(E[i].u,E[i].v,E[i].w);add(E[i].v,E[i].u,E[i].w);
        tmp[num].pos=num;tmp[num].u=E[i].u,tmp[num].v=E[i].v;tmp[num].w=E[i].w;
        if(num==n-1) break;
    }
}

int serch(int x)
{
    int l=1,r=n-1,mid;
    while(l<=r)
    {
        mid=l+r>>1;
        if(tmp[mid].w>=x) l=mid+1;
        else ans=mid,r=mid-1;
    }return num-ans+1;
}

int main()
{
    freopen("warehouse.in","r",stdin);
    freopen("warehouse.out","w",stdout);
    int x,y,z,k;
    n=read();m=read();q=read();
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        E[i].u=read();E[i].v=read();E[i].w=read();
    }kruskal();
    for(int i=1;i<=q;i++)
    {
        x=read();
        if(x<=e[cnt].w){printf("1
");continue;}
        if(x>e[1].w){printf("%d
",n);continue;}
        k=serch(x);
        printf("%d
",k+1);
    }
    return 0;
}

折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
原文地址:https://www.cnblogs.com/L-Memory/p/7768618.html