多校 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 inf=1e9+7;

ll z[MAXN];
ll qian[MAXN],hou[MAXN];
ll x[MAXN];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);

        for(int i=1;i<=n;i++)
             scanf("%I64d",&x[i]);
        sort(x+1,x+n+1);
        int l,r;
        l=1;
        r=n;
        qian[1]=1;
        for(int i=2;i<=n+1;i++)
        {
            if(i%2==0)
                z[i]=x[l++];
            else
                z[i]=x[r--];
        }
        hou[n+2]=1;
        for(int i=n+1;i>=2;i--)
            hou[i]=(hou[i+1]*z[i])%inf;
        for(int i=2;i<=n+1;i++)
            qian[i]=(qian[i-1]*z[i])%inf;

        ll ji=1;

        for(int i=2;i<=n+1;i++)
            ji=(ji*z[i])%inf;
        ll ans=ji;
        //printf("%d\n",z[3]);
        for(int i=3;i<=n;i++)
        {
            ans=(((ans+ji)%inf-((min(z[i-1],z[i])*qian[i-2])%inf*hou[i+1])%inf)%inf+inf)%inf;
        }
        if(n>=2)
        ans=(((ans+ji)%inf-(min(z[n+1],z[n])*qian[n-1])%inf)%inf+inf)%inf;

        printf("%I64d\n",ans);

    }
    return 0;
}

H

把U变成I  反过来思考

#include <stdio.h>
#include <math.h>
#include <algorithm>
#include<iterator>
#include<map>
#include<string.h>

typedef long long ll;

using namespace std;

#define MAXN    1000010
char s[MAXN];
int to[28];
bool vis[MAXN];

int main()
{
    int t;
    scanf("%d",&t);
    to[0]=1;
    memset(vis,0,sizeof(vis));
    vis[1]=1;
    for(int i=1;i<=27;i++)
    {
        to[i]=to[i-1]*2;
        if(to[i]>MAXN)
            break;
        vis[to[i]]=1;

        for(int j=to[i]-6;j>=0;j-=6)
        {
            if(vis[j]==1)
                break;
            vis[j]=1;
        }
    }
   // printf("%d\n",vis[10]);
    while(t--)
    {
        scanf("%s",s);
        int len=strlen(s);
        int ok=0;
        if(s[0]!=‘M‘)
            ok=1;
        int cnt=0;

        for(int i=1;i<len;i++)
        {
            if(s[i]==‘U‘)
                cnt=cnt+3;
            else if(s[i]==‘I‘)
                cnt++;
            else
                ok=1;
        }
        if(vis[cnt]==0)
            ok=1;
        if(ok==1)
            printf("No\n");
        else
            printf("Yes\n");

    }
    return 0;
}

K

深搜

#include<stdio.h>
#include<algorithm>
#include<string.h>

using namespace std;

#define MAXN 2010
int z[MAXN],s[MAXN],s1[MAXN],s2[MAXN];
int ans[MAXN];
int s3[MAXN];

int ok,n;

void dfs(int a,int b,int ind)
{
    if(ind>n||a>n/2||b>n/2)
        return ;
    if(a==b&&a==n/2)
    {
        int ind1,ind2;
        for(int i=1;i<=n;i++)
        {
            if(ans[i]==0)
            {
                ind1=i;
                break;
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(ans[i]==1)
            {
                ind2=i;
                break;
            }
        }
        int ok1=0,i,j;
        i=ind1;
        j=ind2;
        while(i<=n&&j<=n)
        {
            if(z[i]!=z[j])
            {
                ok1=1;
                break;
            }
            i++;
            j++;
            while(ans[i]!=0)
                i++;
            while(ans[j]!=1)
                j++;
        }
        if(ok1==0)
        {
            ok=1;
        }

        return ;
    }
    if(ok==1)
        return ;
    if(s1[z[ind+1]]+1<=s[z[ind+1]]/2)
    {
        ans[ind+1]=0;
        s1[z[ind+1]]++;
        s3[a]=z[ind+1];
        dfs(a+1,b,ind+1);
        s1[z[ind+1]]--;
    }
    if(ok==1)
        return ;
    if(s2[z[ind+1]]+1<=s[z[ind+1]]/2)
    {
        if(s3[b]==z[ind+1])
        {
             ans[ind+1]=1;
            s2[z[ind+1]]++;
            dfs(a,b+1,ind+1);
            s2[z[ind+1]]--;
        }
    }
    if(ok==1)
        return;

}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        memset(s,0,sizeof(s));
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&z[i]);
            s[z[i]]++;
        }
        ok=0;
        dfs(0,0,0);
       // printf("%d\n",ok);
        for(int i=1;i<=n;i++)
            printf("%d",ans[i]);
        printf("\n");
    }
    return 0;
}

J

t组样例

n

然后n个平面   n个平面上的点

A B 可以在2个点上连线  每个点只能用一次  而且线不能交叉

sg

0 1   2  3  4

0  0  1  1

四个点可以到达的状态   (2) 或者  (1)  ^ (1)  然后打表找规律

#include<stdio.h>
#include<algorithm>
#include<string.h>

using namespace std;

#define MAXN 2010

int sg[301]={0,0,1,1};
bool vis[310];

int main()
{
    for(int i=4;i<=300;i++)
    {
        memset(vis,0,sizeof(vis));
        for(int j=0;j<i-1;j++)
        {
            vis[sg[j]^sg[i-2-j]]=1;
        }
        for(int j=0;j<=300;j++)
        {
            if(vis[j]==0)
            {
                sg[i]=j;
                break;
            }
        }
    }

    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        int ans=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            if(a<=52)
                ans=ans^sg[a];
            else
            {
                a=(a-53)%34+53;
                 ans=ans^sg[a];
            }
        }
        if(ans==0)
            printf("Dave\n");
        else
            printf("Carol\n");
    }
    return 0;
}

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

多校 2013 6的相关文章

多校 2013 3

B hash 把字符串看成数字插进去 #include<stdio.h> #include<string.h> using namespace std; #define SEED 13331 #define MAXN 2007 #define HASH 10007 int head[HASH]; int cnt; struct node { int id,next; unsigned long long v; }edge[MAXN]; char str[MAXN]; unsigne

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

多校 2013 8

F 给你ABC三个串 让你求D串 D是AB的子序列 C是D的子串 求D的长度 求出C在AB中出现的位子记录开始位子和结束位子 n^2 枚举在A中位子和在B中位子 然后得到AB 开始位子之前的lcs 和AB结束位子的lcs 开始预处理一下lcs #include <iostream> #include <cstdio> #include <cmath> #include <map> #include <algorithm> #include <

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

hdu 4603 Color the Tree 2013多校1-4

这道题细节真的很多 首先可以想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占领和这个点邻接的边 所以,解决这道题的步骤如下: 预处理阶段: step 1:取任意一个点为根节点,找出父子关系并且对这个树进行dp,求出从某个节点出发往下所包含的所有边的权值总和  复杂度O(n) step 2:从tree dp 的结果中计算对于某个节点,从某条边出发所包含的边的综合,并且对其从大到小进行排序 复杂度O(n*logn) step 3:dfs求出这颗树的欧拉回路,以及每个点的

hdu 4601 Letter Tree 2013多校1-2

不容易啊..一个小错误让我wa死了,找了一个晚上,怎么都找不到 最后是对拍代码找到的错误,发现当步数比较小的时候答案就是对的,比较大的时候就不对了 想到一定是什么地方越界了... power[i] = (i64)(power[i - 1] * 26) % mod; 就是这行... 改成  power[i] = ((i64)power[i - 1] * 26) % mod; 就过了... 这道题总的来说就是非常综合,什么方面都涉及一点,核心部分还是把树转化成序列之后二分边界+RMQ,用dfn来确定

蒟蒻ACMer回忆录 &#183; 一段弱校ACM的奋斗史

三年半的ACM生涯终于迎来了终点,退役之时,感慨万分,故写此文以纪念逝去的时光,那些为ACM拼搏的日子,那段弱校ACM的奋斗史. 三年半的ACM生涯,窝见证了CUMT从打铁到铜牌的突破,又见证了从铜牌到银牌的突破:见证了集训队员从3人发展到10余人,又见证了ACM实验室的落实. 三年半的ACM生涯,窝经历了太多,有Accepted时的欢笑,有Wrong Answer时的沮丧,有Time Limit Exceeded时的无奈,有Runtime Error时的尴尬,有打铁的失落,有拿牌的惊喜. 13

Word 2013安裝字典

不必從內建的字典中開始,Word 2013 可將您連結到 Office 市集,方便您挑選免費的字典,或從包括多語字典的字典集合中購買. 若要選擇並安裝您想要的字典,請以滑鼠右鍵按一下任何單字,並按一下 [定義]. 或者,按一下 [校閱] > [定義]. 如果系統提示您登入則請登入,並查看字典清單中的選項,然後按一下 [下載] 以安裝您想要的字典. 下載完成後,字典會自動在 Word 中開啟.此後,每次按一下 [定義] 時就會開啟字典. 提示: 如果您要尋找相似詞,請以滑鼠右鍵按一下文件中的任何單

ActiveReports 9实战教程(1): 手把手搭建好开发环境Visual Studio 2013 社区版

ActiveReports9刚刚公布3天.微软就公布了 Visual Studio Community 2013 开发环境. Visual Studio Community 2013 提供完整功能的 IDE ,可开发 Windows.Android 和 iOS 应用.支持:C++, Python, HTML5, JavaScript, 和 C#,VB, F# 语言的开发.提供设计器.编辑器.调试器和诊断工具. 最牛逼的在于你全然能够免费使用该工具: 能够正大光明的免费使用visual studi