多校 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;
}

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;

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;
}

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;
}

时间: 2024-12-18 05:18:05

多校 2013 10的相关文章

弱校连萌 10.5

A.As Easy As Possible B.Be Friends C.Coprime Heaven D.Drawing Hell E.Easiest Game F.Fibonacci of Fibonacci G.Global Warming H.Hash Collision I.Increasing or Decreasing 询问[l,r] 区间 数位单调的数的个数 dp[pos][pre][zero] 然后 搜三次,搜单增的,单减的,不变的 1 #include <cstdio> 2

HDU 5867 Water problem (2016 多校训练#10 1011)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5867 题意:给一个不超过一千的数字N,求出1-N所有单词加起来的字母个数和(f(1)=len(one)=3,f(2)=f(1)+len(two)=6...). 分析:一看名字就知道是到水题了...直接打表.(保险起见,我还手打了20内的表). 代码: #include<cstdio> #include<cmath> #include<cstring> #incl

弱校联盟10.7 I. Special Squares(二维前缀和)

题目链接: I. Special Squares There are some points and lines parellel to x-axis or y-axis on the plane. If arbitrary chosen two lines parallel to x-axis and two lines parallel to y-axis, one rectangle, or sometimes a square, will be formed. If a square i

2017多校第10场 HDU 6178 Monkeys 贪心,或者DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只猴子必有一只另外的猴子通过一条边与它相连,问最少用多少条边能达到这个要求. 解法:利用贪心的思维,显然我们应该先选择性价比最高的,即一条边连接两个点的情况.计算出这样的边的条数ans,如果ans*2>=k,结果就是(k+1)/2,否则剩下来没有安排的猴子每一只需要多一条边,即结果为ans+k-2 *

[Tizen新闻]2013.10.12-三星放缓Tizen操作系统开发的脚步

三星决定放慢Tizen平台开发的脚步.Tizen是一个基于Linux的开源移动操作系统,由三星与Intel携手打造.台湾媒体DigiTimes认为,这很有可能与Android的广泛流行有关--在全球智能机市场中,Android几乎占据了80%的份额--三星的整个移动产品线都与Google的这个平台相结合.因此,在这样一个充满竞争的市场中做出调整,对三星而言--特别是考虑到它在Google移动操作系统中所押上的赌注--拥有极其巨大的风险,. 这一转变仍将发生,但或许会比预期来得稍微晚一些.三星的业

多校 2013 1

HDU 4602 C 求n 的分解方式 k 出现了几次 先把 n 分解成 n个1   然后考虑  1        k 在边上  2*2^(n-k-1) 2        k 在中间  左边 t1 右边t2  个1  那么就是 2^(t1-1)*2^(t2-1)*(n-k-1) 加起来就是  有些特殊的判断下 #include <iostream> #include <cstdio> #include <cmath> #include <map> #incl

弱校联盟10.3

Problem A. Best Matched Pair 找出最大的每一位递增1的一对乘积,$n^2$枚举 #include<bits/stdc++.h> using namespace std; int n,a[2000],ans=-1; bool ck(int a){ int b=-1; while(a){ int t=a%10;//23456 a/=10; if(b!=-1&&t!=b-1)return 0; b=t; } return 1; } int main(){

多校 2013 6

A n 然后n个数字 要求组合成的段数最大 低高 低高 ... (a *b -a) *(s/(ab)) #include<stdio.h> #include<string.h> #include<algorithm> #include<deque> #include<set> #include<map> using namespace std; #define ll __int64 #define MAXN 1000010 ll in

弱校连萌 10.2

A.Nearest Neighbor Search B.Odd Discount C.Eight Queens D.Longest Common Subsequence E.Coins F.Floyd-Warshall G.Road History H.Around the World I.Longest Increasing Subsequence J.Matrix Transformation