hdu 1025 n*logn最长上升子序列
/*
TLE
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn=5e5+;
int a[maxn],b[maxn],c[maxn],f[maxn<<];
inline int max(int a,int b){return a>b?a:b;}
void swap(int &a,int &b){int t=a;a=b;b=t;}
void qsort(int l,int r)
{
if(l<r)
{
int key=b[l],i=l,j=r;
while(i!=j)
{
while(b[j]>=key && i<j) j--;
while(b[i]<=key && i<j) i++;
if(i<j) swap(b[i],b[j]);
}
b[l]=b[i];b[i]=key;
qsort(l,i-);
qsort(i+,r);
}
}
int binary_search(int l,int r,int val)
{
int mid;
while(l<=r)
{
mid=(l+r)>>;
if(c[mid]>val) r=mid-;
else if(c[mid]==val) return mid;
else l=mid+;
}
return -;
}
void updata(int pos,int v,int l,int r,int rt)
{
if(l==r)
{
f[rt]=v;return;
}
int mid=(l+r)>>;
if(pos<=mid) updata(pos,v,l,mid,rt<<);
else updata(pos,v,mid+,r,rt<<|);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
return f[rt];
int mid=(l+r)>>;
int ans;
if(L<=mid) ans=query(L,R,l,mid,rt<<);
if(R>mid) ans=max(ans,query(L,R,mid+,r,rt<<|));
return ans;
}
int main()
{
int icase=,n,tmp,i,cnt;
while(~scanf("%d",&n))
{
for(i=;i<=n;i++)
{
scanf("%d%d",&tmp,a+i);b[i]=a[i];
}
qsort(,n);cnt=;c[]=b[];
for(i=;i<=n;i++)
if(b[i]!=b[i-])
c[++cnt]=b[i];
memset(f,,sizeof(f));
int ans=,maxv,x;
for(i=;i<=n;i++)
{
x=binary_search(,cnt,a[i]);
if(x>) maxv=query(,x-,,cnt,);
else maxv=;
updata(x,maxv+,,cnt,);
if(maxv+>ans) ans=maxv+;
}
printf("Case %d:\n",++icase);
if(ans==) printf("My king, at most 1 road can be built.\n\n");
else printf("My king, at most %d roads can be built.\n\n",ans);
}
return ;
}
/*
2
1 2
2 1
3
1 2
2 3
3 1
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn=5e+;
int dp[maxn],f[maxn]; int upper_bound(int l,int r,int val)//二分求上界
{
int mid,ans=-;
while(l<=r)
{
mid=(l+r)>>;
if(dp[mid]>=val) ans=mid,r=mid-;
else l=mid+;
}
return ans;
} int main()
{
int icase=,n,i,cnt,x,y;
while(~scanf("%d",&n))
{
for(i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
f[x]=y;
}
dp[]=f[];cnt=;
for(i=;i<=n;i++)
{
x=upper_bound(,cnt,f[i]);
if(x==-) dp[++cnt]=f[i];
else dp[x]=f[i];
}
printf("Case %d:\n",++icase);
if(cnt==) printf("My king, at most 1 road can be built.\n\n");
else printf("My king, at most %d roads can be built.\n\n",cnt);
}
return ;
}
hdu 1025 n*logn最长上升子序列的更多相关文章
- HDU 1159 Common Subsequence 最长公共子序列
HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...
- HDU 1513 Palindrome(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个 ...
- hdu 1159 Common Subsequence(最长公共子序列 DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- HDU 3998 Sequence (最长上升子序列+最大流)
参考链接:http://www.cnblogs.com/gentleh/archive/2013/03/30/2989958.html 题意:求一个序列的最长上升子序列,及其个数(注意:两个最长上升子 ...
- HDU 4604 Deque 二分最长上升子序列
题目大意就是给一个deque 然后有n个数,依次进行操作,每种操作,你可以把这个数放在deque首部,也可以放在尾部,也可以扔掉不管,但是要保证deque中的数是非递减的.最要求deque中最长能是多 ...
- [ An Ac a Day ^_^ ] HDU 1257 基础dp 最长上升子序列
最近两天在迎新 看来只能接着水题了…… 新生培训的任务分配 作为一个有担当的学长 自觉去选了动态规划…… 然后我觉得我可以开始水动态规划了…… 今天水一发最长上升子序列…… kuangbin有nlog ...
- hdu 5748 Bellovin【最长上升子序列】
题目链接:https://vjudge.net/contest/148584#problem/A 题目大意: 解题思路:题目要求为:输出与已知序列的每一个元素的f(i)(f(i)的定义如题)相同的字典 ...
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...
- hdu 1080 dp(最长公共子序列变形)
题意: 输入俩个字符串,怎样变换使其所有字符对和最大.(字符只有'A','C','G','T','-') 其中每对字符对应的值如下: 怎样配使和最大呢. 比如: A G T G A T G - G ...
随机推荐
- CentOS 7+ 环境下安装MySQL
在CentOS中默认安装有MariaDB,但是我们需要的是MySQL,安装MySQL可以覆盖MariaDB MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 ...
- Mybatis 插入一条或批量插入 返回带有自增长主键记录
首先讲一下, 插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行, <dependency> <grou ...
- 该网页无法正常运作 目前无法处理此请求HTTP ERROR 500?
由于php.ini配置文件中错误显示关闭导致. 将下值由Off 变更为 On display_errors = On display_startup_errors = On
- GPIO实现I2C协议模拟(2)
接着上一节继续补充 结合上一节的描述 写Slave的过程如下(BYTE) 读Slave的过程如下(BYTE) 分为两段 第一段 ,写OFFSET,第二段读数据 WORD的方式与BYTE大同异 读行为 ...
- Air Pollution【空气污染】
Air Pollution Since the 1940s, southern California has had a reputation for smog. 自20世纪40年代以来,南加利福尼亚 ...
- g++编译器的使用(转载)
关于g++ g++ 是GNU组织开发出的编译器软件集合(GCC)下的一个C++编译器.它是Unix 和 Linux 系统下标配的 基于命令行的 C++编译器.如果你的系统是Windows,可以按照 ...
- The Moving Points - HDU - 4717 (模拟退火)
题意 二维空间中有\(n\)个运动的点,每个点有一个初始坐标和速度向量.求出一个时间\(T\),使得此时任意两点之间的最大距离最小.输出\(T\)和最大距离. 题解 模拟退火. 这个题告诉了我,初始步 ...
- 扩展程序 - Google Chrome
Adblock Plus 3.0.3 Adblock Plus 已被超过 1 亿台设备使用,是世界上最受欢迎的广告拦截软件. ID:cfhdojbkjhnklbpkdaibdccddilifddb 查 ...
- 编译Kubelet二进制文件
1. 环境 系统:CentOS 7.2 Go:1.10.3 Kubernetes:1.10.4 2. 安装最新版go 编译的Kubernetes 1.10.4要求go版本在1.9.3以上,使用下面的y ...
- POJ 2771 Guardian of Decency (二分图最大点独立集)
Guardian of Decency Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6133 Accepted: 25 ...