Codeforces:"North-East"

Codeforces:"North-East"

题目链接:http://codeforces.com/gym/101246/problem/H

题目大意:空间内有$n$个点,现取$x$和$y$严格递增的点组成最长序列,问可能取到哪些点,一定取到哪些点.

DP

这道题要求的是二维LIS,可以按$x$递增排序将其降为一维,当横坐标相等时,因为要求坐标严格递增,按$y$递减排序。

从后面往前搞,$maxy[len]$记录LIS长度为$len$的点的最大$y$,若以当前点为结尾的LIS长度为$len$,当前点的$y$小于$maxy[len+1]$则为可能取到的点。

代码如下:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <vector>
 4 #include <set>
 5 #define N 100005
 6 using namespace std;
 7 struct node{
 8     int x,y,id;
 9     friend bool operator<(node a,node b){
10         if(a.x==b.x)return a.y>b.y;
11         return a.x<b.x;
12     }
13 }a[N];
14 const int inf=1000005;
15 int n,dp[N],val[N],k,pos[N],maxy[N];
16 vector<int>v[N];
17 set<int>A,B;
18 void init(){
19     freopen("input.txt","r",stdin);
20     freopen("output.txt","w",stdout);
21 }
22 bool cmp(int x,int y){
23     return val[x]>val[y];
24 }
25 void output(){
26     printf("%d",A.size());
27     for(set<int>::iterator it=A.begin();it!=A.end();++it)
28         printf(" %d",*it);
29     printf("\n");
30     printf("%d",B.size());
31     for(set<int>::iterator it=B.begin();it!=B.end();++it)
32         printf(" %d",*it);
33     printf("\n");
34 }
35 int main(void){
36     init();
37     scanf("%d",&n);
38     for(int i=0;i<n;++i){
39         scanf("%d%d",&a[i].x,&a[i].y);
40         a[i].id=i+1;
41     }
42     sort(a,a+n);
43     for(int i=0;i<n;++i){
44         int v=a[i].y;
45         int t=lower_bound(dp,dp+k,v)-dp;
46         dp[t]=v;
47         val[a[i].id]=a[i].y;
48         pos[a[i].id]=t;
49         if(t==k)k++;
50     }
51     for(int i=0;i<k;++i)
52         maxy[i]=-inf;
53     maxy[k]=inf;
54     for(int i=n-1;i>=0;--i){
55         int id=a[i].id;
56         int p=pos[id];
57         if(val[id]<maxy[p+1]){
58             A.insert(id);
59             maxy[p]=max(maxy[p],val[id]);
60             v[p].push_back(id);
61         }
62     }
63     for(int i=0;i<k;++i)
64         if((int)v[i].size()==1)
65             B.insert(v[i][0]);
66     output();
67 }
时间: 2024-11-06 17:54:11

Codeforces:"North-East"的相关文章

Codeforces:Diverse Permutation(找规律)

***********************************声明******************************* 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! ******************************************************************* time limit

Cesium原理篇:3最长的一帧之地形(2:高度图)

       这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面.        此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维护地形切片的相关逻辑:接着,在requestTileGeometry中,TileTerrain会请求对应该切片的地形数据.如果读者对这部分有疑问的话,可以阅读<Cesium原理篇:1最长的一帧之渲染调度>:最后,如果你是采用的高度图的地形服务,地形数据对应的是HeightmapTerrainDat

OC基础7:变量和数据类型

1.有时候初始化需要让对象带有初始值,那么可以定义另一个初始化方法来使用,比如: -(XCLASS *) initWith: (int) n { self = [super init]; if(self) { [self setFunction: n];  // setFunction方法是指XCLASS定义的赋值方法 } return self; } 这个方法的意思是:首先用父类的init方法先把对象初始化,然后用if(self)判断是否初始化成功(初始化成功则self不为空,判断条件成立:注

JavaSE学习55:GUI编程之布局管理器

一布局管理器概述 Java语言中,提供了布局管理器类的对象可以管理. 管理Component对象在Container对象中的布局,不必直接设置Component对象位置和大小.每个Container对象 都有一个布局管理器对象,当容器需要对某个组件进行特定或判断其大小尺寸时,就会调用其对应的布局管理器,调 用Container对象的setLayout()方法改变其布局管理器对象. AWT提供了5种布局管理器,分别为: FlowLayout布局管理器 BorderLayout布局管理器 GridL

java基础8:GUI

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

django “如何”系列3:如何编写模型域(model filed)

django自带很多的域类--CharField,DateField等等--,如果django的这些域都不能满足你精确的要求,那么你可以编写自己的模型域. django自带的域没有和数据库列类型一一对应的,只有简单的VARCHAR,INTEGER等类型,为了使用更复杂的类型,例如多边形,你可以定义你的域子类:或者,你可能有一个很复杂的对象,这个对象可以通过某些方法序列化标准的数据库列类型,那么你可以定义自己的域子类. 示例对象 创建自定义的域需要注意一些特别的问题,为了使问题更简单的得以阐述,我

使用 C# 开发智能手机软件:推箱子(七)

这是"使用 C# 开发智能手机软件:推箱子"系列文章的第七篇.在这篇文章中,介绍 Common/Step.cs 源程序文件. 1namespace Skyiv.Ben.PushBox.Common 2{ 3  enum Direction { None, East, South, West, North } // 方向: 无 东 南 西 北 4  public enum Action { None, Create, Edit, Delete } // 设计: 无 创建 编辑 删除 5

Codeforces K. Ice Skating(求强连通分量)

题目描述: Ice Skating time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Bajtek is learning to skate on ice. He's a beginner, so his only mode of transportation is pushing off from a snow drift t

【字源大挪移—读书笔记】 第三部分:字尾

[字源大挪移—读书笔记] 第三部分:字尾 [3 字尾:[3.1]名词字尾.[3.2]形容词字尾.[3.3]副词字尾.[3.4]动词字尾 [3.1]名词字尾(Noun) [3.1.1]表示[人]的字尾 -ain -aire -an -ian -ean -ese -ant -ent -ary -ate -ee {[备注]:和-er相反,表示"被……的人":} -eer -er -or -ar -ier -eur -ician -ist -ite -ive -man -on -ster -y