[CSP-S模拟测试]:数对(线段树优化DP)
题目传送门(内部题96)
输入格式
第一行一个整数$n$,接下来$n$行每行三个整数$a_i,b_i,w_i$。
输出格式
一行一个整数表示最大权值和。
样例
样例输入:
5
4 4 1
2 3 3
1 5 1
4 2 2
5 2 3
样例输出:
7
数据范围与提示
对于$10\%$的数据,$n\leqslant 8$。
对于$40\%$的数据,$n\leqslant 200$。
对于$70\%$的数据,$n\leqslant 3,000$。
对于$100\%$的数据,$1\leqslant n\leqslant 10^5 ,1\leqslant a_i,b_i,w_i\leqslant 10^9$。
题解
先来考虑如何选择最优,按$a_i+b_i$从小到大排序和按$min(a_i,b_i)$从小到大排序都能通过此题(我也不知道为什么)。
发现$a_i,b_i$只与其大小有关,而与其具体值无关,所以直接离散化就好了。
考虑$DP$,定义$dp[i][j]$表示选到第$i$个,$\min(a_i)$为$j$的最大贡献。
可以写出转移:
$$dp[i][j]=\max(dp[i-1][j])$$
$$dp[i][\max(j,a[i])]=\max(dp[i-1][j]+w[i])$$
显然无论是空间还是时间都不能容忍,考虑优化。
发现其实就是一个区间加的过程,于是可以用线段树优化。
时间复杂度:$\Theta(n\log cnt)$(其中$cnt$为不同的$a_i$和$b_i$的种数)。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
unordered_map<int,int>mp;
struct rec{int a,b,w;}e[100001];
int n;
int cnt;
int que[200001];
long long tr[1000000],lz[1000000];
bool cmp(rec a,rec b){return a.a+a.b<b.a+b.b;}
void pushup(int x){tr[x]=max(tr[L(x)],tr[R(x)]);}
void pushdown(int x)
{
tr[L(x)]+=lz[x];
tr[R(x)]+=lz[x];
lz[L(x)]+=lz[x];
lz[R(x)]+=lz[x];
lz[x]=0;
}
void add(int x,int l,int r,int L,int R,int w)
{
if(r<L||R<l)return;
if(L<=l&&r<=R)
{
tr[x]+=w;
lz[x]+=w;
return;
}
int mid=(l+r)>>1;
pushdown(x);
add(L(x),l,mid,L,R,w);
add(R(x),mid+1,r,L,R,w);
pushup(x);
}
void upd(int x,int l,int r,int k,long long w)
{
if(l==r)
{
tr[x]=max(tr[x],w);
return;
}
int mid=(l+r)>>1;pushdown(x);
if(k<=mid)upd(L(x),l,mid,k,w);
else upd(R(x),mid+1,r,k,w);
pushup(x);
}
long long ask(int x,int l,int r,int L,int R)
{
if(r<L||R<l)return -0x3f3f3f3f3f3f3f3f;
if(L<=l&&r<=R)return tr[x];
int mid=(l+r)>>1;pushdown(x);
return max(ask(L(x),l,mid,L,R),ask(R(x),mid+1,r,L,R));
}
int main()
{
scanf("%lld",&n);int top=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
que[++top]=e[i].a;que[++top]=e[i].b;
}
sort(que+1,que+top+1);
for(int i=1;i<=top;i++)if(que[i]!=que[i-1])mp[que[i]]=++cnt;
for(int i=1;i<=n;i++){e[i].a=mp[e[i].a];e[i].b=mp[e[i].b];}
sort(e+1,e+n+1,cmp);
for(int i=1;i<=n;i++)
{
long long flag=ask(1,1,cnt,1,min(e[i].a,e[i].b));
add(1,1,cnt,e[i].a,e[i].b,e[i].w);
upd(1,1,cnt,e[i].a,flag+e[i].w);
}
printf("%lld",tr[1]);
return 0;
}
rp++
[CSP-S模拟测试]:数对(线段树优化DP)的更多相关文章
- [CSP-S模拟测试]:bird(线段树优化DP)
题目传送门(内部题89) 输入格式 第一行两个数$n$和$k$,分别表示小鸟的只数和$R$装弹时间.接下来$n$行,每行两个数$l,r$表示$n$只小鸟初始时的头和尾的$x$坐标. 输出格式 输出一个 ...
- 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点
容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...
- 「10.29」数列(exgxd)·数对(线段树优化DP)·最小距离(最短路,树上直径思想)
好久没碰到这么友好乱搞的题了.... A. 数列 考察的是exgcd的相关知识,最后的答案直接O(1)求即可 B. 数对 本来以为是原题,然后仔细看了看发现不是,发现不会只好乱搞骗分了 事实上直接按$ ...
- Codeforces Round #426 (Div. 2) D 线段树优化dp
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
- 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...
- POJ 2376 Cleaning Shifts (线段树优化DP)
题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...
- Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)
Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...
- [AGC011F] Train Service Planning [线段树优化dp+思维]
思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...
- 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$
正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...
随机推荐
- python笔记——dict和set
学习廖雪峰python3笔记_dict和set dict__介绍 dict --> dictionary(字典)--> python内置 --> 使用键-值(key-value)存储 ...
- python3.6 使用newspaper库的Article包来快速抓取网页的文章或者新闻等正文
我主要是用了两个方法来抽去正文内容,第一个方法,诸如xpath,css,正则表达式,beautifulsoup来解析新闻页面的时候,总是会遇到这样那样各种奇奇怪怪的问题,让人很头疼.第二个方法是后面标 ...
- 动态代理之JDK 和 CGLIB
方式一:jdk动态代理 通过proxy类的newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHand ...
- 响应式前端框架Bootstrap系列(11)分页
分页功能已经封装成一个独立的js文件,也是用bs完成的,名称为bootstrap-paginator.js. 使用前先导入文件 : <script src="../libs/boots ...
- js实现简单进度条
主要用到的 offsetWidth 属性,定时器. <!DOCTYPE html> <html> 3 <head> <meta http-equiv=&quo ...
- random 方法 生成随机数
Math.random() 生成 大于等于0.0 且小于 1.0 的double 型随机数 ( 0.0 <= Math.random() < 1.0 ) 可以使用它便携简单了表达式,生成任 ...
- zabbix修改默认字体
在zabbixweb界面里有时候显示界面为框框 所以修改默认字体 现在windows里 随便找个字体: win+R 搜fonts 然后随便复制了一个字体,传到zabbix服务器里 cp calib ...
- PAT Basic 1039 到底买不买 (20 分)
小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...
- PAT Basic 1029 旧键盘 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...
- java 基本包
1. import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java ...