题目传送门(内部题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$分。


代码时刻

  1. #include<bits/stdc++.h>
  2. #define L(x) x<<1
  3. #define R(x) x<<1|1
  4. using namespace std;
  5. unordered_map<int,int>mp;
  6. struct rec{int a,b,w;}e[100001];
  7. int n;
  8. int cnt;
  9. int que[200001];
  10. long long tr[1000000],lz[1000000];
  11. bool cmp(rec a,rec b){return a.a+a.b<b.a+b.b;}
  12. void pushup(int x){tr[x]=max(tr[L(x)],tr[R(x)]);}
  13. void pushdown(int x)
  14. {
  15. tr[L(x)]+=lz[x];
  16. tr[R(x)]+=lz[x];
  17. lz[L(x)]+=lz[x];
  18. lz[R(x)]+=lz[x];
  19. lz[x]=0;
  20. }
  21. void add(int x,int l,int r,int L,int R,int w)
  22. {
  23. if(r<L||R<l)return;
  24. if(L<=l&&r<=R)
  25. {
  26. tr[x]+=w;
  27. lz[x]+=w;
  28. return;
  29. }
  30. int mid=(l+r)>>1;
  31. pushdown(x);
  32. add(L(x),l,mid,L,R,w);
  33. add(R(x),mid+1,r,L,R,w);
  34. pushup(x);
  35. }
  36. void upd(int x,int l,int r,int k,long long w)
  37. {
  38. if(l==r)
  39. {
  40. tr[x]=max(tr[x],w);
  41. return;
  42. }
  43. int mid=(l+r)>>1;pushdown(x);
  44. if(k<=mid)upd(L(x),l,mid,k,w);
  45. else upd(R(x),mid+1,r,k,w);
  46. pushup(x);
  47. }
  48. long long ask(int x,int l,int r,int L,int R)
  49. {
  50. if(r<L||R<l)return -0x3f3f3f3f3f3f3f3f;
  51. if(L<=l&&r<=R)return tr[x];
  52. int mid=(l+r)>>1;pushdown(x);
  53. return max(ask(L(x),l,mid,L,R),ask(R(x),mid+1,r,L,R));
  54. }
  55. int main()
  56. {
  57. scanf("%lld",&n);int top=0;
  58. for(int i=1;i<=n;i++)
  59. {
  60. scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
  61. que[++top]=e[i].a;que[++top]=e[i].b;
  62. }
  63. sort(que+1,que+top+1);
  64. for(int i=1;i<=top;i++)if(que[i]!=que[i-1])mp[que[i]]=++cnt;
  65. for(int i=1;i<=n;i++){e[i].a=mp[e[i].a];e[i].b=mp[e[i].b];}
  66. sort(e+1,e+n+1,cmp);
  67. for(int i=1;i<=n;i++)
  68. {
  69. long long flag=ask(1,1,cnt,1,min(e[i].a,e[i].b));
  70. add(1,1,cnt,e[i].a,e[i].b,e[i].w);
  71. upd(1,1,cnt,e[i].a,flag+e[i].w);
  72. }
  73. printf("%lld",tr[1]);
  74. return 0;
  75. }

rp++

[CSP-S模拟测试]:数对(线段树优化DP)的更多相关文章

  1. [CSP-S模拟测试]:bird(线段树优化DP)

    题目传送门(内部题89) 输入格式 第一行两个数$n$和$k$,分别表示小鸟的只数和$R$装弹时间.接下来$n$行,每行两个数$l,r$表示$n$只小鸟初始时的头和尾的$x$坐标. 输出格式 输出一个 ...

  2. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  3. 「10.29」数列(exgxd)·数对(线段树优化DP)·最小距离(最短路,树上直径思想)

    好久没碰到这么友好乱搞的题了.... A. 数列 考察的是exgcd的相关知识,最后的答案直接O(1)求即可 B. 数对 本来以为是原题,然后仔细看了看发现不是,发现不会只好乱搞骗分了 事实上直接按$ ...

  4. 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 ...

  5. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  6. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  7. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

  8. Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...

  9. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  10. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

随机推荐

  1. MARKDOWN使用文档

    ISSUE引用 引用当前项目内的ISSUE #1 markdown写法 #1 引用当前命名空间下的其他项目内的ISSUE projectname#1 sofa_ta#1 markdown写法 sofa ...

  2. js 获取ip和城市

    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>

  3. Javaweb实训-宠物医院-社区宠物医院的页面样式

    /* CSS Document */      /*        对于CSS来说  每一个元素默认的margin和padding就是0px.但是不同的浏览器会有一个默认的浏览器样式修改默认的marg ...

  4. mysql远程连接错误10038--navicat for mysql (10038)

    1.确定3306端口是否对外开放 如果是阿里云服务器,需要添加安全组规则 2.授权 执行sql,账号密码按照自己服务器而定 grant all privileges on *.* to 'root'@ ...

  5. Java的GUI框架如何选择? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot、BeautyEye框架(美观)?

    AWT 是swing的基础,运行良好,但缺少高级组件.如果您打算创建丰富的应用程序,那么AWT可能不是最好的方法.但是对于不需要丰富用户界面的较小gui应用程序来说.这可能非常适合,因为它是一个久经考 ...

  6. Linux Shell交互式自动化运维程序

    Expect是Linux操作系统下的一个用来处理交互操作,系统默认是没有安装expect库,所以执行expect会提示找不到命令,需要手动安装,其它安装也比较简单,可以通过二进制源码包编译配置进行安装 ...

  7. Linux 防火墙之TCP Wrappers

      1.TCPWrappers  原理 Telnet.SSH.FTP.POP和SMTP等很多网络服务都会用到TCPWrapper,它被设计为一个介于外来服务请求和系统服务回应的中间处理软件.     ...

  8. 对mysql进行快照复制

    Myself> flush tables with read lock; 之后开始创建快照 [root@server0 mysql]# lvcreate -L 100M -s -n dbback ...

  9. Interviewe HDU - 3486 (ST表+枚举 )(非二分,看下这个数据、)

    YaoYao has a company and he wants to employ m people recently. Since his company is so famous, there ...

  10. Codeforces Round #593 (Div. 2) C. Labs

    题目:https://codeforces.com/contest/1236/problem/C 思路:将 n ^ 2 个 lab 平分为 n 个 group group A 和 B 组成的 有序对 ...