2022 CCPC 广州站 个人题解 B. Ayano and sequences

2024-03-27 08:50

本文主要是介绍2022 CCPC 广州站 个人题解 B. Ayano and sequences,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Analysis

传送门:https://codeforces.com/gym/104053/problem/B

首先考虑区间赋值的影响:

  • 如果是离散区间合并为一个区间,那么区间总数减少;
  • 如果是大区间包含分割区间,那么每次操作至多产生 2 2 2个新区间。

由于是区间赋值,因此我们考虑用一个类似珂朵莉树的思想来维护每条连续线段,然后发现如果某条线段在一段连续的时间内没有被改变,那么它会在时间-坐标平面上扫出一个矩形,那么考虑用线段树扫描线解决。

首先考虑扫描线框架:

在这里插入图片描述

初始时,我们向set中插入 n n n个单点区间 a [ i ] a[i] a[i],然后对于操作 1 1 1,从set中逐个取出区间然后删除,然后插入新区间,需要讨论端点位于区间内的情况(需要把误删的部分插入回去);对于操作 2 2 2,直接在扫描线上更新即可。

接下来考虑扫描线:

我们发现结合区间加的操作后,这个问题变成了二维扫描线求三维体积问题,因此我们不能单纯的维护区间和来解决,还要按时间戳维护一个负贡献,如图:

在这里插入图片描述

我们如果直接把区间和乘时间跨度,那么上图的红色部分就无法计数,因此单独维护一个负贡献,在统计答案时把负贡献累加进来就好了。

Code

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define endl '\n'
using namespace std;const int N = 5e5 + 10;
ull a[N], ans[N], pre[N], timer = 0;
int n = 0, q = 0;namespace SegTree{#define ls rt << 1#define rs rt << 1 | 1#define lson ls, l, mid#define rson rs, mid + 1, rull sumw[N << 2], sumdt[N << 2], ww[N << 2], dt[N << 2];inline void push_up(int rt, ull len) { sumw[rt] = sumw[ls] + sumw[rs] + len * ww[rt];sumdt[rt] = sumdt[ls] + sumdt[rs] + len * dt[rt];}void update(int rt, int l, int r, int L, int R, ull k, ull b) {if (R < l || r < L || L > R)  return;if (L <= l && r <= R) {sumw[rt] += k * (r - l + 1);sumdt[rt] += b * (r - l + 1);ww[rt] += k, dt[rt] += b;return;}int mid = (l + r) >> 1;update(lson, L, R, k, b), update(rson, L, R, k, b);push_up(rt, r - l + 1);}ull query(int rt, int l, int r, int L, int R, ull h) {if (R < l || r < L || L > R) return 0;if (L <= l && r <= R) return sumw[rt] * h + sumdt[rt];int mid = (l + r) >> 1;ull len = min(r, R) - max(l, L) + 1, res = (ww[rt] * h + dt[rt]) * len;return query(lson, L, R, h) + query(rson, L, R, h) + res;}}#define pii pair<int, int>
set<pii> st;void del(int l, int r) {st.erase({r, l});ans[a[l]] += SegTree::query(1, 1, n, l, r, timer - 1) - pre[l];
}void add(int l, int r, int x) {st.insert({r, l});a[l] = x;pre[l] = SegTree::query(1, 1, n, l, r, timer - 1);
}inline void solve() {cin >> n >> q;for(int i = 1; i <= n; i++) cin >> a[i];for(int i = 1; i <= n; i++) add(i, i, a[i]);while(q--) {timer++;int op, l, r; ull w; cin >> op >> l >> r >> w;if(op == 1) {while(1) {auto now = st.lower_bound({l, -1});if(now == st.end() || now -> second > r) break;int oldl = now -> second, oldr = now -> first;int oldv = a[oldl];del(oldl, oldr);if(l > oldl) add(oldl, l - 1, oldv);if(r < oldr) add(r + 1, oldr, oldv);}add(l, r, w);} else {SegTree::update(1, 1, n, l, r, w, (1 - timer) * w);}}timer += 1;while(st.size()) {auto it = st.begin();del(it -> second, it -> first);}for(int i = 1; i <= n; i++) cout << ans[i] << " \n"[i == n];
}signed main() {ios_base::sync_with_stdio(false), cin.tie(0);int t = 1; // cin >> t;while(t--) solve();return 0;
}

这篇关于2022 CCPC 广州站 个人题解 B. Ayano and sequences的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851571

相关文章

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析