hdu--(1025)Constructing Roads In JGShining's Kingdom(dp/LIS+二分)
Constructing Roads In JGShining's Kingdom
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16047 Accepted Submission(s): 4580
Problem Description
JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in two parallel lines. Half of these cities are rich in resource (we call them rich cities) while the others are short of resource (we call them poor cities). Each poor city is short of exactly one kind of resource and also each rich city is rich in exactly one kind of resource. You may assume no two poor cities are short of one same kind of resource and no two rich cities are rich in one same kind of resource. With the development of industry, poor cities wanna import resource from rich ones. The roads existed are so small that they're unable to ensure the heavy trucks, so new roads should be built. The poor cities strongly BS each other, so are the rich ones. Poor cities don't wanna build a road with other poor ones, and rich ones also can't abide sharing an end of road with other rich ones. Because of economic benefit, any rich city will be willing to export resource to any poor one. Rich citis marked from 1 to n are located in Line I and poor ones marked from 1 to n are located in Line II. The location of Rich City 1 is on the left of all other cities, Rich City 2 is on the left of all other cities excluding Rich City 1, Rich City 3 is on the right of Rich City 1 and Rich City 2 but on the left of all other cities ... And so as the poor ones. But as you know, two crossed roads may cause a lot of traffic accident so JGShining has established a law to forbid constructing crossed roads. For example, the roads in Figure I are forbidden.
In order to build as many roads as possible, the young and handsome king of the kingdom - JGShining needs your help, please help him. ^_^
Input
Each test case will begin with a line containing an integer n(1 ≤ n ≤ 500,000). Then n lines follow. Each line contains two integers p and r which represents that Poor City p needs to import resources from Rich City r. Process to the end of file.
Output
For each test case, output the result in the form of sample. You should tell JGShining what's the maximal number of road(s) can be built.
Sample Input
2 1 2 2 1 3 1 2 2 3 3 1
Sample Output
Case 1: My king, at most 1 road can be built. Case 2: My king, at most 2 roads can be built.
Hint
Huge input, scanf is recommended.
Author
JGShining(极光炫影)
这道题,意思很明了,每一个点对应一个点,不存在一个点对多个点的情况,也不存在多个点对一个点的情况,且不能存在相交线。
问你连那些点使得线条最多。
又给出的a b,我们不难构造出str[a]=b,a为1 -n 给的升序,所以我们只需要对于str[a]这个数组内的值进行单调递增子序列处理就可以了....简单明了
代码:
1 //#define LOCAL
2 #include<cstdio>
3 #include<cstring>
4 const int maxn=50005;
5 const int inf=0x3f3f3f3f;
6 int str[maxn],dp[maxn],sac[maxn];
7 int res;
8
9 int binary(int v,int n)
10 {
11 int ll=1,rr=n,mid;
12 while(ll<=rr)
13 {
14 mid=ll+(rr-ll)/2;
15 if(sac[mid]<=v&&sac[mid]!=-1)
16 ll=mid+1;
17 else
18 rr=mid-1;
19 }
20 return ll;
21 }
22 void LIS(int n)
23 {
24 res=1;
25 // for(int i=1;i<=n;i++)
26 // sac[i]=inf;
27 memset(sac,-1,sizeof(int)*(n+1));
28 for(int i=1;i<=n;i++)
29 {
30 dp[i]=binary(str[i],res);
31 if(res<dp[i])
32 res=dp[i];
33 if(str[i]<sac[dp[i]]||sac[dp[i]]==-1)
34 sac[dp[i]]=str[i];
35 }
36 }
37 int main()
38 {
39 #ifdef LOCAL
40 freopen("test.in","r",stdin);
41 #endif
42
43 int n,i,p,r,ct=1;
44 while(scanf("%d",&n)!=EOF)
45 {
46 for( i=1;i<=n;i++){
47 scanf("%d%d",&p,&r);
48 str[p]=r;
49 }
50 LIS(n);
51 printf("Case %d:n",ct++);
52 if(res==1)
53 printf("My king, at most 1 road can be built.n");
54 else
55 printf("My king, at most %d roads can be built.n",res);
56 printf("n");
57 }
58 return 0;
59 }
- 采用一个自创的"验证框架"实现对数据实体的验证[改进篇]
- Flash XSS检测脚本的简单实现
- 采用一个自创的"验证框架"实现对数据实体的验证[设计篇]
- 采用一个自创的"验证框架"实现对数据实体的验证[编程篇]
- 谈谈你最熟悉的System.DateTime[上篇]
- 12步轻松搞定Python装饰器
- 实用小工具,教你轻松转化Python通用数据格式
- 数据工程师常用的几个小工具(附python源代码)
- R语言的三种聚类方法
- 技能 | R语言的igraph画社交关系图示例
- 魔兽世界中招:一条命令行就能劫持你的游戏!
- R语言 apply函数家族详解
- 基于R语言的梯度推进算法介绍
- R语言数据可视化综合指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义View实现饼状图带动画效果
- Android音视频之视频采集(系统API预览)
- 在Node.js中使用Multer进行文件上传
- Android实现自动填充短信验证码功能
- django项目中新增app的2种实现方法
- 如何使用Node.js编辑XML文件
- Windows下安装yarn的三种方法
- python topk()函数求最大和最小值实例
- 详解Ubuntu环境下部署Django+uwsgi+nginx总结
- 如何从Node.js中的命令行读取输入
- pyqt5中动画的使用详解
- PyQt使用QPropertyAnimation开发简单动画
- 如何使用JavaScript漂亮地打印JSON对象
- Android使用AsyncTask加载图片的操作流程
- nodejs中post请求方式,req.body接值为空如何解决