您的位置:首页 > 其它

L2-012. 关于堆的判断

2016-06-04 22:48 573 查看

L2-012. 关于堆的判断

题目链接:https://www.patest.cn/contests/gplt/L2-012

终于ac了,简直要哭。题目还是很简单的,不过很多坑:

1.寻找x下标时,有可能返回0,即x是根结点;

2.字符串中字符的位置有可能会因串中的数字长度大小改变而改变(QAQ找了一个小时才发现是在这里);

3.gets(函数)会读取前一个分隔符(是我基础不好╮(╯▽╰)╭).

代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
int a[1005];
int location(int key){
int k=0;
while(a[k]!=key)k++;
return k;
}
int transint(char s[]){
if(s[0]=='-'){
int temp=0;
for(int i=1;s[i]!=' '&&s[i]!='\0';i++)
temp=temp*10+s[i]-'0';
return -temp;
}else{
int temp=0;
for(int i=0;s[i]!=' '&&s[i]!='\0';i++)
temp=temp*10+s[i]-'0';
return temp;
}
}
int main(void){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",a+i);
int k=i;
while(k&&a[k]<a[(k-1)/2]){
swap(a[k],a[(k-1)/2]);
k=(k-1)/2;
}
}
while(m--){
bool flag;
char s[50];
int x;
scanf("%d",&x);
gets(s);//由于gets会读取x后的分隔符,所以字符串s实际上是从' '开始的
//一开始用s[8]区分,发现第二种查询会因数字长度改变而改变
if(s[4]=='t'&&s[8]=='r'){//第一种查询
if(a[0]==x)flag=1;
else flag=0;
}else if(s[4]==' '){//第二种查询
int y=transint(&s[5]);
int t=location(x);
if(t){
if(t&1){
if(a[t+1]==y)flag=1;
else flag=0;
}else{
if(a[t-1]==y)flag=1;
else flag=0;
}
}else flag=0;
}else if(s[4]=='t'&&s[8]=='p'){//第三种查询
int y=transint(&s[18]);
int t=location(y);
if(t&&a[(t-1)/2]==x)flag=1;
else flag=0;
}else if(s[4]=='a'){//第四种查询
int y=transint(&s[15]);
int t=location(x);
if(t&&a[(t-1)/2]==y)flag=1;
else flag=0;
}
if(flag)printf("T\n");
else printf("F\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: