fl0ppy-

导航

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);
}

Submission

posted on 2026-09-26 09:26  fl0ppy-  阅读(7)  评论(0)    收藏  举报