Atcoder ABC390F Double Sum 3 题解 [ 绿 ] [ 贡献思维 ] [ 计数 ]
Double Sum 3:简单计数题。
思路
首先考虑单个区间的 \(f\) 值如何计算,显然等于值域上连续段的个数。那么我们进一步观察值域上连续段的性质,发现一个连续段的开头一定满足比开头小 \(1\) 的数字不存在于区间中的特点。
于是我们就可以考虑对每一个数字计算贡献了。同样,一个数字 \(a\) 的贡献只有当区间包含 \(a\) 且不包含 \(a-1\) 的时候才为 \(1\),其他都是 \(0\)。因为只有这样才能组成一个连续段的开头,而我们的贡献就是以开头来计数的。当然这里以连续段结尾来计数也没有问题。
因此只需要对每个数计算包含 \(a\) 且不包含 \(a-1\) 的区间个数即可。具体实现上,我们可以前后扫一遍,维护一个桶,包含 \(a\) 的区间我们钦定让最后面的那个 \(a\) 计算贡献,然后排除掉包含 \(a-1\) 的区间即可。假设 \(a\) 前面的最后一个 \(a-1\) 在 \(pre_{a-1}\) 处,后面的第一个 \(a\) 在 \(suf_a\) 处,后面的第一个 \(a-1\) 在 \(suf_{a-1}\) 处,则贡献即为 \((i-pre_{a-1})\times (\min(suf_a,suf_{a-1})-i)\)。
时间复杂度 \(O(n)\)。
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
int n,a[300005],tot[300005],pre[300005];
ll ans=0;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
memset(tot,0,sizeof(tot));
for(int i=1;i<=n;i++)
{
tot[a[i]]=i;
pre[i]=tot[a[i]-1];
}
fill(tot,tot+n+1,n+1);
for(int i=n;i>=1;i--)
{
int suf=min(tot[a[i]],tot[a[i]-1]);
ans+=1ll*(i-pre[i])*(suf-i);
tot[a[i]]=i;
}
cout<<ans;
return 0;
}
Atcoder ABC390F Double Sum 3 题解 [ 绿 ] [ 贡献思维 ] [ 计数 ]的更多相关文章
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- 【题解】晋升者计数 Promotion Counting [USACO 17 JAN] [P3605]
[题解]晋升者计数 Promotion Counting [USACO 17 JAN] [P3605] 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训.!牛是可怕的管理者! [题目描 ...
- AtCoder Grand Contest 039 简要题解
从这里开始 比赛目录 Problem A Connection and Disconnection 简单讨论即可. Code #include <bits/stdc++.h> using ...
- AtCoder Grand Contest 021完整题解
提示:如果公式挂了请多刷新几次,MathJex的公式渲染速度并不是那么理想. 总的来说,还是自己太弱了啊.只做了T1,还WA了两发.今天还有一场CodeForces,晚上0点qwq... 题解还是要好 ...
- AtCoder Grand Contest 040 简要题解
从这里开始 比赛目录 A < B < E < D < C = F,心情简单.jpg. Problem A >< 把峰谷都设成 0. Code #include &l ...
- AtCoder ABC 129E Sum Equals Xor
题目链接:https://atcoder.jp/contests/abc129/tasks/abc129_e 题目大意 给定一个二进制表示的数 L,问有多少对自然数 (a, b) 满足 $a + b ...
- 【ATcoder】Xor Sum 2
题目大意:给定一个 N 个点的序列,求有多少个区间满足\(\oplus_{i=l}^ra[i]=\sum\limits_{i=l}^ra[i]\). 题解: 小结论:\(a\oplus b=a+b\r ...
- Atcoder Tenka1 Programmer Contest 2019题解
传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in& ...
- Whu 1603——Minimum Sum——————【单个元素贡献、滑窗】
Problem 1603 - Minimum Sum Time Limit: 2000MS Memory Limit: 65536KB Total Submit: 623 Accepted: ...
- AtCoder Beginner Contest 089完整题解
A - Grouping 2 Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There a ...
随机推荐
- 【项目学习】Pendle 项目的简单调研
项目介绍 将 1 ETH 质押成 1 stETH,年利率为 5%,那么到期后 1 stETH 就能收回 1 ETH(本金)+ 0.05 ETH(收益).而 Pendle 所做的就是把 1 stETH ...
- OceanBase 的探索与实践
作者:来自 vivo 互联网数据库团队- Xu Shaohui 本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题,完整的描述了 OceanBase 的实施落地, ...
- 怎么实时更新echarts图标数据?
function getData(){ var request . nem XPHLHttpRequest () ; request . open("get",'http://lo ...
- CVE-2023-3609 Linux 内核 UAF 漏洞分析与漏洞利用
漏洞分析 通过分析补丁和漏洞描述可以知道漏洞是位于 u32_set_parms 函数里面,代码如下: static int u32_set_parms(struct net *net, struct ...
- Flutter null safety 无法运行
Flutter空安全问题 在pub上有一些库导入之后无法运行,这是因为健全的空安全 解决方法 1.在命令行中添加参数 flutter run --no-sound-null-safety 2.在IDE ...
- 【C#】【平时作业】习题-3-数组
1. 设计一个数组用于存放10个整数,然后计算这十个整数之和? private void btn1_Click(object sender, EventArgs e) { int temp = 0; ...
- gitlab runner install
gitlab-runner install -d /home/gitlab-runner/ --syslog --user gitlab-runner
- Qt音视频开发21-mpv内核万能属性机制
一.前言 搞过vlc内核后又顺带搞了搞mpv内核,mpv相比vlc,在文件数量.sdk开发便捷性方面绝对占优势的,单文件(可能是静态编译),不像vlc带了一堆插件,通过各种属性来set和get值,后面 ...
- Qt数据库应用10-通用数据库设置
一.前言 做过了众多的项目,只要是用了数据库的项目,基本上还有一个需求就是,提供一个界面用来初始化数据库,相当于恢复出厂设置的数据,一般恢复出厂设置需要复位的是配置文件.数据库文件.布局文件这几种,其 ...
- JVM实战—6.频繁YGC和频繁FGC的后果
大纲 1.JVM GC导致系统突然卡死无法访问 2.什么是Young GC什么是Full GC 3.Young GC.Old GC和Full GC的发生情况 4.频繁YGC的案例(G1解决大内存YGC ...