多校 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\n",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\n",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\n");
            else
            {
                if(ok==1)
                    printf("YES\n");
                else
                {
                    if(x%2==0)
                        printf("YES\n");
                    else
                        printf("NO\n");
                }
            }
        }
    }
    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\n",dp[a]);
            }
        }
    }
    return 0;
}
View Code

 

posted on 2017-07-30 14:06  HelloWorld!--By-MJY  阅读(124)  评论(0编辑  收藏  举报

导航