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],n;
ll sumL[maxn],sumR[maxn];
int s1[maxn],s2[maxn];
int main(){
while(scanf("%d",&n)!=EOF){
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
sumL[0]=sumR[n+1]=0;
for(int i = 1; i <= n; i++) sumL[i]=sumL[i-1]+a[i];
for(int i = n; i >= 1; i--) sumR[i]=sumR[i+1]+a[i];
if(sumL[n]%3!=0){
printf("0\n");
continue;
}
int cnt1=0,cnt2=0;
ll ans=0;
for(int i = 1; i <= n; i++) if(sumL[i]==sumL[n]/3) s1[++cnt1]=i;
for(int i = 1; i <= n; i++) if(sumR[i]==sumL[n]/3) s2[++cnt2]=i;
for(int i = 1; i <= cnt1; i++){
int j = lower_bound(s2+1,s2+cnt2+1,s1[i]+2)-s2;
int d = cnt2-j+1;
ans+=d;
}
printf("%lld\n",ans);
}
return 0;
}
Codeforces - 466C 双指针的更多相关文章
- Card Game Again CodeForces - 818E (双指针)
大意: 给定序列, 求多少个区间积被k整除. 整除信息满足单调性, 显然双指针. 具体实现只需要考虑k的素数向量, 对每一维维护个指针即可. 这题看了下cf其他人的做法, 发现可以直接暴力, 若当前的 ...
- codeforces 466C. Number of Ways 解题报告
题目链接:http://codeforces.com/problemset/problem/466/C 题目意思:给出一个 n 个数的序列你,问通过将序列分成三段,使得每段的和都相等的分法有多少种. ...
- Codeforces - 466C - Number of Ways - 组合数学
https://codeforces.com/problemset/problem/466/C 要把数据分为均等的非空的三组,那么每次确定第二个分割点的时候把(除此之外的)第一个分割点的数目加上就可以 ...
- [Codeforces 466C] Number of Ways
[题目链接] https://codeforces.com/contest/466/problem/C [算法] 维护序列前缀和 , 枚举中间一段即可 , 详见代码 时间复杂度 : O(N) [代码] ...
- Skills CodeForces - 613B (双指针)
大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $cm$ ...
- codeforces 466C 计数 codeforces 483B 二分 容斥
题意:给你n个数,将他们分成连续的三个部分使得每个部分的和相同,求出分法的种数. 思路:用一个数组a[i]记下从第一个点到当前i点的总和.最后一个点是总和为sum的点,只需求出总和为1/3sum的点和 ...
- 【Codeforces 466C】Number of Ways
[链接] 我是链接,点我呀:) [题意] 让你把数组分成3个连续的部分 每个部分的和要一样 问你有多少种分法 [题解] 先处理出来num[i] 表示i..n这里面有多少个j 满足aft[j] = af ...
- codeforces 466c(暴力枚举)
题目链接 思路如下 *题意: 给定一个序列,问有多少种方案可以将此序列分割成3个序列元素和完全相同的子序列.(子序列不能为空).即问有多少个点对(i,j)满足a[1]+-+a[i-1]=a[i]+a[ ...
- Codeforces Round #544 (Div. 3) dp + 双指针
https://codeforces.com/contest/1133/problem/E 题意 给你n个数(n<=5000),你需要对其挑选并进行分组,总组数不能超过k(k<=5000) ...
随机推荐
- springmvc 注解式开发 接收请求参数
1.校正请求参数名: 2.以对象形式整体接收 3.路径变量:
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...
- PartyLocation.get请求
1.PartyLocationDto:partyDto 2.PartyLocationConverter: 3.PartyDto:Public PartyDto 4.PartyLocationToPa ...
- Bulma 中的媒体查询
在 Bulma 中将设备分为 6 类:手机.平板.触屏设备.桌面.宽屏和大屏.提供了四个阈值. // sass/utilities/variables.sass $tablet: 769px !def ...
- Android 中 吐司显示不出来的原因分析
当你发现你的toast的show方法的确被执行了,但是却没有在界面中显示出来, 有问题的地方可能有两点: 1.Context上下文对象有问题,不是当前的上下文对象或者什么的: 2.message(即T ...
- Java50道经典习题-程序40 字符串排序
题目:根据字符串内字符的ASCII码值对字符串数组进行排序.分析:字符串用ASCII码比较大小,规则是:1.比较首字母的ASCII码大小2.若是前面的字母相同,则比较之后的字母的ASCII码值3.若是 ...
- sql语句增加字段 索引
alter table order_info add area varchar(50) create index group_compar on ry_order (group_compar); ...
- docker,mysql,Navicat
Navicat破解网址 https://www.jianshu.com/p/5f693b4c9468 docker pull mysql docker run -d -p 3306:3306 --n ...
- java基础之语法和开发规则
一. 代码书写的规则 以下面为例: 先写好结构 注意:为了避免错误,写代码时先把括号打齐,然后再补内容,每个”{}”里的内容开始写时要相比上一行多8个空格.为了方便可以用键盘上的 键代替(一般情况下时 ...
- Python 中 os.path 模块的运用
官网文档链接: https://docs.python.org/3/library/os.path.html 概念: 该模块在路径名上实现了一些有用的功能,主要用于文件的属性获取 代码实现: os.p ...