995!!!!

1. 疯狂动物城报名

题目ID:8378必做题100分

最新提交:

Time Limit Exceeded

50 分

历史最高:

Time Limit Exceeded

50 分

时间限制: 1000ms

空间限制: 65536kB

题目描述

题目描述

在听说兔子成了最好的警官后,疯狂动物城的其他动物都跃跃欲试来警局报名,也想成为一个除暴安良的伟大警官。来报名的有蜜獾、蜗牛、蚂蚁、长颈鹿……对于群众们的热情,警长很是无奈。为了维持秩序,牛局长让所有来报名的动物按照身高从低往高排队(身高全部取整数)。现在他想知道几个身高数据正好是某值的动物,在队伍中的起止位置,于是他把任务交给了猎豹警官。由于人数太多,一个个数实在太慢了,现在请你帮猎豹警官编程求解(如果队伍中没有此身高的,那么位置记为-1)。

比如队伍中有 6 个动物,他们的身高为:1 3 3 3 8 8,牛局长让猎豹警官统计了 4 个身高值,分别是 3 1 8 9,那么:

身高为 3 的动物首次和最后一次出现的位置分别是:2 4;

身高为 1 的动物首次和最后一次出现的位置分别是:1 1;

身高为 8 的动物首次和最后一次出现的位置分别是:5 6;

身高为 9 的动物首次和最后一次出现的位置分别是:-1 -1;

输入格式

第一行两个整数 n、m,分别表示队伍人数、局长要统计的身高数目;

第二行 n 个整数,代表报名队伍中各动物的身高,从小到大;

第三行是 m 个整数,代表每一个要统计的身高值 x。

输出格式

总共 m 行,每行两个整数,表示身高一致的动物所在队伍的起止位置

输入样例

10 4 1 3 7 11 11 13 13 13 19 23 3 7 11 13

输出样例

2 2 3 3 4 5 6 8

数据范围

1≤�≤1000001≤n≤100000; 1≤�≤1000001≤m≤100000; 1≤�≤1000001≤x≤100000;

样例解释

身高为 3 的动物首次和最后一次出现的位置分别是:2 4; 身高为 1 的动物首次和最后一次出现的位置分别是:1 1; 身高为 8 的动物首次和最后一次出现的位置分别是:5 6; 身高为 9 的动物首次和最后一次出现的位置分别是:-1 -1;

1 个赞

代码
#include<bits/stdc++.h>
using namespace std;
int n,m,k[100005];
int h[100005];
int x,y;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf(“%d”,&h[i]);
}
for(int i=1;i<=m;i++){
scanf(“%d”,&k[i]);
}
for(int i=1;i<=m;i++){
bool flag=0;
for(int j=1;j<=n;j++){
if(flag==0&&k[i]==h[j]){
x=j;
flag=1;
}
if(flag==1&&k[i]!=h[j]){
y=j-1;
break;
}
}
if(flag==0){
x=-1;
y=-1;
}
cout<<x<<" "<<y<<endl;
}

}

1 个赞

TLE了

1 个赞

一个数组a[N]就够了,循环一个for三个while,不用立flag。

1 个赞

这是伪代码:

#include <bits/stdc++.h>
using namespace std;
//创建数组a[N]
int main(){
    //创建变量并输入
    //输入数组a[N](for循环)
    while(m--){
        //创建变量
        int l=1,r=n,first=-1;
       //身高统计
        while(l<=r){
            int mid=l+r>>1;
            //判断
            }
            //判断
        }
        l=1,r=n;
        int last=-1;
        while(l<=r){
            //创建变量mid
            //判断
            }
           //判断
        }
        //输出
    }
    return 0;
}
1 个赞

”伪“!

1 个赞

以下是伪代码:
输入…
经过一大堆复杂运算…
输出

1 个赞

这是伪代码:

//头文件
//标准命名空间
//创建数组a[N]
//主函数入口
    //创建变量并输入
    //输入数组a[N](for循环)
    //循环
        //创建变量
        int l=1,r=n,first=-1;
       //身高统计
       //循环
            int mid=l+r>>1;
            //判断
            }
            //判断
        }
        l=1,r=n;
        int last=-1;
        //循环
            //创建变量mid
            //判断
            }
           //判断
        }
        //输出
    }
    //程序结束
}
1 个赞

呃呃呃,because写的年代过于久远(隔了一天)

1 个赞

thank you

1 个赞
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int b[N];
int main() {
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++)
		cin>>b[i];
	for(int i=1;i<=m;i++){
		if(binary_search(a+1,a+n+1,b[i])){
			cout<<lower_bound(a+1,a+n+1,b[i])-a<<" ";
			cout<<upper_bound(a+1,a+n+1,b[i])-a-1<<"\n";
		}
		else
            cout<<-1<<" "<<-1<<"\n";
	}
    return 0;
}
1 个赞

不能发AC代码

1 个赞

这叫题解,大哥,题解都是可以发AC代码的

1 个赞

复制解雨臣

1 个赞

可以直接从前往后搜,再从后往前搜,只是复杂度比较高