2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290
实际得分:100+20+60+0=180
当务之急:提高一次正确率
Problem 1 双色球(ball.cpp/c/pas)
【题目描述】
机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233
“来来来,学弟,我考你道水题检验一下你的水平……”
一个栈内初始有n个红色和蓝色的小球,请你按照以下规则进行操作
- 只要栈顶的小球是红色的,将其取出,直到栈顶的球是蓝色
- 然后将栈顶的蓝球变成红色
- 最后放入若干个蓝球直到栈中的球数为n
以上3步骤为一次操作
如栈中都是红色球,则操作停止,请问几次操作后停止
chenzeyu97出完题发现他自己不能AC所以想请你帮忙
【输入格式】
第一行为一个整数n,表示栈的容量为n
第二行为一个字符串,第i个字符表示自顶向下的第i个球的颜色,R代表红色,B代表蓝色
【输出格式】
一个整数表示操作数
【样例输入】
样例1:
3
RBR
样例2:
4
RBBR
【样例输出】
样例1:2
样例2:6
【数据范围】
50%的数据,1<=n<=20
100%的数据,1<=n<=50
自栈顶往下第i个蓝色球,把它变为红色球需要的次数为2^(i-1)
#include<cstdio>
#include<iostream>
using namespace std;
long long ans;
char ch[];
int main()
{
int n;
scanf("%d",&n);
scanf("%s",ch);
long long j=;
for(int i=;i<n;i++,j*=)
if(ch[i]=='B') ans+=j;
cout<<ans;
}
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
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch[];
string f[],b[],l[],r[],u[],d[],tmp,tmp2[];
int main()
{
scanf("%s",ch+);
int len=strlen(ch+);
for(int i=;i<=;i++)
{
cin>>tmp;
f[i]=''+tmp;
}
for(int i=;i<=;i++)
{
cin>>tmp;
b[i]=''+tmp;
}
for(int i=;i<=;i++)
{
cin>>tmp;
l[i]=''+tmp;
}
for(int i=;i<=;i++)
{
cin>>tmp;
r[i]=''+tmp;
}
for(int i=;i<=;i++)
{
cin>>tmp;
u[i]=''+tmp;
}
for(int i=;i<=;i++)
{
cin>>tmp;
d[i]=''+tmp;
}
int j;
for(int i=;i<=len;i++)
{
if(ch[i]=='')
{
for(j=;j<=;j++) tmp[j]=f[j][];
for(j=;j<=;j++) f[j][]=u[j][];
for(j=;j<=;j++) u[j][]=b[j][];
for(j=;j<=;j++) b[j][]=d[j][];
for(j=;j<=;j++) d[j][]=tmp[j];
for(j=;j<=;j++) tmp2[j]=r[j];
for(int l=;l<=;l++)
for(int h=;h<=;h++)
r[h][l]=tmp2[l][-h+];
}
else if(ch[i]=='')
{
for(j=;j<=;j++) tmp[j]=f[j][];
for(j=;j<=;j++) f[j][]=d[j][];
for(j=;j<=;j++) d[j][]=b[j][];
for(j=;j<=;j++) b[j][]=u[j][];
for(j=;j<=;j++) u[j][]=tmp[j];
for(j=;j<=;j++) tmp2[j]=r[j];
for(int h=;h<=;h++)
for(int l=;l<=;l++)
r[h][l]=tmp2[-l+][h];
}
else if(ch[i]=='')
{
tmp=f[];
f[]=l[];
l[]=b[];
b[]=r[];
r[]=tmp;
for(j=;j<=;j++) tmp2[j]=u[j];
for(int h=;h<=;h++)
for(int l=;l<=;l++)
u[h][l]=tmp2[-l+][h];
}
else
{
tmp=f[];
f[]=r[];
r[]=b[];
b[]=l[];
l[]=tmp;
for(j=;j<=;j++) tmp2[j]=u[j];
for(int l=;l<=;l++)
for(int h=;h<=;h++)
u[h][l]=tmp2[l][-h+];
}
}
int k;
for(j=;j<=;j++)
{
for(k=;k<=;k++)
cout<<f[j][k];
cout<<endl;
}
for(j=;j<=;j++)
{
for(k=;k<=;k++)
cout<<b[j][k];
cout<<endl;
}
for(j=;j<=;j++)
{
for(k=;k<=;k++)
cout<<l[j][k];
cout<<endl;
}
for(j=;j<=;j++)
{
for(k=;k<=;k++)
cout<<r[j][k];
cout<<endl;
}
for(j=;j<=;j++)
{
for(k=;k<=;k++)
cout<<u[j][k];
cout<<endl;
}
for(j=;j<=;j++)
{
for(k=;k<=;k++)
cout<<d[j][k];
cout<<endl;
}
}
第二次愚蠢的错误:复制的时候没有修改
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一俩个点
60分思路:
f[i][j]表示前i个位置,最后一个位置为第j类的方案数
状态转移:如果j与k能挨在一起 f[i][j]+=+f[i-1][k]
矩阵乘法优化可以满分
系数矩阵就是题目给的01矩阵(0、1反过来)
注意,空位置视作0,0和所有的妹子都可以挨在一起
AC代码:
#include<cstdio>
#define mod 1000000007
using namespace std;
long long v[][],tmp[][],a[][];
char ch[][];
int n,m;
long long ans;
void mul(long long s1[][],long long s2[][])
{
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
for(int k=;k<=m;k++)
tmp[i][j]=(tmp[i][j]+s1[i][k]*s2[k][j])%mod;
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
s1[i][j]=tmp[i][j],tmp[i][j]=;
}
int main()
{
freopen("harem.in","r",stdin);
freopen("harem.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%s",ch[i]+);
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
if(ch[i][j]=='') v[i][j]=a[i][j]=;
for(int i=;i<=m;i++) v[][i]=v[i][]=a[i][]=a[][i]=;
n--;
for(;n;n>>=,mul(v,v))
if(n&) mul(a,v);
for(int i=;i<=m;i++) ans=(ans+a[i][])%mod;
printf("%d",ans);
}
60分代码:
#include<cstdio>
#define mod 1000000007
using namespace std;
int f[][];
bool v[][];
char ch[][];
int main()
{
freopen("harem.in","r",stdin);
freopen("harem.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%s",ch[i]+);
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
if(ch[i][j]=='') v[i][j]=;
f[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
for(int k=;k<=m;k++)
if(!v[j][k]) f[i][j]=(f[i][j]+f[i-][k])%mod;
}
int ans=;
for(int i=;i<=m;i++) ans=(ans+f[n][i])%mod;
printf("%d",ans);
}
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
【样例解释与数据范围】
法一,莫队算法:
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 200001
using namespace std;
int n,a[N],siz,sum[N],an[N],ans;
struct node
{
int l,r,bl,id;
}e[N];
inline bool cmp(node p,node q)
{
if(p.bl!=q.bl) return p.bl<q.bl;
return p.r<q.r;
}
inline void updata(int pos,int w,int g)
{
sum[a[pos]]+=w;
if(g==&&a[pos]==ans) while(sum[ans]) ans++;
if(g==&&a[pos]<ans&&!sum[a[pos]]) ans=a[pos];
}
inline int read()
{
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') { x=x*+c-''; c=getchar();}
return x;
}
void out(int x)
{
if(x/) out(x/);
putchar(x%+'');
}
int main()
{
freopen("mex.in","r",stdin);
freopen("mex.out","w",stdout);
int q;
n=read(); q=read();
siz=sqrt(n)*1.5;
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=q;i++)
{
e[i].l=read(); e[i].r=read();
e[i].bl=(e[i].l-)/siz+;
e[i].id=i;
}
sort(e+,e+q+,cmp);
int opl,opr,l=,r=;
for(int i=;i<=q;i++)
{
opl=e[i].l; opr=e[i].r;
while(opl<l) updata(--l,,);
while(opr>r) updata(++r,,);
while(opl>l) updata(l++,-,);
while(opr<r) updata(r--,-,);
an[e[i].id]=ans;
}
for(int i=;i<=q;i++)
{
out(an[i]);
puts("");
}
}
法二,主席树(用时是莫队的一半)
以权值为下标,
minn[i]=j,表示i所代表的权值为[l,r]的区间,最早出现的位置为j
例:0 2 1 0 1 3 2
对于root[7]来说,
[0,3]=1, 0最早出现在第1个位置
[1,3]=2, 2最早出现在第2个位置
查询[l,r]时,在root[r]里查询
如果左子区间的minn>=l,说明权值小的左边一半都最早出现在l以后,就往右孩子找
否则,说明权值小的左边一半有没有出现在l之后的,就往左孩子找
因为是在root[r]里,所以保证不超过右边界
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200001
using namespace std;
int n,q,tot;
int root[N],minn[N*]; int lc[N*],rc[N*];
void change(int &now,int pre,int l,int r,int pos,int val)
{
if(!now) now=++tot;
if(l==r)
{
minn[now]=val;
return;
}
int mid=l+r>>;
if(pos<=mid)
{
change(lc[now],lc[pre],l,mid,pos,val);
rc[now]=rc[pre];
}
else
{
change(rc[now],rc[pre],mid+,r,pos,val);
lc[now]=lc[pre];
}
minn[now]=min(minn[lc[now]],minn[rc[now]]);
}
int query(int now,int l,int r,int pos)
{
if(l==r) return l;
int mid=l+r>>;
if(minn[lc[now]]>=pos) return query(rc[now],mid+,r,pos);
return query(lc[now],l,mid,pos);
} int main()
{
freopen("mex.in","r",stdin);
freopen("mex.out","w",stdout);
int m;
scanf("%d%d",&n,&m);
int x;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(x>n) x=n;
change(root[i],root[i-],,n,x,i);
}
int l,r;
while(m--)
{
scanf("%d%d",&l,&r);
printf("%d\n",query(root[r],,n,l));
}
}
2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)的更多相关文章
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.4.27
2017.04.27 天气阴沉 小雨. 时间:上午 9:35 ---10:10分 地点:陆大314实验室 会议内容:每天充分利用好大课间的时间,今天对昨天的的细节问题进行了讨论及方法更正.时间不等人这 ...
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 【模拟】HHHOJ#251. 「NOIP模拟赛 伍」高精度
积累模拟经验 题目描述 维护一个二进制数,支持如下操作 "+" 该数加 11 "-" 该数减 11 "*" 该数乘 22 "\&q ...
- 【2019.7.16 NOIP模拟赛 T2】折叠(fold)(动态规划)
暴力\(DP\) 考虑暴力\(DP\),我们设\(f_{i,j}\)表示当前覆盖长度为\(i\),上一次折叠长度为\(j\)的方案数. 转移时需要再枚举这次的折叠长度\(k\)(\(k\ge j\)) ...
- 【2019.7.16 NOIP模拟赛 T1】洗牌(shuffle)(找环)
找环 考虑每次洗牌其实是一次置换的过程,而这样必然就会有循环出现. 因此我们直接通过枚举找出每一个循环,询问时只要找到环上对应的位置就可以了. 貌似比我比赛时被卡成\(30\)分的倍增简单多了? 代码 ...
- EZ 2018 03 16 NOIP2018 模拟赛(四)
链接:http://211.140.156.254:2333/contest/64 我去掉了一百多分! 这次的题目怎么说呢,特别水,但是就是出现了一些很逗的错误导致炸裂. 最好笑的是SB的不只我一个: ...
- NOIP模拟83(多校16)
前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...
随机推荐
- Thunder团队第七周 - Scrum会议1
Scrum会议1 小组名称:Thunder 项目名称:i阅app Scrum Master:杨梓瑞 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- QT中文乱码解决方法
由于我毕设的界面是用Qt做的,之前没怎么接触过Qt,所以实现过程中遇到不少小问题,头一个就是这个. 现如今宝宝将其记录下来,供同样有需要的同学或者自己以后方便查阅. 1.所有文件编码格式须一致 不统一 ...
- 周总结<2>
本打算在这周日写周总结的,但由于事情太多,还要组织团日活动,所以没时间写.不过上周主要是一些书本上的学习,但是在周日的时候完成了一款小游戏还是比较有成就感的,但是主要是因为html的考试才去做的. 代 ...
- 软工网络15团队作业4-DAY8
每日例会 昨天的工作. 张陈东芳:可导入部分类信息,继续尝试将所有信息导入: 吴敏烽:商品类的规范化编写: 周汉麟:界面的排版继续优化: 林振斌:按照浏览历史,次数等,继续优化商品类排序: 李智:研究 ...
- 软工网络15团队作业4-DAY2
每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张陈东芳:查看数据库的连接 吴敏烽:规范商品实体类 周汉麟:研究获取商品信息的方法 林振斌:研究获取商 ...
- 将oracle数据库表使用命令的形式导入到excle文件中 亲测可用!
main.sql 中的代码 set markup html on entmap ON spool on preformat off spool D:\新建文件夹\mick\tables.xls @ge ...
- 大家好,请问在DELPHI中#13和#10是表示什么含义的?
#13: 表示"回车"#10: 表示"换行" ASCII码 Delphi字符 C程序 含义------- ---------- ----- ------ ...
- 第194天:js---函数对象详解(arguments、length)
一.函数即对象 function add1(a,b){ return a+b; } //Function对象的实例 -- 高级技巧 --- 写框架必须用的... //前面表示参数,后面表示函数语句 v ...
- mvc4扩展方法
制作扩展方法,方便网页中使用,下面做了两个例子 using System; using System.Collections.Generic; using System.Linq; using Sys ...
- TCP的拥塞控制 (一)
拥塞控制不同于流量控制,拥塞控制是在拥塞发生时,发送方根据一定的反馈,主动调节自己的发送速率,以防止拥塞恶化的行为. 1. 网络拥塞 路由器是网络中的关键组件,其内部有一定量的缓冲区,用于缓存来不 ...