zoukankan      html  css  js  c++  java
  • 多校 2013 10

    I

    求n的整数拆分有多少方法

    2^(n-1)

    n太大  欧拉降幂+快速幂 

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    
    using namespace std;
    
    typedef long long ll;
    
    #define inf 1e9+7
    #define MAXN 100010
    char s[MAXN];
    
    ll Quick(ll a,ll b,ll c)
    {
        ll ans=1;
        while(b>0)
        {
            if(b&1)
                ans=(ans*a)%c;
            b>>=1;
            a=(a*a)%c;
        }
        return ans;
    }
    int main()
    {
        while(scanf("%s",s)!=EOF)
        {
            int len=strlen(s);
            ll a=0;
            if(len>=10)
            {
                for(int i=0;i<len;i++)
                    a=(a*10+s[i]-'0')%((int)inf-1);
                a=a+inf-2;
            }
            else
            {
                for(int i=0;i<len;i++)
                    a=a*10+s[i]-'0';
                a--;
            }
            printf("%lld
    ",Quick(2,a,inf));
        }
    
        return 0;
    }
    View Code

    Y

    n个点n-1条边

    求三个点不在同一条简单路径上

    正面不好求 求反面 

    这个点 为B  这个点(孩子...)为A C就是没访问过的(孩子孙子 +这个点外面的点)

    #pragma comment(linker, "/STACK:16777216")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    
    using namespace std;
    
    #define ll long long
    #define MAXN 100010
    ll n,ans,w[MAXN];
    int head[MAXN],cnt;
    struct node
    {
        int v,next;
    }edge[MAXN<<1];
    void add(int u,int v)
    {
        edge[cnt].next=head[u];
        edge[cnt].v=v;
        head[u]=cnt++;
    }
    void dfs(int u,int fa)
    {
        w[u]=1;
        ll cnt=0;
    
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
            if(v==fa)
                continue;
            dfs(v,u);
            w[u]=w[u]+w[v];
            cnt=cnt+w[v];
            ans=ans-w[v]*(n-cnt-1);
        }
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            cnt=0;
            memset(w,0,sizeof(w));
            memset(head,-1,sizeof(head));
            for(int i=1;i<n;i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                add(a,b);
                add(b,a);
            }
            ans=n*(n-1)*(n-2)/6;
            dfs(1,0);
            printf("%lld
    ",ans);
        }
        return 0;
    View Code

    A都是变成自环  好像

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    
    using namespace std;
    
    #define ll long long
    #define MAXN 100010
    
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int x;
            int ok=0;
            for(int i=1;i<=n;i++)
                scanf("%d",&x);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&x);
                if(x==1)
                    ok=1;
            }
            while(m--)
            {
                scanf("%d",&x);
                if(x<=0)
                    printf("NO
    ");
                else
                {
                    if(ok==1)
                        printf("YES
    ");
                    else
                    {
                        if(x%2==0)
                            printf("YES
    ");
                        else
                            printf("NO
    ");
                    }
                }
            }
        }
        return 0;
    }
    View Code

    D

    2个栈维护下就OK

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    
    using namespace std;
    
    
    #define MAXN 1000010
    #define inf 1e9+7
    int l[MAXN],r[MAXN];
    int sum[MAXN];
    int dp[MAXN];
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            int ll,lr,rl,rr;
            ll=1;
            lr=0;
            rl=1;
            rr=0;
            sum[0]=0;
            dp[0]=-inf;
    
            for(int i=1;i<=n;i++)
            {
                char s[10];
                scanf("%s",s);
    
                if(s[0]=='I')
                {
                    int a;
                    scanf("%d",&a);
                    l[++lr]=a;
                    sum[lr]=sum[lr-1]+a; //维护前缀
                    dp[lr]=max(dp[lr-1],sum[lr]);
                }
                else if(s[0]=='L')
                {
                    if(lr!=0)
                    {
                        r[++rr]=l[lr];
                        lr--;
                    }
                }
                else if(s[0]=='R')
                {
                    if(rr!=0)
                    {
                        l[++lr]=r[rr];
                        rr--;
                        sum[lr]=sum[lr-1]+l[lr];
                        dp[lr]=max(dp[lr-1],sum[lr]);
                    }
                }
                else if(s[0]=='D')
                {
                    if(lr!=0)
                        lr--;
                }
                else if(s[0]=='Q')
                {
                    int a;
                    scanf("%d",&a);
                    if(a>lr)
                        a=lr;
                    printf("%d
    ",dp[a]);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    数模竞赛-长三角旅游路线
    数模培训-高压油管
    数模培训-城市表层土壤重金属污染问题
    数模练习-养孩子
    SpringBoot01
    搬家啦
    P4655 [CEOI2017]Building Bridges
    深入理解斜率优化
    暴力 K 短路的一个小细节
    搜索优化
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/7259031.html
Copyright © 2011-2022 走看看