题目名称

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

【题目描述】

汉诺塔升级了:现在我们有个圆盘和个柱子,每个圆盘大小都不一样,大的圆盘不能放在小的圆盘上面,个柱子从左到右排成一排。每次你可以将一个柱子上的最上面的圆盘移动到右边或者左边的柱子上(如果移动之后是合法的话)。现在告诉你初始时的状态,你希望用最少的步数将第大的盘子移动到第根柱子上,问最小步数。

【输入格式】

第一行一个正整数,代表询问的组数。

接下来组数据,每组数据第一行一个整数。

接下来一行每行个正整数,代表每个柱子上圆盘的大小。

【输出格式】

输出共行,代表每次的答案。如果方案不存在,输出“”。

【样例输入】

4

3

2 1 3

2

7 8

2

10000 1000

3

97 96 95

【样例输出】

4

0

-1

20

【样例解释】

无。

暴力map(状态不好)60

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int T,n,B[],tail,head=,flag;
string c,cc;
struct P{
int x,o;
}A[];
struct node{
int a[][];
}q[];
map<string,int>f,s;
int cmp(const P &a,const P &b){
return a.x<b.x;
}
void Bfs(){
node now;
for(int i=;i<=n;i++){
now.a[i][]=i;
now.a[i][]=;
char tmp=now.a[i][]+'';c+=tmp;c+='';
}
f[c]=;s[c]=;q[++tail]=now;
while(head<=tail){
now=q[head++];
cc.clear();
for(int i=;i<=n;i++){
for(int j=;j<=now.a[i][];j++){
char tmp=now.a[i][j]+'';cc+=tmp;
}
cc+='';
}
for(int i=;i<n;i++){
if(now.a[i][]==)continue;
int R=now.a[i+][now.a[i+][]];
if(R<now.a[i][now.a[i][]]&&R)continue;
node r;memcpy(r.a,now.a,sizeof(r.a));
r.a[i+][]++;
r.a[i+][r.a[i+][]]=r.a[i][r.a[i][]];
r.a[i][]--;c.clear();
for(int j=;j<=n;j++){
for(int k=;k<=r.a[j][];k++){
char tmp=r.a[j][k]+'';c+=tmp;
}
c+='';
}
if(f[c]==){
f[c]=;s[c]=s[cc]+;q[++tail]=r;
}
}
for(int i=;i<=n;i++){
if(now.a[i][]==)continue;
int L=now.a[i-][now.a[i-][]];
if(L<now.a[i][now.a[i][]]&&L)continue;
node r;memcpy(r.a,now.a,sizeof(r.a));
r.a[i-][]++;
r.a[i-][r.a[i-][]]=r.a[i][r.a[i][]];
r.a[i][]--;
c.clear();
for(int j=;j<=n;j++){
for(int k=;k<=r.a[j][];k++){
char tmp=r.a[j][k]+'';c+=tmp;
}
c+='';
}
if(f[c]==){
f[c]=;s[c]=s[cc]+;q[++tail]=r;
}
}
}
}
int main()
{
//freopen("huakai.in","r",stdin);
//freopen("huakai.out","w",stdout);
scanf("%d",&T);
int TT=T;
while(T--){
flag=;scanf("%d",&n);
if(T==TT-)Bfs();
printf("%d\n",tail);
break;
for(int i=;i<=n;i++){
scanf("%d",&A[i].x);A[i].o=i;
}
sort(A+,A++n,cmp);
for(int i=;i<=n;i++)
B[A[i].o]=i;
for(int i=;i<=n;i++)
if(i!=B[i]){
flag=;break;
}
if(!flag){
printf("0\n");
continue;
}
c.clear();
for(int i=;i<=n;i++){
char tmp=B[i]+'';c+=tmp;c+='';
}
if(s[c]==)printf("-1\n");
else printf("%d\n",s[c]);
}
return ;
}

换个状态 int判重

/*
开始10 写wa了
改到60 没法改了
后来发现 就800000个状态 不应该超时 ~ ~ map慢死
Hash也慢 双向bfs也过不了…..
但是状态写的不好 int存不下
后来听dmh说了他的状态 感觉很好 而且int能存下
改啊改改啊改 就A了
以后慎用map
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10000010
using namespace std;
int T,n,B[],C[],top[],p[],M[],q[maxn],head,tail,S[maxn];
bool f[maxn];
struct P{
int x,o;
}A[];
int cmp(const P &a,const P &b){
return a.x<b.x;
}
void Insert(int s){
memset(top,,sizeof(top));
int len=;
int tmp=s;
while(tmp){
p[++len]=tmp%;
tmp/=;
}
reverse(p+,p++len);
for(int i=len;i>=;i--)
top[p[i]]=i;
for(int i=;i<=len;i++)
if(i==top[p[i]]){
if(p[i]!=&&(top[p[i]-]>i||!top[p[i]-])){
int r=s-M[len-i];
if(!f[r]){
f[r]=;S[r]=S[s]+;
q[++tail]=r;
}
}
if(p[i]!=len&&(top[p[i]+]>i||!top[p[i]+])){
int r=s+M[len-i];
if(!f[r]){
f[r]=;S[r]=S[s]+;
q[++tail]=r;
}
}
}
}
void Ready(){
int s=;M[]=;
for(int i=;i<=;i++){
M[i]=M[i-]*;
s=s*+i;
q[++tail]=s;
f[s]=;S[s]=;
}
while(head<tail){
s=q[++head];
Insert(s);
}
}
int main()
{
freopen("huakai.in","r",stdin);
freopen("huakai.out","w",stdout);
Ready();
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&A[i].x);
A[i].o=i;
}
sort(A+,A++n,cmp);
for(int i=;i<=n;i++)
B[A[i].o]=i;
for(int i=;i<=n;i++)
C[B[i]]=i;
int s=;
for(int i=;i<=n;i++)
s=s*+C[i];
if(f[s]==)printf("-1\n");
else printf("%d\n",S[s]);
}
return ;
}

青春

【问题描述】

现在有一个被的小格子分割的矩形纸片,每个小格子内包含一个整数。现在你可以进行一系列的折叠,每次折叠的折痕必须是分割两行或者两列小格子的分割线。

在折叠完之后,所有重叠的小格子被看作一个单独的格子,并且这个格子的价值为重叠的小格子的价值和。

你想要知道,在所有可能得到的新格子中,格子价值的最大值为多少。

【输入格式】

输入文件的第一行有两个整数和,分别表示初始的矩形纸片的长和宽。接下来的行,每行有个数字表示初始的小格子内的整数。

【输出格式】

输出一行表示所能得到的格子价值的最大值。

【样例输入】

2 2

1 -2

3 -4

【样例输出】

4

【样例解释】

无。

【数据规模与约定】

对于的数据,格子内的数字权值的绝对值不超过。

数据点

数据点

1

3

3

6

15

100

2

10

10

7

20

100

3

10

10

8

20

500

4

15

15

9

20

500

5

20

20

10

20

500

Dfs

/*
T2 不会正解 也没时间打暴力了
就骗了点分 不粘了
正解Dfs 递归压缩行数变成一行
然后枚举这一行怎么个折法
不断更新最大值
注意奇数列由偶数列更新来 偶数列由奇数列更新来 */
#include<cstdio>
#include<cstring>
#define maxn 510
using namespace std;
int n,m,g[maxn][maxn],f[maxn],s[maxn],ans=-0x3f3f3f3f,mx[];
int max(int a,int b){
return a>b?a:b;
}
void Dfs(int x){
for(int i=;i<=m;i++)
s[i]+=g[x][i];
mx[]=mx[]=-0x3f3f3f3f;
for(int i=;i<=m;i++){
f[i]=s[i];
f[i]+=max(mx[(i&)^],);
ans=max(ans,f[i]);
mx[(i&)]=max(mx[i&],f[i]);
}
for(int i=x+;i<=n;i+=)Dfs(i);
for(int i=;i<=m;i++)
s[i]-=g[x][i];
}
int main()
{
freopen("taritari.in","r",stdin);
freopen("taritari.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&g[i][j]);
for(int i=;i<=n;i++)Dfs(i);
printf("%d\n",ans);
return ;
}

三部曲

【问题描述】

因为外来的入侵,国王决定在某些城市加派士兵。所有城市初始士兵数量为。当城市被加派了名士兵时。城市的所有子城市需要被加派名士兵。这些子城市的所有子城市需要被加派名士兵。以此类推。

当然,加派士兵的同时,国王也需要不断了解当前的情况。于是他随时可能询问以城市i为根的子树中的所有城市共被加派了多少士兵。

你现在是国王的军事大臣,你能回答出国王的每个询问么?

【输入格式】

第一行,包含两个整数代表城市数量以及国王的命令的数量。

第二行个整数,表示号每个节点的父亲节点。

接下来的行,每行代表国王的一个命令,命令分两种:

在城市加入个士兵

询问以城市为根的子树中所有士兵数量的和。

【输出格式】

对于每个,输出答案。

【样例输入】

7 10

1 1 2 2 5 5

Q 1

A 2 1

Q 1

Q 2

Q 5

A 5 0

Q 5

A 3 1

Q 1

Q 2

【样例输出】

0

11

11

8

10

14

13

【样例解释】

无。

暴力50

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 50010
using namespace std;
int n,m,num,head[maxn],s[maxn];
vector<int>son[maxn];
struct node{
int v,pre;
}e[maxn*];
char C[];
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int now,int from){
for(int i=head[now];i;i=e[i].pre){
int v=e[i].v;
if(v==from)continue;
son[now].push_back(v);
Dfs(v,now);
}
}
int Query(int x){
int r=s[x];
for(int i=;i<son[x].size();i++)
r+=Query(son[x][i]);
return r;
}
void Insert(int x,int y){
s[x]+=y;
for(int i=;i<son[x].size();i++)
Insert(son[x][i],y+);
}
int main()
{
freopen("truetears.in","r",stdin);
freopen("truetears.out","w",stdout);
n=init();m=init();
int fat,x,y;
for(int i=;i<n;i++){
fat=init();
Add(i+,fat);Add(fat,i+);
}
Dfs(,);
for(int i=;i<=m;i++){
scanf("%s",C);
if(C[]=='Q'){
x=init();
printf("%d\n",Query(x));
}
if(C[]=='A'){
x=init();y=init();
Insert(x,y);
}
}
return ;
}

正解还在研究23333~~

晚安~~

10.4 noip模拟试题的更多相关文章

  1. 10.26 noip模拟试题

    enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...

  2. 10.27 noip模拟试题

    1.铺瓷砖(tile.cpp/c/pas)[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行 ...

  3. 10.24 noip模拟试题

    尼玛pdf依旧不会粘23333 /* 每段合并到总的里面 假设总的有X个 这一段有Y个 一共有X+1个空 那么就有 C(X+1,1)+C(X+1,2)+C(X+1,3)+...+C(X+1,Y) 这样 ...

  4. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  5. 10.13 noip模拟试题

    Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship ...

  6. 10.11 noip模拟试题

    4题均为128M,1s 1. 锻炼计划(exercise.pas) 身体是革命的本钱,OIers不要因为紧张的学习和整天在电脑前而忽视了健康问题.小x设计了自己的锻炼计划,但他不知道这个计划是否可行, ...

  7. 10.8 noip模拟试题

      1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...

  8. 10.3 noip模拟试题

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

  9. 10.25 noip模拟试题

    今天题目略水2333 依旧不粘题目了23333 T1 /*数学题 给定n个斜率 求有多少个三元组 保证两两斜率不同 ans=C(n,3)-ΣC(len[i],2)*(n-len[i])-ΣC(len[ ...

随机推荐

  1. ARCI--做事情的重要方法论

    很多朋友都可能碰到这样的情况,有一个任务曾经开会讨论过,目标,时间,参与人都有提到,但是最终就是不了了之,没有下文了,而且后面想起来,要追究责任的时候,发现似乎都没有责任,无从追究.如果这种情况出现, ...

  2. [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】

    题目链接:BZOJ - 2049 题目分析 LCT的基本模型,包括 Link ,Cut 操作和判断两个点是否在同一棵树内. Link(x, y) : Make_Root(x); Splay(x); F ...

  3. 【poi】解决java导出excel 海量数据内存溢出问题

    转自百度经验:http://jingyan.baidu.com/article/4853e1e5202c331909f72627.html 那里排版忒恶心,转来这里. 由于项目中有导出海量数据的需求, ...

  4. 【UVA1371】Period (二分+DP)

    题意: 给出两个字符串A,B将B分解成若干个子字符串,然后每个子字符串都要经过编辑变成字符串A,所有子串中编辑最多的次数即为当前状态下的最大编辑次数,要求求最小的最大编辑次数. 编辑操作包括修改.删除 ...

  5. TCP/IP 邮件的原理

    邮件通过SMTP协议来实现,有它的服务器SMTP服务器. 它是怎么在万维网中运行的呢? 我们来看看两个案例,下面的两个图来展示. 案例一: Alice通过传统的邮件服务器发送给Bob,Bob通过HTT ...

  6. Unity 的“Vertex Lit Rendering path“中 shader Pass 的注意事项

    "MADFINGER/Environment/Unlit (Supports Lightmap)"是 ShadowGun 示例中最简单的 shader 了,如下: // Unlit ...

  7. maya绝招(21--40)

    第21招 将Outliner分成两个 在该视图中如果元素很多的时候,会觉得Outliner不够用,这个时候拖动下侧的底框,就可以分成两栏,这样选择就省事多了. 第22招 运用选择区域,快速选择物体 在 ...

  8. git bash【初级入门篇】

    最近公司打算使用git代替之前的svn版本控制工具,趁此机会打算好好学学git,这个号称当今世界最牛的分布式版本控制工具. 一.[git和svn的主要区别] 1.去中心化 svn以及微软的TFS均采用 ...

  9. 排序之直接插入排序(Straight Insertion Sort)

    一.直接插入排序(Straight Insertion Sort) 排序的过程如下:给定无需序列:(3,6,9,7,1,8,2,4) ① 3,6,9,7,1,8,2,4 (将6插入到有序序列3中) ② ...

  10. poj 1847 Tram【spfa最短路】

    Tram Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12005   Accepted: 4365 Description ...