5.28 模拟赛

二次联通门 : 怎么会有。。。

T1 打表找规律

T2 模拟

T3 矩阵快速幂

T4 mmp

T1 

Problem 1 双色球(ball.cpp/c/pas)

【题目描述】

机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233

“来来来,学弟,我考你道水题检验一下你的水平……”

一个栈内初始有n个红色和蓝色的小球,请你按照以下规则进行操作

  1. 只要栈顶的小球是红色的,将其取出,直到栈顶的球是蓝色
  2. 然后将栈顶的蓝球变成红色
  3. 最后放入若干个蓝球直到栈中的球数为n

以上3步骤为一次操作

如栈中都是红色球,则操作停止,请问几次操作后停止

chenzeyu97出完题发现他自己不能AC所以想请你帮忙

【输入格式】

第一行为一个整数n,表示栈的容量为n

第二行为一个字符串,第i个字符表示自顶向下的第i个球的颜色,R代表红色,B代表蓝色

【输出格式】

一个整数表示操作数

【样例输入】

样例1:

3

RBR

样例2:

4

RBBR

【样例输出】

样例1:2

样例2:6

【样例解释】

样例1:

样例2:

【数据范围】

50%的数据,1<=n<=20

100%的数据,1<=n<=50

/*
    T1

    可以发现 

    把所有蓝球的深度i
    变为2 ^ (i - 1)后累加即为答案
*/
#include <cstdio>
#include <cmath>

#define Max 300

void read (int &now)
{
    now = 0;
    register char word = getchar ();
    while (word < ‘0‘ || word > ‘9‘)
        word = getchar ();
    while (word >= ‘0‘ && word <= ‘9‘)
    {
        now = now * 10 + word - ‘0‘;
        word = getchar ();
    }
}

char line[Max];
int N;

int main (int argc, char *argv[])
{
    freopen ("ball.in","r",stdin);
    freopen ("ball.out","w",stdout);
    read (N);
    long long Answer = 0;
    scanf("%s", line);
    for (int i = 0; i < N; i++)
        if (line[i] == ‘B‘)
            Answer += pow (2, N - i - 1);
    printf ("%lld\n", Answer);
    return 0;
}

 T2

Problem 2 魔方(cube.cpp/c/pas)

【题目描述】

ccy(ndsf)觉得手动复原魔方太慢了,所以他要借助计算机。

ccy(ndsf)家的魔方都是3*3*3的三阶魔方,大家应该都见过。

3的“顺时针”改为“逆时针”,即3 4以图为准。)

ccy(ndfs)从网上搜了一篇攻略,并找人翻译成了他自己会做的方法。现在告诉你他的魔方情况,以及他从网上搜到的攻略,请你求出最后魔方变成什么样子。

【输入格式】

   第一行,一串数字,表示从网上搜到的攻略。

   下面6*3行,每行3个数字,每三行表示魔方一个面的情况,六个面的顺序是前、后、左、右、上、下。

【输出格式】

   6*3行,表示处理后的魔方,形式同输入。

【样例输入】

23

121

221

111

123

321

111

123

321

132

132

231

132

121

112

233

332

111

333

【样例输出】

123

222

113

212

321

113

122

321

132

121

333

121

211

312

113

331

111

331

【样例解释】

【数据范围】

40%的数据,攻略的长度小于5且仅有4种操作的其中一种

100%的数据,攻略的长度小于100

/*
    T2
    自己在纸上画画就明白了。。 

*/
#include <cstring>
#include <cstdio>

#define Max 30

void read (int &now)
{
    now = 0;
    register char word = getchar ();
    while (word < ‘0‘ || word > ‘9‘)
        word = getchar ();
    while (word >= ‘0‘ && word <= ‘9‘)
    {
        now = now * 10 + word - ‘0‘;
        word = getchar ();
    }
}

class Mofa_Type
{
    private :

        int map[Max][Max][Max];

        int now[Max][Max][Max];

        inline void Update ()
        {
            for (int i = 1; i <= 6; i++)
                for (int j = 1; j <= 3; j++)
                    for (int k = 1; k <= 3; k++)
                    {
                        if (now[i][j][k])
                            map[i][j][k] = now[i][j][k];
                    }
            memset (now, 0, sizeof now);
        }

    public :

        void Rotate_1 ()
        {
            for (int i = 1; i <= 3; i++)
            {
                now[1][i][3] = map[6][i][3];
                now[6][i][3] = map[2][i][3];
                now[2][i][3] = map[5][i][3];
                now[5][i][3] = map[1][i][3];
            }
            for (int i = 1; i <= 3; i++)
                for (int j = 1; j <= 3; j++)
                    now[4][j][4 - i] = map[4][i][j];
            Update ();
        }

        void Rotate_2 ()
        {
            for (int i = 1; i <= 3; i++)
            {
                now[1][i][3] = map[5][i][3];
                now[5][i][3] = map[2][i][3];
                now[2][i][3] = map[6][i][3];
                now[6][i][3] = map[1][i][3];
            }
            for (int i = 1; i <= 3; i++)
                for (int j = 1; j <= 3; j++)
                    now[4][4 - j][i] = map[4][i][j];
            Update ();
        }

        void Rotate_3 ()
        {
            for (int i = 1; i <= 3; i++)
            {
                now[1][1][i] = map[3][1][i];
                now[3][1][i] = map[2][1][i];
                now[2][1][i] = map[4][1][i];
                now[4][1][i] = map[1][1][i];
            }
            for (int i = 1; i <= 3; i++)
                for (int j = 1; j <= 3; j++)
                    now[5][j][4 - i] = map[5][i][j];
            Update ();
        }

        void Rotate_4 ()
        {
            for (int i = 1; i <= 3; i++)
            {
                now[1][1][i] = map[4][1][i];
                now[4][1][i] = map[2][1][i];
                now[2][1][i] = map[3][1][i];
                now[3][1][i] = map[1][1][i];
            }
            for (int i = 1; i <= 3; i++)
                for (int j = 1; j <= 3; j++)
                    now[5][4 - j][i] = map[5][i][j];
            Update ();
        }

        void Key_In_Date (int i, int j, int k, int now)
        {
            map[i][j][k] = now;
        }

        void Print ()
        {
            for (int i = 1; i <= 6; i++)
                for (int j = 1; j <= 3; j++)
                {
                    for (int k = 1; k <= 3; k++)
                        printf ("%d", map[i][j][k]);
                    putchar (‘\n‘);
                }
        }
};

Mofa_Type Flandre;

char make[Max];

int main (int argc, char *argv[])
{
    freopen ("cube.in", "r", stdin);
    freopen ("cube.out", "w", stdout);
    scanf ("%s", make);
    char line[5];
    for (int i = 1; i <= 6; i++)
        for (int j = 1; j <= 3; j++)
        {
            scanf ("%s", line);
            for (int k = 0; k < 3; k++)
                Flandre.Key_In_Date (i, j, k + 1, line[k] - ‘0‘);
        }
    int N = strlen (make);
    for (int i = 0; i < N; i++)
    {
        if (make[i] == ‘1‘)
            Flandre.Rotate_1 ();
        else if (make[i] == ‘2‘)
            Flandre.Rotate_2 ();
        else if (make[i] == ‘3‘)
            Flandre.Rotate_3 ();
        else if (make[i] == ‘4‘)
            Flandre.Rotate_4 ();
    }
    Flandre.Print ();
    return 0;
}

T3

Problem 3 czy的后宫(harem.cpp/c/pas)

【题目描述】

czy要妥善安排他的后宫,他想在机房摆一群妹子,一共有n个位置排成一排,每个位置可以摆妹子也可以不摆妹子。有些类型妹子如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了。假定每种妹子数量无限,求摆妹子的方案数。

【输入格式】

输入有m+1行,第一行有两个用空格隔开的正整数n、m,m表示妹子的种类数。接下来的m行,每行有m个字符1或0,若第i行第j列为1,则表示第i种妹子第j种妹子不能排在相邻的位置,输入保证对称。(提示:同一种妹子可能不能排在相邻位置)。

【输出格式】

输出只有一个整数,为方案数(这个数字可能很大,请输出方案数除以1000000007的余数。

【样例输入】

2 2

01

10

【样例输出】

7

【样例说明】

七种方案为(空,空)、(空,1)、(1、空)、(2、空)、(空、2)、(1,1)、(2,2)。

【数据范围】

20%的数据,1<n≤5,0<m≤10。

60%的数据,1<n≤200,0<m≤100。

100%的数据,1<n≤1000000000,0<m≤100。

注:此题时限1.5s是因为本评测机跑太慢,大家正常做

但写的太丑可能T一俩个点

/*
    T3

    原方程为
    if (map[j][k])
        dp[i][j] = (dp[i][j] + dp[i - 1][k]) % Mod
    其中 dp[i][j] 表示的是第i个位置放j号妹子的方案数 

    然后就是由上一个位置放第k个妹子的方案数转移而来

    然后变成矩阵的形式就行了
    此题的矩阵还是很好推的

    但是却超时三个点。。。 

*/
#include <cstring>
#include <cstdio>

#define Max 300

void read (long long &now)
{
    now = 0;
    register char word = getchar ();
    while (word < ‘0‘ || word > ‘9‘)
        word = getchar ();
    while (word >= ‘0‘ && word <= ‘9‘)
    {
        now = now * 10 + word - ‘0‘;
        word = getchar ();
    }
}

long long M, N;

#define Mod 1000000007

long long Answer = 0;
char line[Max];

class Martix_Type
{
    private :

        struct Martix_Date
        {
            long long martix[Max][Max];

            Martix_Date operator * (const Martix_Date &a) const
            {
                Martix_Date now;
                for (long long i = 0; i <= M; i++)
                    for (long long j = 0; j <= M; j++)
                    {
                        now.martix[i][j] = 0;
                        for (long long k = 0; k <= M; k++)
                            now.martix[i][j] = (now.martix[i][j] + martix[i][k] * a.martix[k][j]) % Mod;
                    }
                return now;
            }
        };

        Martix_Date Result, A;

    public :

        void Make_Answer ()
        {
            for (int i = 0; i <= M; i++)
                for (int j = 0; j <= M; j++)
                {
                    A.martix[i][0] = 1;
                    A.martix[0][i] = 1;
                    Result.martix[0][i] = 1;
                    Result.martix[i][0] = 1;
                }
            Fast_Pow (N - 1);
            for (int i = 0; i <= M; i++)
                Answer = (Answer + Result.martix[i][0]) % Mod;
        }

        void Fast_Pow (long long p)
        {
            while (p)
            {
                if (p & 1)
                    Result = A * Result;
                A = A * A;
                p >>= 1;
            }
        }

        void Prepare ()
        {
            for (int i = 1; i <= M; i++)
            {
                scanf ("%s", line + 1);
                for (int j = 1; j <= M; j++)
                    if (line[j] == ‘0‘)
                    {
                        Result.martix[i][j] = 1;
                        A.martix[i][j] = 1;
                    }
            }
        }
};

Martix_Type Make;

int main (int argc, char *argv[])
{
    freopen ("harem.in", "r", stdin);
    freopen ("harem.out", "w", stdout);
    read (N);
    read (M);
    Make.Prepare ();
    Make.Make_Answer ();
    printf ("%lld", Answer);
    return 0;
}

Problem 4 mex(mex.cpp/c/pas)

【题目描述】

【输入格式】

【输出格式】

【样例输入】

7 5

0 2 1 0 1 3 2

1 3

2 3

1 4

3 6

2 7

【样例输出】

3

0

3

2

4

【样例解释与数据范围】

/*
    T4

    不会做。。。
    老早就听别人说是莫队。。
    可是不会莫队 

    就用堆+一堆特判
    想骗点分。。
    结果第一个点WA
    其余点TLE

*/
#include <cstdio>
#include <vector>
#include <queue>

#define Max 1000001

void read (int &now)
{
    now = 0;
    register char word = getchar ();
    while (word < ‘0‘ || word > ‘9‘)
        word = getchar ();
    while (word >= ‘0‘ && word <= ‘9‘)
    {
        now = now * 10 + word - ‘0‘;
        word = getchar ();
    }
}

inline int min (int a, int b)
{
    return a < b ? a : b;
}

inline int max (int a, int b)
{
    return a > b ? a : b;
}

int N, M;

int number[Max];

int main (int argc, char *argv[])
{
    freopen ("mex.in", "r", stdin);
    freopen ("mex.out", "w", stdout);
    read (N);
    read (M);
    for (int i = 1; i <= N; i++)
        read (number[i]);
    int x, y;
    int Count = 0;
    while (M--)
    {
        bool flag = false;
        read (x);
        read (y);
        std :: priority_queue <int, std :: vector<int>, std :: greater<int> > Heap;
        for (int i = x; i <= y; i++)
            Heap.push (number[i]);
        if (Heap.top () >= 1)
        {
            printf ("%d\n", Heap.top () - 1);
            continue;
        }
        int now;
        while (!Heap.empty ())
        {
            now = Heap.top ();
            Heap.pop ();
            if (now + 1 != Heap.top () && now != Heap.top ())
            {
                printf ("%d\n", now + 1);
                flag = true;
                break;
            }
        }
        if (flag == false)
            printf ("%d\n", now + 1);
    }
    return 0;
}
时间: 2024-11-04 23:00:50

5.28 模拟赛的相关文章

2014.10.28模拟赛【时间与空间之旅】

Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一.当然,要成为一名出色的船长,必须通过严格的考核,例如下面是最简单的问题中的一个. 用1~n的整数给n个星系标号,目前你在标号为1的星系,你需要送快递到标号为n的星系,星系之间由于存在陨石带,并不是都可以直连的.同时,由于超时空隧道的存在,在某些星系间飞行会出现时间静止甚至

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

bzoj2741: 【FOTILE模拟赛】L

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2679  Solved: 766[Submit][Status][Discuss] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一

140725模拟赛总结

A:hdu4847    字符串匹配第一想法是KMP,写了好长时间结果还TLE了-_-||,实际上用个简单的枚举判断就能解决.因为待验证的字符串"doge"很小.写A题的时候还被输入卡了半天.Tips1:输入至文件结尾(eof)的常用方法:     while (cin>>a)        //最常用的     while (cin.getline(s,30))    //按行读入前30个字符.空格也读入    getline(cin,s)        //和getli

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

2017.11.25【NOIP提高组】模拟赛A组

2017.11.25[NOIP提高组]模拟赛A组 T1 3467. [NOIP2013模拟联考7]最长上升子序列(lis) T2 3468. [NOIP2013模拟联考7]OSU!(osu) T3 3472. [NOIP2013模拟联考8]匹配(match) T1 有转移方程f[i]=max{f[j]}+1,a[j]<a[i] 可以用线段树+离散化维护这个方程,因为涉及以往状态可以用主席树维护 打太丑爆空间了 Code 1 #include<cstdio> 2 #include<c