10.27 noip模拟试题(afternoon)(跪在游戏玩少了2333)

【问题描述】

祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。

开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记录的功能,而回放功能的实现则委托你来完成。

游戏过程的记录中,首先是轨道上初始的珠子序列,然后是玩家接下来所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。

【输入格式】

第一行是一个由大写字母‘A‘~‘Z‘组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。

第二行是一个数字?,表示整个回放过程共有?次操作。

接下来的?行依次对应于各次操作。每次操作由一个数字?和一个大写字母?描述,以空格分隔。其中,?为新珠子的颜色。若插入前共有?颗珠子,则? ∈ [0,?] 表示新珠子嵌入之后(尚未发生消除之前)在轨道上的位序。

【输出格式】

输出共?行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上

第 2 页 共 6 页

P74

的珠子序列。

如果轨道上已没有珠子,则以“-”表示。

【样例输入】

ACCBA 5

1 B

0 A

2 B

4 C

0 A

【样例输出】

ABCCBA

AABCCBA

AABBCCBA

-

A

【样例解释】

你以为山里又有座庙?

游戏玩少了23333 规则想错了

wa成sb2333 错的就不粘了 巨丑2333

代码没写完2333

【问题描述】

栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序。例如,借助一个栈,依次将数组 1,3,2 按顺序入栈或出栈,可对其从大到小排序:

1 入栈;3 入栈;3 出栈;2 入栈;2 出栈;1 出栈。

在上面这个例子中,出栈序列是 3,2,1,因此实现了对数组的排序。

遗憾的是,有些时候,仅仅借助一个栈,不能实现对数组的完全排序。例如给定数组 2,1,3,借助一个栈,能获得的字典序最大的出栈序列是 3,1,2:

2 入栈;1 入栈;3 入栈;3 出栈;1 出栈;2 出栈。

请你借助一个栈,对一个给定的数组按照出栈顺序进行从大到小排序。当无法完全排序时,请输出字典序最大的出栈序列。

【输入格式】

输入共2行。

第一行包含一个整数?,表示入栈序列长度。

第二行包含?个整数,表示入栈序列。输入数据保证给定的序列是1到 n 的全排列,即不会出现重复数字。

【输出格式】

仅一行,共?个整数,表示你计算出的出栈序列。

【样例输入】

3

2 1 3

【样例输出】

3 1 2

【样例解释】

这回山里有座塔。

【数据规模与约定】

简单贪心 闲的写了ST表后缀就好了23333

#include<cstdio>
#define maxn 2000010
using namespace std;
int n,a[maxn],s[maxn],top,now,f[maxn][25],P[maxn];
int init(){
    int x=0,f=1;char s=getchar();
    while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();}
    while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
    return x*f;
}
int max(int x,int y){
    return x>y?x:y;
}
void Get(){
    for(int i=1;i<=n;i++)f[i][0]=a[i];
    for(int j=1;j<=20;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=20;j++)
            if((1<<j)>i){
                P[i]=j-1;break;
            }
}
int Query(int l,int r){
    int k=P[r-l+1];
    return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main()
{
    freopen("haha.in","r",stdin);
    freopen("haha.out","w",stdout);
    n=init();
    for(int i=1;i<=n;i++)
        a[i]=init();
    now=n;Get();
    for(int i=1;i<=n;i++){
        s[++top]=a[i];
        while(s[top]==now&&top){
            printf("%d ",s[top]);
            top--;now--;
        }
        while(1){
            int mx=Query(i+1,n);
            if(mx<s[top]){
                printf("%d ",s[top]);top--;
            }
            else break;
        }
    }
    while(top){
        printf("%d ",s[top]);top--;
    }
    return 0;
}

【问题描述】

小 Q 对计算几何有着浓厚的兴趣。他经常对着平面直角坐标系发呆,思考一些有趣的问题。今天,他想到了一个十分有意思的题目:

首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点。随后,他将?轴的点与?轴的点一一连接,形成?条线段,并保证任意两条线段不相交。小 Q 确定这种连接方式有且仅有一种。最后,小 Q 会给出?个询问。对于每个询问,将会

给定一个点?(?? ,??),请回答线段 OP 与?条线段会产生多少个交点?

小 Q 找到了正在钻研数据结构的你,希望你可以帮他解决这道难题。

【输入格式】

第1行包含一个正整数?,表示线段的数量;第2行包含?个正整数,表示小 Q 在?轴选取的点的横坐标;

第3行包含?个正整数,表示小 Q 在?轴选取的点的纵坐标;第 4 行包含一个正整数?,表示询问数量;

随后?行,每行包含两个正整数?? ,??,表示询问中给定的点的横、纵坐标。

【输出格式】

共?行,每行包含一个非负整数,表示你对这条询问给出的答案。

【样例输入】

3

4 5 3

3 5 4

2

1 1

3 3

【样例输出】

0

3

【样例解释】

然后塔里啥都没有。

裸二分+数学只是判断

#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1e9
#define maxn 200010
using namespace std;
int n,m,a[maxn],b[maxn];
struct node{
    int x,y;
}p[maxn];
int init(){
    int x=0,f=1;char s=getchar();
    while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();}
    while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
    return x*f;
}
bool Judge(int i,int x,int y){
    double Y=(double)p[i].y-(double)x*(double)p[i].y/(double)p[i].x;
    return Y<=y;
}
int main()
{
    freopen("hahaha.in","r",stdin);
    freopen("hahaha.out","w",stdout);
    n=init();
    for(int i=1;i<=n;i++)
        a[i]=init();
    for(int i=1;i<=n;i++)
        b[i]=init();
    sort(a+1,a+1+n);sort(b+1,b+1+n);
    for(int i=1;i<=n;i++){
        p[i].x=a[i];p[i].y=b[i];
    }
    n++;p[n].x=inf;p[n].y=inf;
    m=init();int x,y;
    while(m--){
        x=init();y=init();
        int l=0,r=n,pos=0;
        while(l<=r){
            int mid=l+r>>1;
            if(Judge(mid,x,y)){
                l=mid+1;pos=max(pos,mid);
            }
            else r=mid-1;
        }
        printf("%d\n",pos);
    }
    return 0;
}

时间: 2024-10-19 21:00:45

10.27 noip模拟试题(afternoon)(跪在游戏玩少了2333)的相关文章

10.27 noip模拟试题(moring)

WPS转word太丑了 凑合看喽 第二题 [题目描述] 给你两个日期,问这两个日期差了多少毫秒. [输入格式] 两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss ”这种形式.第二个日期时间一定比第一个日期时间要大两个日期的年份一定都是 21 世纪的年份. [输出格式] 一行一个整数代表毫秒数. [样例输入 1] 2000-01-01 00:00:00 2000-01-01 00:00:01 [样例输出 1] 1000 [样例输入 2] 0 1 2 3 4 5 6 7 8

10.7 noip模拟试题

楼[问题背景]zhx 为他的妹子造了一幢摩天楼.[问题描述]zhx 有一幢摩天楼. 摩天楼上面有 M 个观光电梯,每个观光电梯被两个整数???? " ,???? " 描述.每个电梯只有两个按钮, (针对第 i 个电梯)两个按钮分别可以使电梯向上???? " 层向下???? " 层.摩天楼的高度是无限的,但是电梯不可以钻入地下,也就是说是有下限的.每层楼用整数标记, 以 0 作为地面这一层的标记.zhx 去陪他妹子了,留你一个人在摩天楼的 0 层,现在你想知道,仅可以

10.23 noip模拟试题

尼玛蛋pdf好难粘 直接写了 T1 /*开始写wa了 我真弱2333 关于p的排序规则不只是差值 为了字典序最小 还要拍别的*/ #include<cstdio> #include<algorithm> #define maxn 100010 #define inf 1e7 #define mem(a,b) for(int i=0;i<=n;i++)a[i]=b[i]; using namespace std; int n,m,ans=inf,k; char s[maxn],

10.4 noip模拟试题

题目名称 PA 青春 三部曲 名称 huakai taritari truetears 输入 huakai.in taritari.in truetears.in 输出 huakai.out taritari.out truetears.out 每个测试点时限 1秒 1秒 1秒 内存限制 512MB 512MB 512MB 测试点数目 10 10 10 每个测试点分值 10 10 10 是否有部分分 无 无 无 题目类型 传统 传统 传统 注意事项(请务必仔细阅读): PA [题目描述] 汉诺塔

10.3 noip模拟试题

希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“前进栈”,从“后退栈”中取出栈顶页面,并设置为当前页面.FORWARD: 如果“前进栈”为空则忽略此命令.否则将当前两面压入“后退栈”,从“前进栈”中取出栈顶页面,并设置为当前页面.VISIT: 将当前页面压入“后退栈”. 并将当前页面置为指定页面, 并将“前进栈”置空.QUIT: 退出.假设此浏览

10.5 noip模拟试题

2bc*cosA=b^2+c^2-a^2 数学题QAQ 开始π精度不够40分 怪我喽~ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const double pi=3.14159265358979323846264; int T; double a,c,b,d,r1,r2,C,x,y,P,s; double Abs(dou

10.8 noip模拟试题

  1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. [输入格式] 一行3个整数n,m,p,意义如题所述. [输出格式] 一个整数,表示买花的方案数. [输入输出样例1] flower.in flower.out 4 2 5 1 见选手目录下的flower / flower1.in与flower /

9.27 noip模拟试题

工资 (money/money.in/money.out) 时限1000ms 内存256MB 聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权!(因为聪哥是土豪,他是老板的老板) 聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间,使他一次性拿的钱中最大的最小.(最后一天一定要领钱) 输入 第一行 2个数 n,m 接下来n行,每行一个数,代表Vi. 输出 最小的

2016.10.29 NOIP模拟赛 PM 考试整理

300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题真的是跪在游戏玩少了. 我忽视了游戏中的两个常识:1.开始的序列是无法消除的(这与题目描述明显不符啊),即使有很多可以连消的,而我的程序每次只在插入的位置向两侧寻找可以消除的,自然就错了. 2.开始时的序列居然可以为空,真是让人措手不及! 正确做法:用指针链表,而且不可以用数组模拟.