Codeforces - 466C 双指针】的更多相关文章

首先要判sum是否是3的整数倍 然后把符合条件的前缀和以及后缀和分别加入到静态vector中 最后扫一下j和k定位在哪然后求总长的差来更新答案 注意i j k至少隔1位,所以lower_bound是s1[i]+2 官方题解是O(n),不过没仔细看 这种解法最坏应该是常数较小的O(nlogn) #include<bits/stdc++.h> using namespace std; const int maxn = 5e5+11; typedef long long ll; int a[maxn…
大意: 给定序列, 求多少个区间积被k整除. 整除信息满足单调性, 显然双指针. 具体实现只需要考虑k的素数向量, 对每一维维护个指针即可. 这题看了下cf其他人的做法, 发现可以直接暴力, 若当前的前缀积模k为0, 暴力向前求出第一个后缀积为0的位置即可, 复杂度是$O(n)$的并且相当好写. #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #incl…
题目链接:http://codeforces.com/problemset/problem/466/C 题目意思:给出一个 n 个数的序列你,问通过将序列分成三段,使得每段的和都相等的分法有多少种. 这个是详细的题解: http://codeforces.com/blog/entry/13758 代码也是按这个思路来做的,可怜我的做法改了 N 次总是得不到正确的结果--泪 #include <iostream> #include <cstdio> #include <cstd…
https://codeforces.com/problemset/problem/466/C 要把数据分为均等的非空的三组,那么每次确定第二个分割点的时候把(除此之外的)第一个分割点的数目加上就可以了.记得最后给第三组留至少一个. #include<bits/stdc++.h> using namespace std; #define ll long long int n; ]; int main(){ scanf("%d",&n); ;i<n;i++) s…
[题目链接] https://codeforces.com/contest/466/problem/C [算法] 维护序列前缀和 , 枚举中间一段即可 , 详见代码 时间复杂度 : O(N) [代码] #include<bits/stdc++.h> using namespace std; ; int a[MAXN]; long long sum[MAXN]; template <typename T> inline void read(T &x) { T f = ; x…
大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $cm$为给定系数 枚举满分的个数, 双指针求出最低分的最大值. #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <math.h>…
题意:给你n个数,将他们分成连续的三个部分使得每个部分的和相同,求出分法的种数. 思路:用一个数组a[i]记下从第一个点到当前i点的总和.最后一个点是总和为sum的点,只需求出总和为1/3sum的点和总和为2/3sum的点搭配的所有情况.遍历一遍总和为2/3sum的点前总和为1/3sum的点的个数. #include<stdio.h> #include<string.h> #include<iostream> using namespace std; ; typedef…
[链接] 我是链接,点我呀:) [题意] 让你把数组分成3个连续的部分 每个部分的和要一样 问你有多少种分法 [题解] 先处理出来num[i] 表示i..n这里面有多少个j 满足aft[j] = aft[i]/2 这aft[i]=a[j]+a[j+1]..+a[n] 然后for从1..n 看看pre[i]*2=aft[i+1]是否成立. 如果成立的话那么答案就加上num[i+1] [代码] import java.io.*; import java.util.*; public class Ma…
题目链接 思路如下 *题意: 给定一个序列,问有多少种方案可以将此序列分割成3个序列元素和完全相同的子序列.(子序列不能为空).即问有多少个点对(i,j)满足a[1]+-+a[i-1]=a[i]+a[i+1]+-+a[j]=a[j+1]+a[j+2]+-+a[n] 思路:这一题直接暴力求解就行了 看 n是否小于3 或者 数列元素之和 不能被3整除,如果是直接输出 0 当我们考虑某个位置 J 的时候,如果该位置的前缀和 sum[ J ] 是序列前缀和sum[ n ]的三分之二(此时剩下的区间的和一…
https://codeforces.com/contest/1133/problem/E 题意 给你n个数(n<=5000),你需要对其挑选并进行分组,总组数不能超过k(k<=5000),每组数字差距不超过5,问最多能挑出多少数字 题解 先排序,在进行dp,定义dp[i][j]为前i个数分成j组的最大值 两个转移方向 不选 dp[i-1][j] -> dp[i][j] 和前面的分组 dp[lt[i]-1][j-1] -> dp[i][j] 怎么确定i前面的哪个点是最大的? 选择能…