题目描述
蒜头君写了一个数列,这个数列可以分为连续的 n 段,其中第 i 段是 ai 个 numi 。然后他找了花椰妹玩游戏,花椰妹一共会提出 q 个问题,第 i 个问题是问这个数列的第 ki 个数是多少,你能帮蒜头君回答花椰妹的问题吗?
输入格式
第一行,两个正整数 n,q(1≤n,q≤105)。
接下来 n 行,每行两个正整数 ai,numi(1≤ai,numi≤109) 。
再接下来 q 行,每行一个正整数 ki(1≤ki≤∑ai)
输出格式
输出 q 行,每行一个整数,表示每次询问的结果。
数据范围
对于 30% 的数据,∑ai≤106 。
对于 70% 的数据,1≤n,q≤103 。
对于 100% 的数据,1≤n,q≤105 。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
2 3
1 2
2 3
1
2
3
样例输出
2
3
3
仔细一看,哇,这么水的题
#include<bits/stdc++.h>
using namespace std;
const int qwq = 1e7 +10;
int a[qwq];
int num = 1;
int main(){
int n,m;
cin>>n>>m;
int k,l;
int t;
for(int i = 1;i <= n;i++){
cin>>k>>l;
t = k;
while(t != 0){
a[num] = l;
t--,num++;
}
}
int o;
while(m--){
cin>>o;
cout<<a[o]<<endl;
}
return 0;
}
然而运行错误,
确实运行错误错误的不亏,因为这个的话我肯定会数组越界,于是我去借鉴了下隔壁分数比我高10分的代码
#include<bits/stdc++.h>
using namespace std;
//来注释祭天法力无边!!!!!!!!!
//I AK IOI!!!!!!!!!
//I AK IOI!!!!!!!!!
//I AK IOI !!!!!!!!!
//I AK IOI!!!!!!!!!
//I AK IOI!!!!!!!!!
//I AK IOI !!!!!!!!!
//I AK IOI!!!!!!!!!
//I AK IOI!!!!!!!!!
//I AK IOI !!!!!!!!!
//RP++!!!!!!!!!
//RP++!!!!!!!!!
//RP++!!!!!!!!!
//RP++!!!!!!!!!
//RP++!!!!!!!!!
//RP++!!!!!!!!!
//RP++!!!!!!!!!
//RP++!!!!!!!!!
int flag = -999;
//RP++!!!!!!!!!
struct str {
int a, b;
} a[10000150];
int main() {
long long n, q, num;
scanf("%lld%lld", &n, &q);
for(int i = 1; i <= n; i++) {
scanf("%lld%lld", &a[i].a, &a[i].b);
}
for(int i = 1; i <= q; i++) {
scanf("%lld", &num);
long long k = 1;
while(num > 0) {
if(num > a[k].a) {
num = num - a[k].a;
k++;
} else {
break;
}
}
if(flag != -1) {
printf("%lld\n", a[k].b);
}
}
return 0;
}
然后发现改完之后时间超限80分
怎么优化我这两个代码啊,这题的大概思路是什么