hdu 4268 Alice and Bob(multiset|段树)
Alice and Bob
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2901 Accepted Submission(s): 941
of A is not smaller than B and the width of A is not smaller than B. As the best programmer, you are asked to compute the maximal number of Bob's cards that Alice can cover.
Please pay attention that each card can be used only once and the cards cannot be rotated.
For each case, the first line is a number N which means the number of cards that Alice and Bob have respectively. Each of the following N (N <= 100,000) lines contains two integers h (h <= 1,000,000,000) and w (w <= 1,000,000,000) which means the height and
width of Alice's card, then the following N lines means that of Bob's.
2
2
1 2
3 4
2 3
4 5
3
2 3
5 7
6 8
4 1
2 5
3 4
1
2
pid=4273" target="_blank">4273
4270 4269(n<=1e5)如今A想用自己的矩形覆盖B的矩形。一个矩形覆盖还有一个矩形的条件是宽和高都不还有一个矩形相应的宽和高小。如今问A最多能覆盖B的多少个矩形。每一个矩形最多覆盖一个还有一个矩形。且矩形不能旋转。
然后对于A的每个矩形。找一个w<=自己w.h<自己H且尽量接近的B的矩形覆盖即可了。
覆盖后删除这两个矩形。对于找上述条件的矩形能够用multiset维护。
可是比赛时换了种姿势用线段树写了发。
思路都差点儿相同。离散化。维护区间和。找小于等于p且最靠右的位置。
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define lson L,mid,ls
#define rson mid+1,R,rs
const int maxn=100010;
int num[maxn<<3];//离散化后有2*n忘了改大空间了。 坑
struct node
{
int w,h;
} ag[maxn],bg[maxn];
int H[maxn<<1];
inline bool cmp(const node &a,const node &b)
{
if(a.w==b.w)
return a.h<b.h;
return a.w<b.w;
}
void build(int L,int R,int rt)
{
num[rt]=0;
if(L==R)
return ;
int ls=rt<<1,rs=ls|1,mid=(L+R)>>1;
build(lson);
build(rson);
}
void update(int L,int R,int rt,int p,int d)
{
if(L==R)
{
num[rt]+=d;
return;
}
int ls=rt<<1,rs=ls|1,mid=(L+R)>>1;
if(p<=mid)
update(lson,p,d);
else
update(rson,p,d);
num[rt]=num[ls]+num[rs];
}
int qu(int L,int R,int rt,int p)
{
if(!num[rt])
return -1;
if(L==R)
return L;
int ls=rt<<1,rs=ls|1,mid=(L+R)>>1,pos=-1;
if(p<=mid)
return qu(lson,p);
if(num[rs])
pos=qu(rson,p);
if(pos!=-1)
return pos;
return qu(lson,p);
}
int main()
{
int t,n,i,m,p,ans; scanf("%d",&t);
while(t--)
{
m=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&ag[i].h,&ag[i].w);
H[m++]=ag[i].h;
}
for(i=0;i<n;i++)
{
scanf("%d%d",&bg[i].h,&bg[i].w);
H[m++]=bg[i].h;
}
sort(ag,ag+n,cmp);
sort(bg,bg+n,cmp);
sort(H,H+m);
m=unique(H,H+m)-H;
build(1,m,1);
ans=p=0;
for(i=0;i<n;i++)
{
while(p<n&&bg[p].w<=ag[i].w)
update(1,m,1,lower_bound(H,H+m,bg[p].h)-H+1,1),p++;
int pos=qu(1,m,1,lower_bound(H,H+m,ag[i].h)-H+1);
if(pos!=-1)
{
ans++;
update(1,m,1,pos,-1);
}
}
printf("%d\n",ans);
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
hdu 4268 Alice and Bob(multiset|段树)的更多相关文章
- HDU 4268 Alice and Bob(贪心+Multiset的应用)
题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形能够覆盖还有一个矩形的条件的是,本身长度大于等于还有一个矩形,且宽度大于等于还有一个矩形.矩形不可旋转.问你Alice最多能覆盖Bo ...
- hdu 4268 Alice and Bob
Alice and Bob Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- HDU 4268 Alice and Bob 贪心STL O(nlogn)
B - Alice and Bob Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...
- hdu 4268 Alice and Bob(贪心+multiset)
题意:卡牌覆盖,每张卡牌有高(height)和宽(width).求alice的卡牌最多可以覆盖多少bob的卡牌 思路:贪心方法就是找h可以覆盖的条件下找w最大的去覆盖. #include<ios ...
- HDU 4268 Alice and Bob set用法
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4268 贪心思想,用set实现平衡树,但是set有唯一性,所以要用 multiset AC代码: #i ...
- hdu 3660 Alice and Bob's Trip(树形DP)
Alice and Bob's Trip Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu 4111 Alice and Bob 记忆化搜索 博弈论
Alice and Bob Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 5054 Alice and Bob(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5054 Problem Description Bob and Alice got separated ...
- hdu 4111 Alice and Bob(中档博弈题)
copy VS study 1.每堆部是1的时候,是3的倍数时输否则赢: 2.只有一堆2其他全是1的时候,1的堆数是3的倍数时输否则赢: 3.其他情况下,计算出总和+堆数-1,若为偶数,且1的堆数是偶 ...
随机推荐
- Static关键字的作用及使用
1.使用static声明属性 如果希望一个属性被所有对象共同拥有,可以将其声明为static类型. 声明为static类型的属性或方法,此属性或方法也被称为类方法,可以由类名直接调用. class P ...
- Objective-C中经常使用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect
Objective-C中经常使用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect 1 NSRange NSRange 的原型为 typedef struct _N ...
- extjs desktop startmenu (開始菜单)
extjs desktop 的開始菜单 二级菜单,仅仅是简单演示实现原理,如 须要动态生成,自己改造就可以,下面基本方法原理: 首先 建立一个js文件 生成開始菜单数据: function Get ...
- hdu 1070Milk
地址链接:http://acm.hdu.edu.cn/showproblem.php?pid=1070 题意:多看几遍,学着静下来心去看英文题 代码: #include<bits/stdc++. ...
- codeforces584B Kolya and Tanya
题目链接:http://codeforces.com/problemset/problem/584/B 解题思路:当n=1时,_______ _______ ______ 三个数每位上可以 ...
- 学习日记之命令模式和Effective C++
命令模式(Command): 讲一个请求封装为一个对象.从而使你可用不同的请求对客户进行參数化.对请求队列或记录请求日志.以及支持可撤销的操作. 命令模式长处: (1),它能较easy地设计一个命令队 ...
- 算法起步之Prim算法
原文:算法起步之Prim算法 prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下. prim算法的安全边是从与当前生成树相连接的边中选择 ...
- 以正确的方式开源 Python 项目 - 技术翻译 - 开源中国社区
以正确的方式开源 Python 项目 - 技术翻译 - 开源中国社区 以正确的方式开源 Python 项目 英文原文:Open Sourcing a Python Project the Right ...
- 陈词滥调,正确使用memset
前项目发现一个问题,计划永远是一个dynamic_cast当一个异常动态转换,搜索了半天才发现问题竟然是在memset使用,见.但当处于几十万行代码量级中时,就变得不太那么easy定位了. 本文归纳了 ...
- SPOJ 7001(莫比乌斯反演)
传送门:Visible Lattice Points 题意:0<=x,y,z<=n,求有多少对xyz满足gcd(x,y,z)=1. 设f(d) = GCD(a,b,c) = d的种类数 : ...