LG P5244 [USACO19FEB] Mowing Mischief P
\(\text{Code}\)
#include <bits/stdc++.h>
#define IN inline
#define eb emplace_back
using namespace std;
template<typename Tp>
IN void read(Tp &x) {
x = 0; char ch = getchar(); int f = 0;
for(; !isdigit(ch); f |= (ch == '-'), ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
if (f) x = ~x + 1;
}
typedef long long LL;
const int N = 2e5 + 5, M = 1e6 + 5;
const LL INF = 1e18;
struct point{int x, y;}a[N];
int lis[N], n, m;
LL f[N], g[N];
vector<int> G[N];
IN LL calc(int x1, int y1, int x0, int y0){return (LL)(x1 - x0) * (y1 - y0);}
struct SegmentTree {
#define ls (p << 1)
#define rs (ls | 1)
vector<int> Q[N << 2];
void build(int p, int l, int r) {
Q[p].clear(); if (l == r) return;
int mid = l + r >> 1; build(ls, l, mid), build(rs, mid + 1, r);
}
void insert(int p, int l, int r, int x, int y, int z) {
if (x > r || y < l) return;
if (x <= l && r <= y) return Q[p].eb(z), void();
int mid = l + r >> 1;
insert(ls, l, mid, x, y, z), insert(rs, mid + 1, r, x, y, z);
}
void solve(int p, int l, int r, int L, int R, int cur) {
if (r < l || R < L) return;
int mid = l + r >> 1, bst = 0;
for(int i = L; i <= R; i++) {
LL s = f[G[cur - 1][i]] + calc(a[Q[p][mid]].x, a[Q[p][mid]].y, a[G[cur - 1][i]].x, a[G[cur - 1][i]].y);
if (g[Q[p][mid]] > s) g[Q[p][mid]] = s, bst = i;
}
solve(p, l, mid - 1, bst, R, cur), solve(p, mid + 1, r, L, bst, cur);
}
void dfs(int p, int l, int r, int cur) {
for(auto v : Q[p]) g[v] = INF;
solve(p, 0, Q[p].size() - 1, l, r, cur);
for(auto v : Q[p]) f[v] = min(f[v], g[v]);
if (l == r) return; int mid = l + r >> 1;
dfs(ls, l, mid, cur), dfs(rs, mid + 1, r, cur);
}
}T;
struct BIT {
int c[M];
IN int lowbit(int x){return x & -x;}
IN void add(int x, int v){for(; x <= m; x += lowbit(x)) c[x] = max(c[x], v);}
IN int query(int x){int s = 0; for(; x; x -= lowbit(x)) s = max(c[x], s); return s;}
}bit;
IN void solve() {
for(int i = 1; i <= n; i++) lis[i] = bit.query(a[i].y) + 1, bit.add(a[i].y, lis[i]);
for(int i = 0; i <= n; i++) G[lis[i]].eb(i);
for(int i = 1; i <= n; i++) sort(G[i].begin(), G[i].end(), [](int x, int y){return a[x].x < a[y].x;});
for(int i = 1; i <= n; i++) f[i] = INF;
for(int i = 1; i <= n && G[i].size(); i++) {
T.build(1, 0, G[i - 1].size() - 1);
int p = 0, q = 0;
for(auto j : G[i]) {
while (p < G[i - 1].size() && a[G[i - 1][p]].x <= a[j].x) ++p;
while (q < G[i - 1].size() && a[G[i - 1][q]].y > a[j].y) ++q;
T.insert(1, 0, G[i - 1].size() - 1, q, p - 1, j);
}
T.dfs(1, 0, G[i - 1].size() - 1, i);
}
}
int main() {
freopen("mowing.in", "r", stdin);
freopen("mowing.out", "w", stdout);
read(n), read(m);
for(int i = 1; i <= n; i++) read(a[i].x), read(a[i].y);
sort(a + 1, a + n + 1, [](point a, point b){return a.x < b.x;});
solve();
int mx = 0;
for(int i = 1; i <= n; i++) mx = max(mx, lis[i]);
LL ans = INF;
for(int i = 1; i <= n; i++) if (lis[i] == mx) ans = min(ans, f[i] + calc(m, m, a[i].x, a[i].y));
printf("%lld\n", ans);
}
LG P5244 [USACO19FEB] Mowing Mischief P的更多相关文章
- [USACO19FEB]Mowing Mischief
题目大意: 给定平面上的一些点,求这些点的一个\(LIS\),并且还需要满足下列式子最小: \[ \sum_{i=1}^{n-1}(a[i+1].x-a[i].x)*(a[i+1].y-a[i].y) ...
- Linux下安装性能测试负载机LG
系统:CentOS release 6.6 (Final) x86_64 安装包: 1.LRLG_00031.iso [Load Generator Standalone (Linux 64-bit ...
- bootstrap 之 xs,sm,md,lg && 主要颜色
mobile – xs ( <768px ) tablet – sm ( 768~991px ) desktop – md ( 992~1170px ) large desktop – lg ( ...
- boostrap中lg,md,sm,xs
boostrap中lg,md,sm,xs分别表示多少px? .col-xs- 超小屏幕 手机 (<768px).col-sm- 小屏幕 平板 (≥768px).col-md- 中等屏幕 桌面显示 ...
- LG 2.2.1 P350安卓系统刷机,问题总结,希望对需要的朋友有助
手机误删软件导致短信,键盘等无声音提醒 我的手机前几天被我误删了一个软件,导致电话接不了,别人打电话的时候,老提示我在通话中,但是我可以在通话中看到对方的打电话记录.短信,键盘,USB连接,等等都没有 ...
- 美版nexus 5 LG D820才支持CDMA,国际版LG D821不支持
我们都知道nexus 5其实是有两个不同的版本的,分别是LG D820和LG D821,它们在几乎所有的配置和外观上都没有任何的区别,主要区别在通讯模块上,一个支持GSM/CDMA/WCDMA/LTE ...
- git lg 使用 转
命令: git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yello ...
- git lg 配置
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d ...
- 国行 lg g3 D858 刷 lg g3 D858hk 教程(备忘)
纯手打,转载请注明出处~ 刷机有风险,出现问题概不负责! 本着自娱自乐的宗旨 ,分享一下,出了问题不负责! 准备的材料: 1,手机一枚(废话)国行lg g3 d858 2,root 工具 用来root ...
- LG Optimus L90 [D415] T-Mobile 刷机
1 先使用[ROOT大师]ROOT手机. 2 执行以下ADB命令. adb shell su //备份 dd /by-name/laf of=/sdcard/laf.img. //清除 dd /by- ...
随机推荐
- laravel框架 forelse和foreach
1. @forelse($data as $v) 循环数据内容..... @empty 数据为空提示... @endforelse 2. @foreach($data as $v) 循环数据内容... ...
- fbterm的配置,纯文本终端显示中文
安装 fbterm sudo apt-get install fbterm 设置普通用户可以执行 fbterm 命令 sudo adduser username video #username为用户名 ...
- uniCloud云开发入门以及对传统开发方式的思考
事情缘由 作为选修了移动互联网应用的一员,老师讲的什么JS基础,还有ES6和uniapp,当然是没怎么听,因为是之前大二的时候都大概看过. 但是快到期末,老师讲了云开发,并且布置了与此相关的大作业,自 ...
- SQL语句查询关键字前期数据准备
前期数据准备 create table emp( id int primary key auto_increment, name varchar(20) not null, gender enum(' ...
- 老板:你为什么要选择 Vue?
大家好,我是 Kagol,Vue DevUI 开源组件库和 EditorX 富文本编辑器创建者,专注于前端组件库建设和开源社区运营. 假如你是团队的前端负责人,现在老板要拓展新业务,需要开发一个 We ...
- 【实时数仓】Day00:数据流程、课程内容、框架结构、知识点总结
一.数据流程 1.离线数仓 2.实时数仓 二.课程内容 1.数据采集层(ODS) 2.DWD层与DIM层数据准备 3.DWM层业务实现 4.DWS层业务实现 5.ClickHouse 6.数据可视化接 ...
- python自然语言处理(NLP)1------中文分词1,基于规则的中文分词方法
python中文分词方法之基于规则的中文分词 目录 常见中文分词方法 推荐中文分词工具 参考链接 一.四种常见的中文分词方法: 基于规则的中文分词 基于统计的中文分词 深度学习中文分词 混合分词方法 ...
- if多条件判断
在一个if语句中,括号里面包含多个条件时.条件是否被执行要看if语句里面各个条件是"与"的关系还是"或"的关系. #include<stdio.h> ...
- APICloud 平台常用技术点汇总讲解
平台介绍: 使用 APICloud 可以开发移动APP.小程序.html5 网页应用.如果要实现编写一套代码编译为多端应用(移动APP.小程序.html5 ),需使用 avm.js 框架进行开 ...
- C++进阶(位图+布隆过滤器的概念和实现+海量数据处理)
位图 概念 位图: 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景.通常是用来判断某个数据存不存在的. 适用场景: 如果我们需要对大量的数据进行处理,判断该数据在不在,比如40 ...