zoj 3299 Fall the Brick
来源:互联网 发布:java并行任务框架 编辑:程序博客网 时间:2024/04/30 09:59
Now the God is very angry, so he wants to punish the lazy, greedy humans. He chooses to throw some lines of bricks (just down from the very high Heaven). These days the God lives in a 2D world, so he just throw the bricks in a vertical plane. Each time, the God throws a line of bricks. The width of each brick is 1, and the length will be given.
t__nt is a hero in the world and he is trying his best to save the world. Now he has made m horizontal boards in the air with his magic power to stop the bricks. If one brick falls onto a board, it can not fall down any more. Notice that, for a line of bricks, consecutive bricks are not connected. So when some bricks touch a board, the others will continues to fall down. Now, t__nt wants to know how many bricks each board holds after the God's crazy action. He asks you, an ACMer, to help him.
Input
There are no more then 10 cases. There is a blank line between consecutive cases. The first line of each case contains two integers n, m (0 < n, m <= 100000), indicating the number of lines of bricks and number of horizontal boards made by t__nt. n lines follow, each contains two integers li, ri (0 <= li < ri <= 30000000). li and ri is the x-coordinates for the left side and the right side of the line of bricks. m lines follow, each contains three integers ai, bi, and hi (0 <= ai < bi <= 30000000; 0 < hi < 1000000000), which means that board i is at height hi and the extreme points are ai and bi. You may assume no two boards with same height will overlap with each other.
Output
For each case, print m lines. The ith line means the number of bricks on board i at last. Print a blank line after each case.
Sample Input
1 21 81 5 83 7 6
Sample Output
42题意:天空中掉下来n个bricks,你用m个boards去接,已知brick的左右端点,board的左右端点以及高度,并且一块brick不是连续的,求每块board接到的brick数量。
首先离散化坐标,然后根据离散化的坐标,把整个座标轴分成了一段一段的,以这些段为线段树的叶子节点,建树,每个brick就是对应区间+1,查询的时候,需要在查的同时把合适的区间置0。
#include <stdio.h>#include <string.h>#include <iostream>#include <string>#include <queue>#include <stack>#include <map>#include <vector>#include <stdlib.h>#include <algorithm>using namespace std;typedef long long ll;#define rep(i,s,t) for(int i=s;i<t;i++)#define red(i,s,t) for(int i=s-1;i>=t;i--)#define ree(i,now) for(int i=head[now];i!=-1;i=edge[i].next)#define clr(a,v) memset(a,v,sizeof a)#define L t<<1#define R t<<1|1#define MID int mid=(l+r)>>1#define max(a,b) (a<b?b:a)#define min(a,b) (a<b?a:b)#define SQR(a) ((a)*(a))inline int input(){int ret=0;bool isN=0;char c=getchar();while(c<'0' || c>'9'){if(c=='-') isN=1;c=getchar();}while(c>='0' && c<='9'){ret=ret*10+c-'0';c=getchar();}return isN?-ret:ret;}inline void output(ll x){ if(x<0){ putchar('-');x=-x; } int len=0,data[20]; while(x){ data[len++]=x%10;x/=10; } if(!len) data[len++]=0; while(len--) putchar(data[len]+48); putchar('\n'); } const int MAXN=100001;int to[MAXN<<2],cnt,a[MAXN<<2];ll sum[MAXN<<4];int lazy[MAXN<<4];int len[MAXN<<4];ll ans[MAXN],A;int n,m;struct BRICKS{int x,y;void read(){x=input(),y=input();//y--;to[++cnt]=x,to[++cnt]=y;}}b[MAXN];struct BOARDS{int x,y,h,id;void read(int _i){x=input(),y=input(),h=input();//y--;to[++cnt]=x,to[++cnt]=y;}}bo[MAXN];bool cmp(BOARDS i,BOARDS j){return i.h>j.h;}inline void push_up(int t){sum[t]=sum[L]+sum[R];}inline void push_down(int t){if(lazy[t]){lazy[L]+=lazy[t];lazy[R]+=lazy[t];sum[L]+=(ll)lazy[t]*(ll)len[L];sum[R]+=(ll)lazy[t]*(ll)len[R];lazy[t]=0;}}inline void build(int t,int l,int r){lazy[t]=0;sum[t]=0;if(l==r){len[t]=a[l];}else{MID;build(L,l,mid);build(R,mid+1,r);len[t]=len[L]+len[R];}}inline void add(int t,int l,int r,int x,int y,int v){if(l>=x && r<=y){lazy[t]+=v;sum[t]+=v*len[t];}else{push_down(t);MID;if(y<=mid) add(L,l,mid,x,y,v);else if(x>mid) add(R,mid+1,r,x,y,v);else{add(L,l,mid,x,mid,v);add(R,mid+1,r,mid+1,y,v);}push_up(t);}}inline void query(int t,int l,int r,int x,int y){if(sum[t]<=0) return;if(l>=x && r<=y){A+=sum[t];lazy[t]=0;sum[t]=0;return;}push_down(t);MID;if(y<=mid) query(L,l,mid,x,y);else if(x>mid) query(R,mid+1,r,x,y);else{query(L,l,mid,x,mid),query(R,mid+1,r,mid+1,y);}push_up(t);}int main(){//freopen("1","r",stdin);while(~scanf("%d%d",&n,&m)){cnt=0;rep(i,0,n){b[i].read();}rep(i,0,m){bo[i].read(i);}sort(to+1,to+cnt+1);cnt=unique(to+1,to+cnt+1)-(to+1);rep(i,0,n){b[i].x=lower_bound(to+1,to+cnt+1,b[i].x)-(to+1)+1;b[i].y=lower_bound(to+1,to+cnt+1,b[i].y)-(to+1)+1;}rep(i,0,m){bo[i].id=i;bo[i].x=lower_bound(to+1,to+cnt+1,bo[i].x)-(to+1)+1;bo[i].y=lower_bound(to+1,to+cnt+1,bo[i].y)-(to+1)+1;}rep(i,1,cnt){a[i]=to[i+1]-to[i];}a[cnt]=0;build(1,1,cnt);sort(bo,bo+m,cmp);rep(i,0,n){add(1,1,cnt,b[i].x,b[i].y-1,1);}rep(i,0,m){A=0;query(1,1,cnt,bo[i].x,bo[i].y-1);ans[bo[i].id]=A;}rep(i,0,m){output(ans[i]);} puts("");}return 0;}
- zoj 3299 Fall the Brick
- 【ZOJ】3299 Fall the Brick 线段树
- ZOJ 3299 Fall the Brick (线段树)
- ZOJ 3299 Fall the Brick(成段更新)
- ZOJ 3299 Fall the Brick(线段树区间更新)
- zoj3299 Fall the Brick
- zoj 3299 Fall the Brick 离散化+区间更新+区间查询
- zoj3299 Fall the Brick map 离散化
- ZOJ3299:Fall the Brick(区间更新)
- ZOJ 1853 || HOJ 1388 The Brick Stops Here
- Fall through the cracks
- The Brick Stops Here dp 01背包
- The Retro Brick:iPhone一秒变大哥大
- Hoj 1488 The Brick Stops Here
- 【SPOJ-YELBRICK】The Yellow Brick Road【GCD】
- HDU 2354 Another Brick in the Wall
- HDU-2354-Another Brick in the Wall
- The Rise And Fall of ONline Companies
- crm创建团队设置团队的业务部门
- 开源协议浅谈
- Google在世界各国不同域名
- error C2440: “static_cast”: 无法从“UINT (__thiscall CMainWindow::* )(CPoint)”转换为“LRESULT (__thiscall CW
- Scaling Solr(Solr的扩展)
- zoj 3299 Fall the Brick
- 设计师的思维整理术:四个思维可视化模型
- 数据存储-桟(stack)和堆(heap)
- 横向listview自定义每个Item的高宽
- crm操作安全角色
- 如何识别高级的验证码
- html中 实现文本框出现提示的功能
- android EditText inputType 及 android:imeOptions=”actionDone”
- int main(int argc,char* argv[])详解