• Day4下午


    不会啊。

    T1

    找规律: 辗转相减,加速。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    using namespace std;
    long long a,b,c,ans=2;
    int main()
    {
        freopen("seq.in","r",stdin);
        freopen("seq.out","w",stdout);
        scanf("%lld%lld",&a,&b);
        if(abs(a-b)==1)
        {
            cout<<(a+1);
            return 0;
        }
        if(a<b)
        {
            c=a;
            a=b;
            b=c;
        }
    
        while(a&&b)
        {
            if(b<a-b)
                b=a-b;
            c=a-b;
            if(c<b)
            {a=b;b=c;}
            else
            if(c>b)
            {a=c;}
            else
            if(b==c)
            {a=c;ans--;}
            ans++;    
            if(b==1)
            {
                cout<<ans+a-1<<endl;
                return 0;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    first
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    using namespace std;
    long long a,b,c,ans;
    int main()
    {
        freopen("seq.in","r",stdin);
        freopen("seq.out","w",stdout);
        scanf("%lld%lld",&a,&b);
        if(a<b)
        {
            c=a;
            a=b;
            b=c;
        }
        c=a%b;
        while(c)
        {
            ans+=a/b;        
            a=b;b=c;c=a%b;
        }
        ans+=a/b;
        ans++;
        cout<<ans<<endl;
        return 0;
    }
    除法加速

    T2

    好写的一种方法,直接建一棵最大生成树。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<ctime>
    using namespace std;
    const int N=100009;
    struct node{
        int x,y,z;
    }a[N*2];
    int f[N],size[N],last[N];
    int n,m;
    long long ans[N];
    bool cmp(node v,node u)
    {    return v.z>u.z;}
    int find(int x)
    {
        while(x!=f[x])
            x=f[x]=f[f[x]];
        return x;
    }
    int main()
    {
        freopen("car.in","r",stdin);
        freopen("car.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)    
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
        
        sort(a+1,a+1+m,cmp);
        for(int i=1;i<=n;i++)
            f[i]=i,size[i]=1,last[i]=1;
        int f1,f2,i=2;
        f1=find(a[1].x);f2=find(a[1].y);
        if(f1!=f2)
                    f[f1]=f2,size[f2]+=size[f1];
        while(i<=m+1)
        {
            while(a[i].z==a[i-1].z)
            {
                f1=find(a[i].x);
                f2=find(a[i].y);
                if(f1!=f2)
                    f[f1]=f2,size[f2]+=size[f1];
                i++;
            }
            for(int j=1;j<=n;j++)
            {
                ans[j]+=(1LL*size[find(j)]-1LL*last[j])*(1LL*size[find(j)]-1LL*last[j]);
                last[j]=size[f[j]];
            }
            f1=find(a[i].x);f2=find(a[i].y);
            if(f1!=f2)
                    f[f1]=f2,size[f2]+=size[f1];
            i++;                
        }
        for(int i=1;i<=n;i++)
        printf("%lld ",ans[i]);
        cout<<'
    '<<clock();
        return 0;
    }
    first 30

    我自己测得50%的数据试过的,跑的贼快。不知道哪错了。

    反正我的做法是O(nm)的不是正解。

    正解是见一棵最大生成树, 

    T3

    部分分dp

    很难noi思维难度

  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7762629.html
Copyright © 2020-2023  润新知