BZOJ 4167: 永远的竹笋采摘
首先同BZOJ5052 \(O(n \log n \log v)\) 求出所有点对
现在变成选出 \(k\) 条不相交的线段使得权值最小
可用前缀min优化dp \(O(nk)\) 解决
还是太慢,考虑wqs二分,大胆猜想 \(dp_k\) 斜率单调,通过二分斜率限制一下取的线段条数即可
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define pii pair<ll, int>
#define lp p << 1
#define rp p << 1 | 1
#define mid ((l + r) / 2)
#define lowbit(i) ((i) & (-i))
#define ll long long
#define ull unsigned long long
#define db double
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
#define Edg int ccnt=1,head[N],to[N*2],ne[N*2];void addd(int u,int v){to[++ccnt]=v;ne[ccnt]=head[u];head[u]=ccnt;}void add(int u,int v){addd(u,v);addd(v,u);}
#define Edgc int ccnt=1,head[N],to[N*2],ne[N*2],c[N*2];void addd(int u,int v,int w){to[++ccnt]=v;ne[ccnt]=head[u];c[ccnt]=w;head[u]=ccnt;}void add(int u,int v,int w){addd(u,v,w);addd(v,u,w);}
#define es(u,i,v) for(int i=head[u],v=to[i];i;i=ne[i],v=to[i])
const int MOD = 1e9 + 7;
void M(int &x) {if (x >= MOD)x -= MOD; if (x < 0)x += MOD;}
int qp(int a, int b = MOD - 2) {int ans = 1; for (; b; a = 1LL * a * a % MOD, b >>= 1)if (b & 1)ans = 1LL * ans * a % MOD; return ans % MOD;}
int gcd(int a, int b) { while (b) { a %= b; std::swap(a, b); } return a; }
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline char getc() {
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
inline int _() {
int x = 0, f = 1; char ch = getc();
while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getc(); }
while (ch >= '0' && ch <= '9') { x = x * 10ll + ch - 48; ch = getc(); }
return x * f;
}
const int N = 1e5 + 7;
const int INF = 0x3f3f3f3f;
int n, k, a[N], b[N], mn[N << 2];
inline bool cmp(int x, int y) {
return a[x] == a[y] ? x > y : a[x] > a[y];
}
void update(int p, int l, int r, int pos, int v) {
mn[p] = std::min(mn[p], v);
if (l == r) return;
if (pos <= mid) update(lp, l, mid, pos, v);
else update(rp, mid + 1, r, pos, v);
}
int query(int p, int l, int r, int pos, int v) {
if (mn[p] > v) return 0;
if (l == r) return l;
if (pos <= mid) {
int t = query(lp, l, mid, pos, v);
if (t) return t;
}
return query(rp, mid + 1, r, pos, v);
}
struct Node {
int l, r, v;
Node() {}
Node(int x, int y, int va) {
if (x > y) std::swap(x, y);
if (va < 0) va *= -1;
l = x, r = y, v = va;
}
bool operator < (const Node &p) const {
return l < p.l;
}
} q[N * 20];
int tol;
void init() {
std::sort(b + 1, b + 1 + n, cmp);
memset(mn, 0x3f, sizeof(mn));
rep (i, 1, n + 1) {
int j = query(1, 1, n, b[i], INF - 1);
while (j) {
if (a[j] != a[b[i]]) q[++tol] = Node(b[i], j, a[j] - a[b[i]]);
j = query(1, 1, n, b[i], (a[b[i]] + a[j] - 1) / 2);
}
update(1, 1, n, b[i], a[b[i]]);
}
}
int cnt[N * 20], pos[N], res;
db dp[N * 20], cost;
void update(int &a, int b) { if (dp[a] > dp[b]) a = b; }
void check() {
memset(pos, 0, sizeof(int) * (n + 2));
int last = res = 0;
rep (i, 1, tol + 1) {
while (last + 1 < q[i].l) {
last++;
update(pos[last], pos[last - 1]);
}
dp[i] = dp[pos[last]] + q[i].v + cost;
cnt[i] = cnt[pos[last]] + 1;
update(res, i);
update(pos[q[i].r], i);
}
}
int main() {
n = _(), k = _();
rep (i, 1, n + 1) a[i] = _(), b[i] = i;
init();
rep (i, 1, n + 1) a[i] = n - a[i] + 1;
init();
std::sort(q + 1, q + 1 + tol);
db l = -1e9, r = 1e9;
rep (i, 0, 88) {
cost = mid;
check();
if (cnt[res] == k) break;
if (cnt[res] < k) r = mid;
else l = mid;
}
printf("%.0f\n", dp[res] - cost * k);
return 0;
}
BZOJ 4167: 永远的竹笋采摘的更多相关文章
- 【BZOJ4167】永远的竹笋采摘 分块+树状数组
[BZOJ4167]永远的竹笋采摘 题解:我们考虑有多少点对(a,b)满足a与b的差值是[a,b]中最小的.以为是随机数据,这样的点对数目可能很少,实测是O(n)级别的,那么我们已知了有这么多可能对答 ...
- BZOJ4167 : 永远的竹笋采摘
首先枚举出所有可能成为区间最小差值的点对$(j,i)$. 枚举每个位置作为右端点$i$,假设$a[j]>a[i]$. 找到第一个这样的$j$,那么可以将下一个$a[j]$的范围缩小到$(a[i] ...
- BZOJ 2292 永远挑战
最短路. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&g ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ】【2756】【SCOI2012】奇怪的游戏
网络流-最大流 这题……建模部分先略过 这道题是会卡时限的T_T俺的Dinic被卡了,在此放几篇很棒的讲网络流算法的文章,至于大家耳熟能详的论文就不放了…… http://www.cppblog.co ...
- BZOJ 1660: [Usaco2006 Nov]Bad Hair Day 乱发节
Description Input * Line 1: 牛的数量 N. * Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度. Output * Line 1: 一个整数表示c[ ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- bzoj 3122 随机数生成器 - BSGS
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
随机推荐
- ubuntu建立软链接注意事项
ln 参数 源文件 目标链接文件 -s:代表新建一个软链接,又称符号链接: eg. ln -s /mnt/d/Documents/source.xlsx target.xlsx 1.目标文件的后缀名 ...
- MySQL删除语句比较,清空表数据,重置自增长索引
drop truncate delete 程度从强到弱 1.drop table tbdrop将表格直接删除,没有办法找回 2.truncate (table) tbtruncate 删除表中的所有数 ...
- 【使用python urllib时出现[SSL: CERTIFICATE_VERIFY_FAILED]报错的解决方案】
"首先,这个报错是告诉你,你的证书有问题. 其次,出现这个问题的原因,在于Python本身. 问题原因 Python升级到2.7.9以后,引入了一个新特性. 当使用urllib打开https ...
- [GameOfMir说明] 从文件中随机取文本
功能: 从文件中随机取文本.格式: GETRANDOMLINETEXT 文件 字符串变量 ;==========================================;示例脚本[@Main] ...
- java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [META-INF/services/com.alibaba.druid.filter.Filter].
九月 11, 2019 2:56:36 下午 org.apache.catalina.loader.WebappClassLoaderBase checkStateForResourceLoading ...
- ssm框架整合,配置文件中的配置内容
转自:https://www.cnblogs.com/dong-dong-1/p/8724127.html 使用idea工具开发,用maven进行管理. 最近在写毕业设计,因为对ssm框架一直半解,常 ...
- TD tree体验
在体验了学长们设计的app后,我颇有感触,我们也可以凭借自己的力量来开发一款软件,虽然它可能并不如市面上相同类型的那么完美,但它对我们的意义却是不一样的. 我是在下午的见面会上看到的这款软件,接待的学 ...
- MySQL 5.5.62 安装方法(标准配置版)
1.此安装方法适用于绝大多数MySQL版本,首先在MySQL官网上下载好所需版本. 2.(官网可能不太好找)在我的博客列表中有一篇是MySQL官网下载链接,直达下载界面,方便. 3.下载.(安装版 ...
- HDU 1016 素数环(dfs + 回溯)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 一道很典型的dfs+回溯: 根据题意首先进行初始化,即第一个位置为1,然后进行dfs, ...
- SpringCloud全家桶学习之断路器---Hystrix(五)
目前我也在摸索着学习Spring Cloud,本节主要摸索的是服务熔断.服务降级.Hystrix服务监控. 一.Hystrix概述 (1)服务雪崩 服务雪崩:多个微服务之间调用的时候,假设微服务A调用 ...