poj1065 Wooden Sticks[LIS or 贪心]
地址戳这。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 贪心]的更多相关文章
- HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)
嘤嘤嘤,实习半年多的小蒟蒻的第一篇博客(题解) 英文的: There is a pile of n wooden sticks. The length and weight of each stick ...
- POJ-1065 Wooden Sticks,排序+最长单减子序列!
Wooden Sticks 题意:有一台机器处理木材,最开始需要一分钟准备,如果后面处理的木材比前 ...
- POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)
描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于 第i个处理的木棒,那么将不会耗费时间,否则 ...
- POJ1065(Wooden Sticks)--贪心
木棍 时间限制: 1000MS 内存限制: 10000K 提交总数: 27336 接受: 11857 描述 有一堆木棍.每根杆的长度和重量是预先已知的.这些木棍将由木工机器逐一加工.它需要一些 ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDOJ-1051 Wooden sticks(贪心)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 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 ...
- 1270: Wooden Sticks [贪心]
点击打开链接 1270: Wooden Sticks [贪心] 时间限制: 1 Sec 内存限制: 128 MB 提交: 31 解决: 11 统计 题目描述 Lialosiu要制作木棍,给n根作为原料 ...
- HDOJ.1051 Wooden Sticks (贪心)
Wooden Sticks 点我挑战题目 题意分析 给出T组数据,每组数据有n对数,分别代表每个木棍的长度l和重量w.第一个木棍加工需要1min的准备准备时间,对于刚刚经加工过的木棍,如果接下来的木棍 ...
随机推荐
- [ACM] POJ 1068 Parencodings(模拟)
Parencodings Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19352 Accepted: 11675 De ...
- linux init->upstart->systemd
http://en.wikipedia.org/wiki/Init init From Wikipedia, the free encyclopedia This article is abo ...
- Lua学习五----------Lua循环
© 版权声明:本文为博主原创文章,转载请注明出处 1.循环类型 1.1 while循环 - 语法:while(condition) do ...<执行语句> end - 解析:判断cond ...
- ExtJs5.1多选下拉框CheckComb
ExtJs这么多个版本号了.可就是不提供多选下拉框,老外不用这个玩意吗? 5都出来这么久了,新写的项目就用5吧,把曾经Extjs4.2的时搜到前人的CheckComb改巴改巴.能用了就赶紧贴上来,没有 ...
- OpenCV实现图像颜色特征提取
https://github.com/ictlyh/ImageFeature 链接:http://pan.baidu.com/s/1mhUoPxI 密码:3cnn
- BZOJ 2005 NOI2010 能量採集 数论+容斥原理
题目大意:给定n和m.求Σ(1<=i<=n)Σ(1<=j<=m)GCD(i,j)*2-1 i和j的限制不同,传统的线性筛法失效了.这里我们考虑容斥原理 令f[x]为GCD(i, ...
- js 第一篇(常用交互方法)
1. cocument.write("content") //向html 直接写入内容 2. alert("content") // 警告对话框 3. conf ...
- 编译webrtc for android库与apk
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH=`pwd`/depot_t ...
- hdu 5538 House Building(长春现场赛——水题)
题目链接:acm.hdu.edu.cn/showproblem.php?pid=5538 House Building Time Limit: 2000/1000 MS (Java/Others) ...
- ASP.NET动态网站制作(9)-- JQ(1)
前言:从这节课开始讲jQuery的相关内容,这节课主要围绕jQuery的选择器展开. 内容: 1.jQuery是一个优秀的js框架,目前企业里大多数都是用jQuery(以下简称jq).jq是对js里一 ...