[思维] NamomoCamp Daily 7

Posted 晁棠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[思维] NamomoCamp Daily 7相关的知识,希望对你有一定的参考价值。

NamomoCamp Daily 7

代码源oj网址http://oj.daimayuan.top/course/10/problem/466

题解:

先求前缀和,可以发现最终要我们找的就是 ( S r − S l − 1 ) % k = r − l + 1 (S_r-S_l-1)\\%k=r-l+1 (SrSl1)%k=rl+1的个数。移项一下,就能将式子变成 ( S r − r ) % k = ( S l − 1 − ( l − 1 ) ) % k (S_r-r)\\%k=(S_l-1-(l-1))\\%k (Srr)%k=(Sl1(l1))%k的个数了。我们可以将每个 S i − i S_i-i Sii用map来保存个数,每次统计当前的 S i − i S_i-i Sii出现的个数即可。

注意, [ l , r ] [l,r] [l,r]的区间长度不会超过 k k k,如果等于 k k k那么求模会等于0。而且通过 r − l + 1 < k r-l+1<k rl+1<k可以求出 l > r − k + 1 l>r-k+1 l>rk+1,也就是区间长度固定不变,当一个 S l − l + 1 S_l-l+1 Sll+1对后续结果没有贡献后,我们可以将其删除。

代码:

代码源
// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm> 
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

const int N = 2e5 + 5;
int n, T, k;
int s[N];
map<int, int> m;

void ready()

	IOS;
	cin >> n >> k;
	ffor(i, 1, n) cin >> s[i];
	ffor(i, 1, n) s[i] += s[i - 1];
	ffor(i, 1, n) s[i] = (s[i] - i + k) % k;



void work()

	m[0]++;
	int ans = 0;
	ffor(r, 1, n) 
		if (r >= k) 
			m[s[r-k]]--; 
		
		ans += m[s[r]];
		m[s[r]]++;
	
	cout << ans;


signed main()

	ready();
	work();
	return 0;




以上是关于[思维] NamomoCamp Daily 7的主要内容,如果未能解决你的问题,请参考以下文章

[思维] NamomoCamp Daily 5

[LCA] NamomoCamp Daily 3

NamomoCamp Daily 1

[前缀和] NamomoCamp Daily 4

[动态规划] NamomoCamp Daily 8

[动态规划] NamomoCamp Daily 8