当前位置: 首页 > news >正文

【洛谷】AT_abc371_e [ABC371E] I Hate Sigma Problems 的题解

【洛谷】AT_abc371_e [ABC371E] I Hate Sigma Problems 的题解

洛谷传送门

AT传送门

题解

I Hate Sigma Problems!!!

意思很简单就是求序列中每一个子区间内含有不同数字的个数之和。

暴力的话时间复杂度是 O ( n 2 ) O(n ^ 2) O(n2),是肯定不行的,所以要考虑别的方法。
刚开始先手模一些情况,然后发现,不同的值没有贡献的地方为当前出现的位置到上一次出现的位置中间的子序列及其子序列。

接着,就是代码实现。考虑枚举右端点。记 v [ i ] v[i] v[i] i i i 这个数最后一次出现的位置。每次在右端加入一个数,对前面所有左端点的影响:对 1 1 1 v [ i ] v[i] v[i]的位置没有影响,对 v [ i ] + 1 v[i] + 1 v[i]+1 到当前位置有影响。统计答案并更新 v [ i ] v[i] v[i]。时间复杂度 O ( n ) O(n) O(n)

代码

#include <bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {inline int read() {register int x = 0, f = 1;register char c = getchar();while (c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;}inline void write(int x) {if(x < 0) putchar('-'), x = -x;if(x > 9) write(x / 10);putchar(x % 10 + '0');return;}
}
using namespace fastIO;
ll n, a[200005], v[200005], ans = 0, sum;
int main() {//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1; i <= n; i ++) {cin >> a[i];	}v[a[1]] = 1;for(int i = 2; i <= n; i ++) {if(v[a[i]]) sum += i - v[a[i]];else {sum += i;}ans += sum;v[a[i]] = i;}ans += n;cout << ans << endl;return 0;
}

http://www.mrgr.cn/news/34515.html

相关文章:

  • 栈:只允许在一端进行插入或删除操作的线性表
  • MySQL外连接与子查询
  • C语言编译与链接
  • 字母与符号检测系统源码分享
  • GBase 8s 安装手册
  • 9.23每日作业
  • 【C#生态园】从容面对.NET性能挑战:全面解析多种性能监控工具
  • yolov8使用强数据增强
  • 深度学习:卷积神经网络CNN
  • 自定义类型
  • 全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记
  • Docker快速搭建PostgreSQL15流复制集群
  • Openpyxl 插入数据添加数据
  • Python人工智能之路 - 第一篇 : 你得会点儿Python基础
  • Pointnet++改进59:全网首发MogaBlock(2024最新模块)|用于在纯基于卷积神经网络的模型中进行判别视觉表示学习,具有良好的复杂性和性能权衡
  • Kubernetes Pod调度基础
  • 链表练习包括(创建遍历插入删除逆置排序)
  • 常见协议及其默认使用的端口号
  • 全栈开发(二):springBoot3连接mysql数据库
  • Spring Boot | 使用 `@Scheduled`: 定时任务的实现与优化