【线段树 dp】8.6集合
线段树维护dp
题目大意
给定初始大小为 $N$ 的正整数集合。定义两个数$x$和$y$建立联系的的代价为 $|x-y|$。我们定义整数集合的代价为:将每个整数都与至少一个另外的整数建立联系之后,所有联系的最小代价之和。如果集合大小小于等于1,则代价为 0。
要求动态维护这个正整数集合的代价。
$n \le 200000$
题目分析
常规的线段树维护dp
考虑在权值上处理这个问题:对于一个区间$[l,r]$,在$(l,r)$中的数肯定是自身配对了才优。也就是说一个区间可以被概括成四个状态:$00,01,10,11$其中$0$表示这一个端点暂时没有配对,$1$表示这个端点已经内部配对了。
接下去就是常规的权值线段树处理dp
#include<bits/stdc++.h>
typedef long long ll;
const ll INF = 1ll<<;
const int maxn = ;
const int LIM = ;
const int maxNode = ; struct node
{
int mn,mx,ls,rs,val;
ll f00,f01,f10,f11;
}f[maxNode];
int n,m,rt,tot,a[maxn];
int stk[maxn<<],top; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void pushup(int rt)
{
int l = f[rt].ls, r = f[rt].rs, gap = f[r].mn-f[l].mx;
if (!l&&!r){
f[rt].f00 = f[rt].f01 = f[rt].f10 = f[rt].f11 = INF;
}else if (!l||!r){
f[rt].mn = f[l+r].mn, f[rt].mx = f[l+r].mx;
f[rt].f00 = f[l+r].f00, f[rt].f01 = f[l+r].f01;
f[rt].f10 = f[l+r].f10, f[rt].f11 = f[l+r].f11;
}else{
f[rt].mn = f[l].mn, f[rt].mx = f[r].mx;
f[rt].f00 = std::min(std::min(f[l].f00+f[r].f00+gap, f[l].f00+f[r].f10+gap), std::min(f[l].f01+f[r].f00+gap, f[l].f01+f[r].f10));
f[rt].f01 = std::min(std::min(f[l].f00+f[r].f01+gap, f[l].f00+f[r].f11+gap), std::min(f[l].f01+f[r].f01+gap, f[l].f01+f[r].f11));
f[rt].f10 = std::min(std::min(f[l].f10+f[r].f00+gap, f[l].f10+f[r].f10+gap), std::min(f[l].f11+f[r].f00+gap, f[l].f11+f[r].f10));
f[rt].f11 = std::min(std::min(f[l].f10+f[r].f01+gap, f[l].f10+f[r].f11+gap), std::min(f[l].f11+f[r].f01+gap, f[l].f11+f[r].f11));
}
}
void insert(int &rt, int l, int r, int c, int w)
{
if (!rt){
if (top) rt = stk[top--];
else rt = ++tot;
f[rt].ls = f[rt].rs = f[rt].val = f[rt].f00 = f[rt].f01 = f[rt].f10 = f[rt].f11 = ;
}
f[rt].val += w;
if (l==r) f[rt].mn = f[rt].mx = c, f[rt].f11 = INF;
else{
int mid = (l+r)>>;
if (c <= mid)
insert(f[rt].ls, l, mid, c, w);
else insert(f[rt].rs, mid+, r, c, w);
pushup(rt);
}
if (!f[rt].val) stk[++top] = rt, rt = ;
}
int main()
{
n = read(), m = read();
for (int i=; i<=n; i++) insert(rt, , LIM, read(), );
for (int i=; i<=m; i++)
{
int opt = read()==?:-;
insert(rt, , LIM, read(), opt);
printf("%lld\n",f[].f11);
}
return ;
}
END
【线段树 dp】8.6集合的更多相关文章
- Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- 模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)
模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define ...
- 【Foreign】阅读 [线段树][DP]
阅读 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 0 10 4 10 2 3 10 8 ...
- Points Division(线段树+DP)2019牛客暑期多校训练营(第一场)
题意:https://ac.nowcoder.com/acm/contest/881/I 给你n个平面上的点,每个点有a.b两个权值,现在让你划分成两个区域(要求所有A集合里的点不能在任何B集合里的点 ...
- 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
- lightoj1085 线段树+dp
//Accepted 7552 KB 844 ms //dp[i]=sum(dp[j])+1 j<i && a[j]<a[i] //可以用线段树求所用小于a[i]的dp[j ...
- [CF 474E] Pillars (线段树+dp)
题目链接:http://codeforces.com/contest/474/problem/F 意思是给你两个数n和d,下面给你n座山的高度. 一个人任意选择一座山作为起始点,向右跳,但是只能跳到高 ...
- HDU-3872 Dragon Ball 线段树+DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3872 题意:有n个龙珠按顺序放在一列,每个龙珠有一个type和一个权值,要求你把这n个龙珠分成k个段, ...
随机推荐
- php display_errors
// 检测开发环境 public function setReporting() { if (APP_DEBUG === true) { error_reporting(E_ALL); ini_set ...
- centos7服务搭建常用服务配置之一:SSH
目录 1 SSH服务协议 1.1 ssh服务协议说明 1.2 ssh服务工作机制 1.3 ssh加密技术说明 1.3.1 ssh实现安全链接建立,利用要是和锁头 1.3.2 ssh加密算法 1.4 s ...
- 记:linux服务器启动重启WEB项目启动成功,长时间卡住未响应
问题 云服务器部署web项目,每次正常启动项目后访问页面很久才能有响应,一直卡在INFO: Deploying web application directory ......长达几分钟以上,极度影响 ...
- HttpServletResponse对象(转)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- ubuntu 连接宽带
ubuntu 连接宽带 链接: https://blog.csdn.net/selous/article/details/55520765 主要命令 pppoeconf pon dsl-provide ...
- Simple Library Management System HDU - 1497(图书管理系统)
Problem Description After AC all the hardest problems in the world , the ACboy 8006 now has nothing ...
- axios拦截器的介绍
interceptors 拦截器 拦截器一般做什么? 1. 修改请求头的一些配置项 2. 给请求的过程添加一些请求的图标 3. 给请求添加参数 拦截器的基本语法: 拦截器分为全局拦截器和局部拦截器 全 ...
- k8s-secret用法
创建username和password文件: $ echo -n "admin" > ./username $ echo -n "1f2d1e2e67df" ...
- Python Socket套接字编程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- MySQL 并发事务问题以及事务的隔离级别
一.并发事务处理带来的问题 相对于串行处理,并发事务(InnoDB)处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多用户. 但并发事务处理也会带来一些问题,主要有一下几种 ...