vijos P1638 抢救文件
2015-07-17 10:26
267 查看
发现这个题库里面的题目理解起来好费劲。
这个算是一个二维LIS吧。
这个算是一个二维LIS吧。
/* vojis P1638抢救文件 题意:通道大小为x(长)*y(宽)[应该是数据原因,这个x,y好像并没有什么用,应该是用来判别 陷阱是否超出通道,好像数据都没有超出。] 有n个陷阱,陷阱的d,c分别为陷阱所在的坐标系的位置(把通道看出坐标系,则陷阱位置为(c,d)) 每个陷阱不能出现交叉(简单来说就是要保持上升[二维LIS问题] 解法:sort+LIS (n*longn) */ #include<iostream> #include<algorithm> using namespace std; const int MAXN=500005; struct Node { long long int d; long long int c; }; Node a[MAXN]; Node dp[MAXN]; bool cmp(Node a,Node b) { if(a.c==b.c) { return a.d>b.d; } else { return a.c<b.c; } } int main() { long long int x,y; int n; cin>>x>>y>>n; for(int i=1;i<=n;i++) { cin>>a[i].c>>a[i].d; } sort(a+1,a+n+1,cmp); int top=0; dp[0].c=0,dp[0].d=0; for(int i=1;i<=n;i++) { if((a[i].c>=dp[top].c)&&(a[i].d>=dp[top].d)) { top++; dp[top].c=a[i].c; dp[top].d=a[i].d; } else { int l=1,r=top,mid; while(l<=r) { mid=(l+r)/2; if ((a[i].c >= dp[mid].c)&&(a[i].d>=dp[mid].d)) { l = mid + 1; } else { r = mid - 1; } } dp[l].c=a[i].c; dp[l].d=a[i].d; } } cout<<top<<endl; return 0; }
相关文章推荐
- Unity3D不同版本及发布平台编写专用的程式码
- Unity3D的四种坐标系
- 【字符串操作】 寻找两个字符串中的 最大公共子串
- 在 ASP.NET 中执行 URL 重写的方法
- linux top
- Tomcat 启动错误!
- 阿里面试题总结
- 利用NSInvocation对方法进行抽象,实现对方法的加锁
- Linux中阻塞函数的超时处理
- JS高级程序设计9-客户端检测
- 杭电 1016
- Unity3D 编译发布(Publishing Builds)
- Unity3D引用dll打包发布的问题及解决
- eclipse link方式安装插件
- Linux平台不同解压缩命令的用法
- C++将string转化成字符串数组
- Python strip、lstrip和rstrip的用法
- 阿里面试题总结
- 队列小记二之环形结构
- apache服务器下载、安装、配置