CF978C Letters 解题报告
CF978C Letters 解题报告
还挺好想的。
相当于把所有宿舍号排到一起,看做是一个楼。
很容易想到前缀和做。
注意到所有查询都单调不减,可以双指针做,即如果这栋楼满足条件,下一个查询能满足的也只能是这栋楼还真是下一栋楼,绝对不可能是下一栋。
如果强势暴力复杂度是\(\mathcal{O}(nm)\),会超级大爆。
我们做一个前缀和数组sum,遍历每一个查询,只要满足sum[j] < query[i],指针j++,其中query是查询数组。
代码很简单:
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N = 2e6 + 1000;
inline int read(){
int x = 0; bool f = 1; char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = 0;
for(; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return f ? x : -x;
}
int n, m;
int arr[N], sum[N];//sum是前缀和数组
int brr[N];//查询数组
main(){
n = read(), m = read();
for(int i = 1; i <= n; ++i){
arr[i] = read();
sum[i] = sum[i - 1] + arr[i];
}
for(int i = 1; i <= m; ++i){
brr[i] = read();
}
int j = 1;
for(int i = 1; i <= m; ++i){
int a = 0, s = 0;
while(sum[j] < brr[i]){
++j;
}
a = j;
s = brr[i] - sum[j - 1];
cout << a << ' ' << s << endl;
// j = 1;
}
exit(0);
}
浙公网安备 33010602011771号