1. 程式人生 > >多校 2013 10

多校 2013 10

inf urn cnblogs int stdio.h 降冪 truct close string

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

多校 2013 10