首页 > 其他分享 >ABC 367D Pedometer

ABC 367D Pedometer

时间:2024-08-18 22:16:23浏览次数:4  
标签:ABC 个人 int 367D Pedometer maxn

题意
给定N个人成的环,第i个人到第i+1个人之前的距离为a[i](第N个人到第1个人的距离为a[n]),每个人只能顺时针走动。求问有多少点对(s,t)使得第s个人走到第t个人的距离是M的倍数。

思路
对于这种环状问题,我们最开始的思路就是开个双倍数组把环破坏成链转换成线性问题。接下来就是我们要思考的一个问题是,第i个人可以走向其他的N-1个人,我们要枚举N个人,最为暴力的方法肯定是O(N^2)的,显然无法通过,那么我们注意到:当你顺序枚举其中一个人到他下一个人的时候,其实只有两个元素发生了变化:一段长度为N-1的区间的左端点被筛除,区间右端点的紧接元素被纳入到这个区间,仔细思考可以得出:这不就是滑动窗口嘛?我们可以采取双指针的策略维护这个滑动窗口。并采取前缀和+取模的形式来维护即可。具体的细节就看代码吧

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=4e5+10;
int a[maxn],sum[maxn],ans;
map<int,int>much;

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i+1];
		a[i+1+n]=a[i+1];
	}
	for(int i=1;i<=2*n-1;i++) sum[i]=(sum[i-1]+a[i])%m;
	for(int i=n+1;i<=2*n-1;i++) much[sum[i]]++;
	int flag1=n;
	int flag2=2*n-1;
	int turn=0;
	while(turn<n)
	{
		int x=sum[flag1];
		ans+=much[x];
		much[sum[flag1]]++;
		much[sum[flag2]]--;
		flag1--;
		flag2--;
		turn++;	
	}
	cout<<ans<<endl;
	
	return 0;
 } 

标签:ABC,个人,int,367D,Pedometer,maxn
From: https://www.cnblogs.com/lulu7/p/18366197

相关文章

  • ABC 367 G 题解
    ABC367G神奇题目场上想到了引入多元生成函数之后就嗝屁了。定义两个多项式的运算\(A(z)*B(z)=\sum_{i}\sum_{j}z^{i\oplusj}a_ib_j\),也就是异或卷积。定义两个二元生成函数\(A(x,y)*B(x,y)=\sum_{i,p}\sum_{j,q}x^{i\oplusj}y^{p+q}a_{i,p}b_{j,q}\)我们仍然选用\(\prod......
  • 题解:AT_abc367_d [ABC367D] Pedometer
    首先肯定要单层循环枚举元素,然后想方法求出一个元素的所有答案。一开始我写了一个二分找\(m\)倍数的方法,发现\(m\)小的时候还不如暴力。于是联想到之前做过的一道题,可以借助于取模的前缀和数组。对于当前元素\(i\),如果一个元素之前的前缀和与\(i\)之前的前缀和对\(m\)......
  • Atcoder [ABC367F] Rearrange Query 题解
    简要题意给定两个长度为\(N\)的序列\(A\)和\(B\)。有\(Q\)个查询,每个查询给定\(l,r,L,R\),其中\(l\leqr,L\leqR\),要求判断\(A\)的第\(l\)项到第\(r\)项构成的集合与\(B\)的第\(L\)项到第\(R\)项构成的集合是否相等。题解显然两个相等的集合所有元素......
  • Atcoder [ABC367C] Enumerate Sequences 题解
    简要题意给定\(n,k\)和\(R_i\),你需要输出所有满足下列条件的整数序列:长度为\(n\)。第\(i\)个元素的范围为\([1,R_i]\)。一个序列的所有元素的总和为\(k\)的倍数。输出请按照按照从左至右按位从小到大的顺序输出。题解注意到数据范围很小,我们可以直接爆搜,这里用......
  • 题解:AT_abc367_e [ABC367E] Permute K times
    题意给你一个长度为\(N\)的序列\(X\),其中每个元素都介于\(1\)和\(N\)之间(含),以及一个长度为\(N\)的序列\(A\)。打印在\(A\)上执行以下操作\(K\)次的结果。将\(A_i\)替换为\(A_{X_i}\)。每个操作同时进行。思路元素\(i\)经过\(k\)次变化后的值就是元素......
  • ABC 367 题解
    AtCoderBeginnerContest367题解:\(Problem\hspace{2mm}A-Shout\hspace{2mm}Everyday\)题目链接opinion:~~code:#include<bits/stdc++.h>#definelllonglong#definepiipair<int,int>usingnamespacestd;lla,b,c;intmain(){ i......
  • abc364 题解
    第一次场切A~F,写个题解纪念一下。比赛链接:https://atcoder.jp/contests/abc367A-ShoutEveryday题意:高桥每天\(B\)时刻睡觉,\(C\)时刻起床(\(B,C\)时刻也在睡觉),请问高桥\(A\)时刻是否没睡。思路:对于\(B<=C\)和\(B>C\)分别处理即可。代码:https://atcoder.jp/con......
  • 题解:AT_abc365_d [ABC365D] AtCoder Janken 3
    D-AtCoderJanken3题解题意:高桥和青木要玩石头剪刀布,给你一个长度为\(n\)的字符串\(s\),\(s\)表示青木在第\(i\)局游戏中的动作(R表示石头,P表示布,S表示剪刀。)。高桥不可以在任何一局中输给青木(即:高桥和青木只可以平局或高桥赢青木),且高桥第\(i\)局出的和第\(i-1\)局......
  • 牛客周赛Round54(ABCDE)
     发布这些文章的目的很简单: 1.作者自己也是c++刚起手没多久的小白,深知自学一门学校不开设课程的语言的难处,(为了改错到处求人问路,看了好多没有真正帮助自己学习知识盲区,掌握新知识的教学视频,自己理解有偏差不能及时改正的困难)尽可能地帮助广大姐妹哥们儿们,我保证博文中的每......
  • [ABC351F] Double Sum
    原题链接题解方法一:双重循环,\(O(n^2)\)方法二:顺序遍历\(i\),然后查找目前所有比\(a_i\)小的数,这是一个比较经典的树状数组的运用时间复杂度\(P(n\logA)\)考虑优化,由于\(A\)可以达到\(1e8\),而\(n\)只有\(4e5\),所以我们可以对数据做离散化处理code#include<bi......