UVA11020 Efficient Solutions】的更多相关文章

思路 先判断一个点能不能插入,能插入的话删除所有因为它而没有优势的点 注意 写 S.erase(it); it++; 会RE 要写 S.erase(it++); 代码 #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; multiset<pair<int,int> > S; int n; int ma…
UVA 11020 - Efficient Solutions 题目链接 题意:每个人有两个属性值(x, y).对于每个人(x,y)而言,当有还有一个人(x', y'),假设他们的属性值满足x' < x, y' <= y或x' <= x, y' < y的话,这个人会失去优势,每次加入一个人,并输出当前优势人个数 思路:因为每一个人失去优势后,不可能再得到优势,所以失去优势就能够当成删去这些点,这种话.就能够用一个multiset来维护点集.每次增加一个点,利用lowerbound.…
一.题面 UVA11020 二.分析 最近脑子有点不好使吧,这题还想了很久. 对于给定的两个值要满足题面中的条件,那么我们可以把这两个值转化到平面中的坐标去理解. 首先,需要考虑的是维护的所有点其实是一个严格有序的,画个图就可以理解了. 此时,在维护的所有点的基础上,如果来了一个点,我们可以先考虑x坐标. 如果这个点x值比所有维护的点中最小的x值还小,那么它必然是有效的,之间加入,再删除后面被这个点控制的点. 如果这个点的y值比在象限中它前面(相对于x)的点的y值要大,那就不需要加入了,因为被它…
题目传送门 题意:训练指南P228 分析:照着书上的做法,把点插入后把它后面不占优势的点删除,S.size ()就是优势的人数,时间复杂度O (nlogn) #include <bits/stdc++.h> using namespace std; struct Point { int a, b; Point() {} Point(int a, int b) : a (a), b (b) {} bool operator < (const Point &r) const { re…
题意:有n个人,每个人有x.y两个属性,每次输入一个人(x,y).如果当前不存在一个人(x`,y`)的属性满足x`<=x,y`<y或者x`<x,y`<=y,就说这个人是有优势的.每次输入时要求输出当前有多少个人是有优势的. 思路:平衡二叉树. 一个人一旦失去优势就再也不可能得到优势.可以用multiset来存优势人群(因为可能出现x和y完全相同的人).对于每次输入的人,二分寻找第一个满足?<=x的人,记为(x`,y`),如果y>=y`,那么该人是没有优势的,可以忽略.其…
链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1961 训练指南page228 #include <cstdio> #include <set> using namespace std; struct Point { int a, b; bool operator < (const Point &…
题意:给你n个人,有两个属性x.y,如果不存在另外一个人x2,y2满足 x2<=x,y2<y 或者 x2<x,y2<=y,那么就称这个人是有优势的,每次给你一个人得信息,问你当前有优势的人的人数是多少? 思路:刘汝佳训练指南P228 mutiset+lower_bound+upper_bound #include<cstdio> #include<cstring> #include<algorithm> #include<set> #…
本题利用multiset解决.根据题意,如果我们用P(x,y)表示一个人,因为人可以相同,所以用multiset.我们会发现,如果所有人群都是有优势的,那么这些点呈现一个递减的趋势.如果刚刚插入一个人,他是否有优势该如何判断呢?只需要看他左边相邻的点的y坐标是否比他小即可.而如果这个人是有优势的,那么需要先把这个人插入到集合中,然后从upper_bound(P)开始,逐个删除没有优势的点,注意删除时候应写为s.erase(it++),因为删除时候会导致指针向左移动一位,因此还需要it++.这样,…
题意:给按顺序给定 n 个人群,用x和y来描述,如果有没有任何一个x' < x y' <= y 或 x '<= x y' <= y,那么这个群体就是优势群体, 让你求出每放入一个人群,已经知道的群体有几个优势群体. 析:首先我们知道的是,如果某个群体失去了优势,那么该群体就不可能再获得优势,然后我们把已经得到的优势群体按x 从小到大排序, 那么得到曲线是一个向下的也就是严格递减的,所以我们就可以用multiset来维护所有的优势群体,然后我们考虑每加入一个群体, 如果在坐标上画出来…
把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点. 那么所有有优势的点将会形成一条下凹的曲线. 因为可能有重点,用multiset,按照x优先,相同时再比较y的顺序排序,动态维护满足条件的总人数. 当新加的P点的y坐标大于左边的点的时候没有优势,忽略,用lower_bound判断一下. 当新加的P点有优势,但是可能使得其他的的点失去优势,依次把后面的点不满足条件的点删除. 红黑树好复杂. #include<bits/stdc…