首页 > 其他分享 >1230. K倍区间

1230. K倍区间

时间:2023-02-22 10:55:39浏览次数:39  
标签:1230 前缀 int res sum ans 区间 余数

https://www.acwing.com/problem/content/1232

一眼前缀和,但是似乎只能优化到O(N^2),1e5的数据会超时,如果在比赛中到是可以抢一些分
枚举左端点和右端点找出所有的i,j组合,判断组合是否满足%k==0

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],s[N];
int n,k,ans;
int main()
{
	cin >> n >> k;
	for(int i=1; i<=n; i++)
	{
		scanf("%d",&a[i]);
		s[i]=s[i-1]+a[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)
		{
			int n=s[j]-s[i-1];
			if(n%k==0)ans++;
		}
	}
	cout << ans << endl;
	return 0;
}

但是实际上从数学上 (s[j]-s[i-1])% k == 0 可以被优化成 s[j] % k == s[i] % k

当j固定时,在1 ~ j之间找到有多少个L满足(s[j] - s[i - 1]) % k == 0   这其实就是我们第二层循环的含义,我们将循环条件简单的变一下:   当j固定时,在0 ~ j - 1之间找到有多少个L满足(s[j] - s[i]) % k == 0 可转换为:s[j] % k == s[i] % k

即有多少个前缀和%k余数相等

求有多少个前缀和%k的余数相等,显然我们可以在求前缀和的时候提前%k,最后再加上余数为0的个数即可

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long ll;
int sum[N],a[N],res[N];
int n,k;
ll ans=0;
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum[i]=(sum[i-1]+a[i])%k;
        ans+=res[sum[i]];
        res[sum[i]]++;
    }
    cout<<ans+res[0]<<endl;
    return 0;
}

 

标签:1230,前缀,int,res,sum,ans,区间,余数
From: https://www.cnblogs.com/lxl-233/p/17143589.html

相关文章

  • leetcode 56. 合并区间
    区间左端点进行排序如果intervals小于等于一个元素直接返回如果大于1个按照左边点进行排序从左至右依次合并classSolution{public:staticboolcmp(vector<int>&a,vec......
  • AcWing 1230. K倍区间
    AcWing1230.K倍区间原题链接视频讲解思路求区间的和为k的倍数的区间的个数。首先前缀和数组处理出来。数据范围1e5,要想想O(n)或者O(logn)做法将前缀和数组\(s[n]\)......
  • hihoCoder 1078 : 线段树的区间修改
    #1078:线段树的区间修改10000ms1000ms256MB描述对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho:假设货架上......
  • 代码随想录算法训练营第三十五天 | 435. 无重叠区间,763.划分字母区间,56. 合并区间
    一、参考资料无重叠区间https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html划分字母区间https://programmercarl.com/0763.%E......
  • 区间和线段树的各种操作
    这篇文章我们来讲一下线段树线段树,适用于对一个数列区间进行操作,可以求这段数列\(i\)到\(j\)的和、乘积、最大值、最小值等等等等,因此线段树有十分多的变种问题提出如......
  • BM89 合并区间
    关于区间问题,这里用到了差分染色的思想,通过标记两个端点标记一段连续的区间,而不是暴力遍历端点中的每个点进行标记。 constintval=200001*2+10086;intinter[v......
  • 求区间交集与并集
    代码求区间交集voidget_intersection(vector<PII>&segs){vector<PII>res;sort(segs.begin(),segs.end());intl=-2e9,r=2e9;for(au......
  • ACwing 区间最大公约数题解 线段树(附证明)
    算进区间最大公因数单点线段树 https://www.acwing.com/problem/content/247/题目:给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:Clrd,表......
  • 经典问题 2 —— 动态不包含区间与点完美匹配问题
    问题描述你需要维护一个数据结构,支持:加入/删除一个区间,加入/删除一个点,查询是否存在区间到点的完美匹配,使每个区间都在匹配中。保证任何时候不存在两个互相包含的区间。......
  • Java----判断两组数字区间是否有交集
    publicstaticvoidmain(String[]args){System.out.println(judge(newint[]{1,3},newint[]{2,5}));System.out.println(judge(newint[]{1,3},ne......