Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code

题目链接

题意:

给出\(n\)个俄罗斯套娃,每个套娃都有一个\(in_i,out_i\),并满足\(out_i>in_i\)。定义套娃\(i\)能套在套娃\(j\)里面,当且仅当\(out_i\leq in_j\)。

定义极大套娃组:当且仅当不能有另外一个套娃套在它们身上。

定义套娃组额外空间为\(in_1+(in_2-out_1)+\cdots +(in_k-out_{k-1})\),其中\(k\)为最大的那个套娃。

现在求额外空间最小的极大套娃组都多少个。

思路:

将上面求和式子变换一下有:

\[in_k+\sum_{i=1}^{k-1}in_i-out_i
\]

分析这个式子,也就是对于一个在最外面的套娃\(k\)来说,其余里面套娃的贡献就为\(in_i-out_i\),是独立的。

首先将所有套娃按\(in\)升序排序,之后依次枚举每一个套娃并将其视作最后一个套娃。假设当前枚举的\(i\),那么\(dp(i)=min_{out_j\leq in_i}\{dp(j)\}+in_i\),\(dp\)中存储的是套娃的贡献值,\(dp(i)\)表示以\(i\)作结尾的套娃最小的额外空间是多少。

因为题目还要求数目,考虑转移的时候在线段树上面查询,同时维护一个\(sum\)记录个数,查询、更新的时候进行结点的合并,合并实现两个功能:一是找最小值,而是更新个数,详见代码即可。

最后统计答案的时候,找到所有的极大套娃组进行统计。

代码如下:

#include <bits/stdc++.h>
#define mp make_pair
#define fi first
#define se second
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 2e5 + 5, MOD = 1e9 + 7;
int n;
pii a[N];
struct SEG{
struct node{
ll Min, sum;
node() {
sum = 0; Min = INF;
}
node(ll Min, ll sum) : Min(Min), sum(sum) {}
node operator + (const node &other) const {
node res = node();
if(Min < other.Min) {
res.Min = Min;
res.sum = sum;
} else if(Min == other.Min) {
res.Min = Min;
res.sum = (other.sum + sum) % MOD;
} else {
res.Min = other.Min;
res.sum = other.sum;
}
return res;
}
}t[N << 3], res;
void build(int o, int l, int r) {
if(l == r) {
t[o] = node();
return;
}
int mid = (l + r) >> 1;
build(o << 1, l, mid); build(o << 1|1, mid + 1, r);
}
void update(int o, int l, int r, int p, node v) {
if(l == r) {
t[o] = t[o] + v;
return ;
}
int mid = (l + r) >> 1;
if(p <= mid) update(o << 1, l, mid, p, v);
else update(o << 1|1, mid + 1, r, p, v);
t[o] = t[o << 1] + t[o << 1|1];
}
void query(int o, int l, int r, int L, int R) {
if(L <= l && r <= R) {
res = res + t[o];
return ;
}
int mid = (l + r) >> 1;
if(L <= mid) query(o << 1, l, mid, L, R);
if(R > mid) query(o << 1|1, mid + 1, r, L, R);
}
}seg;
int D, b[N << 1];
ll c[N], d[N];
int id(int x) {
return lower_bound(b + 1, b + D + 1, x) - b;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i].se >> a[i].fi;
b[++D] = a[i].fi; b[++D] = a[i].se;
}
sort(a + 1, a + n + 1);
sort(b + 1, b + D + 1);
D = unique(b + 1, b + D + 1) - b - 1;
ll Min = INF;
seg.build(1, 1, D);
for(int i = 1; i <= n; i++) {
seg.res = SEG::node();
seg.query(1, 1, D, 1, id(a[i].fi));
if(seg.res.Min == INF) {
seg.res = SEG::node(a[i].fi - a[i].se, 1);
c[i] = 1; d[i] = a[i].fi;
seg.update(1, 1, D, id(a[i].se), seg.res);
} else {
c[i] = seg.res.sum;
d[i] = seg.res.Min + a[i].fi;
seg.res.Min += a[i].fi - a[i].se;
seg.update(1, 1, D, id(a[i].se), seg.res);
}
if(a[i].se > a[n].fi) Min = min(Min, d[i]);
}
ll ans = 0;
for(int i = 1; i <= n; i++)
if(a[i].se > a[n].fi && d[i] == Min)
ans = (ans + c[i]) % MOD;
cout << ans;
return 0;
}

Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code的更多相关文章

  1. Educational Codeforces Round 69 (Rated for Div. 2)

                                                                                                  A. DIY ...

  2. Educational Codeforces Round 69 (Rated for Div. 2) D. Yet Another Subarray Problem 背包dp

    D. Yet Another Subarray Problem You are given an array \(a_1, a_2, \dots , a_n\) and two integers \( ...

  3. Educational Codeforces Round 69 (Rated for Div. 2) C. Array Splitting 水题

    C. Array Splitting You are given a sorted array

  4. Educational Codeforces Round 69 (Rated for Div. 2) A~D Sloution

    A. DIY Wooden Ladder 题意:有一些不能切的木板,每个都有一个长度,要做一个梯子,求梯子的最大台阶数 做梯子的木板分为两种,两边的两条木板和中间的若干条台阶木板 台阶数为 $k$ 的 ...

  5. Educational Codeforces Round 69 (Rated for Div. 2)D(DP,思维)

    #include<bits/stdc++.h>using namespace std;int a[300007];long long sum[300007],tmp[300007],mx[ ...

  6. Educational Codeforces Round 69 (Rated for Div. 2) C. Array Splitting (思维)

    题意:给你一个长度为\(n\)的升序序列,将这个序列分成\(k\)段,每一段的值为最大值和最小值的差,求\(k\)段值的最小和. 题解:其实每一段的最大值和最小值的差,其实就是这段元素的差分和,因为是 ...

  7. Educational Codeforces Round 69 (Rated for Div. 2) D. Yet Another Subarray Problem 【数学+分块】

    一.题目 D. Yet Another Subarray Problem 二.分析 公式的推导时参考的洛谷聚聚们的推导 重点是公式的推导,推导出公式后,分块是很容易想的.但是很容易写炸. 1 有些地方 ...

  8. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  9. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

随机推荐

  1. c语言之函数指针应用

    c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...

  2. flowable ui 界面请假流程操作实例

    如题,网上的教程多是代码居多,UI界面操作实例那更是一页难求,楼主分享下几天来的入坑经历,希望有需要了解,但是不知道去哪里了解的小伙伴,看完我的文章后能有所启发,文章有不足之处还请指正,若有相关问题请 ...

  3. 【转帖】威盛x86 AI处理器架构、性能公布:媲美Intel 32核心

    威盛x86 AI处理器架构.性能公布:媲美Intel 32核心 https://www.cnbeta.com/articles/tech/920559.htm 除了Intel.AMD,宝岛台湾的威盛也 ...

  4. intellij idea快速通过mapper跳转到xml文件

    安装完之后重启idea即可!

  5. Jenkins教程(四)安装BlueOcean与Maven构建

    前言 本文旨在使用BlueOcean实现构建可视化与使用Maven构建上一节Jenkins教程(三)添加凭据与流水线拉取Git代码拉下来的代码 什么是Blue Ocean Blue Ocean 重新思 ...

  6. VS2019+EF6连接Mysql

    开发环境:Win10 + VS2019Mysql服务器版本:8.0.16 一.下载并安装插件(必备) MySQL-Connector-net-6.9.12  链接https://cdn.mysql.c ...

  7. C#完成 使用异步线程定时更新窗体标签内容,并对标签内容进行求和显示

    这是我在面试过程中遇到的一个小测试,很可惜,当天未能圆满完成,虽然第二天经过实际测试已经OK 了,但学无止境,继续努力吧,特将此代码贴在这里,供以后学习使用: namespace mytest { p ...

  8. Unity PhysicsScene测试

    应该是unity 2018.3中加入的功能,对象可以放置于不同的物理场景中. 一个Scene对应一个物理场景(PhysicsScene),若想放入独立的物理场景测试创建一个Scene即可.见下图gif ...

  9. JDBC 复习

    概念 Java DataBase Connectivity java数据库连接 定义了操作所有关系型数据库的规则(接口),不同的数据库厂商编写类实现这些接口,这些类就叫数据库驱动,使得用户只需要使用统 ...

  10. Guava入门

    其实我用guava差不多大半年时间了,发现guava真的特别好用,又会使代码变得很简洁,最近又系统的学习了一下,大致讲一下