地址戳这。N根木棍待处理,每根有个长x宽y,处理第一根花费1代价,之后当处理到的后一根比前一根长或者宽要大时都要重新花费1代价,否则不花费。求最小花费代价。多组数据,N<=5000


本来是奔着贪心来做的。首先按照套路想到排序,长优先宽再次从小到大。由于要不浪费,尽量按照顺序去找,第一次把花费仅为1的最长子序列抽出来,标记之后,再循环找下一个未被标记的最长子序列保证只花费1,这样应该是最优的。但是鉴于$N$的范围和多组数据没敢这样做,虽然后来发现数据水这样也可以过。然后瞎想到把数对$(x,y)$抽象成点,就在坐标系中用尽量少的y值单调不减的折线去覆盖上所有点。而x值天然有一个从小到大的顺序,那不就二维偏序么,再说直白一点,就是x看成下标,y看成值,找不下降子序列的最少个数的说。这个求min不下降子序列根据Dilworth定理可知,它求的就是个最长下降子序列长度,这个只能当结论记因为我也不会证233。所以就可以上$O(nlogn)$算法啦,就不怕他多组数据了。x值相同的注意一点就行,按y从小到大dp(想一想为什么)。

维护这个这次用了树状数组因为之前没在这上面用过,发现真好写又好用啊。以y值为树状数组下标,每次找比i的a[i]小的就在0~a[i]-1这个树状数组区间内找最大值即可,最大值维护也很简单,和sum差不多(不过BIT只可以维护从1到i的,若维护区间的可能要麻烦一点),看code,或者自己画个BIT模拟一下就发现是可以维护的。

BIT维护MAXMIN的之前没写过,其实常数蛮小的,希望以后记得使用。

Upd:有关dilworth定理的详细举例:

  • 最少不上升子序列的划分数=最长上升子序列长度
  • 最少上升子序列的划分数=最长不上升子序列长度
  • 最少不下降子序列的划分数=最长下降子序列长度
  • 最少下降子序列的划分数=最长不下降子序列长度

也就是怎么用都行。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define dbg(x) cerr<<#x<<" = "<<x<<endl
#define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+;
pii a[N];
int C[N<<];
int T,n,y,f,ans;
inline int Query(int x){int ret=;for(;x;x-=lowbit(x))MAX(ret,C[x]);return ret;}
inline void Add(int x,int val){for(;x<=y;x+=lowbit(x))MAX(C[x],val);} int main(){//freopen("test.in","r",stdin);freopen("test.out","w",stdout);
read(T);while(T--){
read(n);for(register int i=;i<=n;++i)read(a[i].first),MAX(y,read(a[i].second));
sort(a+,a+n+);memset(C,,sizeof C);
for(register int i=n;i;--i)MAX(ans,f=Query(a[i].second-)+),Add(a[i].second,f);
printf("%d\n",ans);ans=y=;
}
return ;
}

poj1065 Wooden Sticks[LIS or 贪心]的更多相关文章

  1. HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)

    嘤嘤嘤,实习半年多的小蒟蒻的第一篇博客(题解) 英文的: There is a pile of n wooden sticks. The length and weight of each stick ...

  2. POJ-1065 Wooden Sticks,排序+最长单减子序列!

                                                       Wooden Sticks 题意:有一台机器处理木材,最开始需要一分钟准备,如果后面处理的木材比前 ...

  3. POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)

    描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于 第i个处理的木棒,那么将不会耗费时间,否则 ...

  4. POJ1065(Wooden Sticks)--贪心

    木棍 时间限制: 1000MS   内存限制: 10000K 提交总数: 27336   接受: 11857 描述 有一堆木棍.每根杆的长度和重量是预先已知的.这些木棍将由木工机器逐一加工.它需要一些 ...

  5. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. HDOJ-1051 Wooden sticks(贪心)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. POJ 1065 Wooden Sticks (贪心)

    There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The st ...

  8. 1270: Wooden Sticks [贪心]

    点击打开链接 1270: Wooden Sticks [贪心] 时间限制: 1 Sec 内存限制: 128 MB 提交: 31 解决: 11 统计 题目描述 Lialosiu要制作木棍,给n根作为原料 ...

  9. HDOJ.1051 Wooden Sticks (贪心)

    Wooden Sticks 点我挑战题目 题意分析 给出T组数据,每组数据有n对数,分别代表每个木棍的长度l和重量w.第一个木棍加工需要1min的准备准备时间,对于刚刚经加工过的木棍,如果接下来的木棍 ...

随机推荐

  1. hdu5386(暴力)

    题意: 给出两个n*n的矩阵,一个作为初始矩阵.一个作为目标矩阵,给出m个操作,操作有两种,一种是"L,x,y".代表我们要把x这一行赋成y,还有一种是"H,x,y&qu ...

  2. Angular 一些问题(跨域,后台接收不到参数)

    1,跨域:跟前端没多大关系的,后台没设置头而已.这时候如果你们后端太菜你可以叫他加上每种语言 都不同,但是里面的呢荣是一样的.具体跨域可以跳转这里http://www.cnblogs.com/dojo ...

  3. 30天自制操作系统(二)汇编语言学习与Makefile入门

    1 介绍文本编辑器 这部分可直接略过 2 继续开发 helloos.nas中核心程序之前的内容和启动区以外的内容先不讲了,因为还涉及到一些软盘方面的知识. 然后来讲的是helloos.nas这个文件 ...

  4. 【转】Android中的Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  5. 【Scala】Scala的Predef对象

    隐式引用(Implicit Import) Scala会自己主动为每一个程序加上几个隐式引用,就像Java程序会自己主动加上java.lang包一样. Scala中.下面三个包的内容会隐式引用到每一个 ...

  6. gridcontrol 之标题 GroupPanel设置 (标题设置,屏蔽右键)

    GroupPanel设置 例如gridcontrol显示标题:“gridcontrol小例子” gridView1.GroupPanelText="gridcontrol小例子"; ...

  7. JAVA Socket基础(简单实现)

    学习Socket需要了解的几个概念: Socket 指的是互联网连接中的各个终结点.互联网连接是怎么创建的,通过IP地址加端口号,进行互通. A电脑(192.168.3.125:80)>> ...

  8. JS dom最常用API

    //document方法:    var cont = document.getElementByIdx_x('cont'); //className给标签添加class    cont.classN ...

  9. indows下PHP通过ffmpeg给上传的视频截图详解

    windows下PHP通过ffmpeg给上传的视频截图详解,php_ffmpeg.dll安装下载,找了很久php_ffmpeg.dll的下载地址和应用,发现有用的资源很少,现在问题解决了,贴出来跟大家 ...

  10. Qt — tableWidget插入复选框

    之前不太了解Qt中的相关控件,一直尝试直接在tableview上增加复选框. 但相对来说,在tableview增加复选框的工作量与麻烦程度远超tableWidget. 接下来是如何在Qt的tableW ...