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

相关文章

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. 将日期转换为二进制表示 思路分析

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

2025届计算机毕业设计:如何构建Java SpringBoot+Vue个人健康档案管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录