标签:des style http color io os ar for sp
3 3 1 2 2 2 2 2 3 3 1 3 2 2 2 2 2 3 2 2 1 1 1 1 2 3 2 3
8 4 3
题目大意:
w*h的格子,现在有n个矩形上已经摆放了东西,现在你要放一个东西长度为m,问你有多少种方法?
解题思路:
枚举没用的情况,如果东西横着放
(1)如果碰到障碍物,也就是如果 某个东西占着Xi1,Yi1,Xi2,Yi2,那么max(xi1+1-m,0) , x2 y1y2这片矩形区域就不能放东西。
(2)还有就是被墙当着,也就是max(0,w+1-m),w,0,h这片矩形区域就不能放东西。
如果竖着放,也是差不多的。
坑点:如果m==1,也就是横着和竖着是一样的情况,只需考虑一种,我就是这被坑了,弹了20遍。
解题代码:
#include <iostream> #include <vector> #include <cmath> #include <map> #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const int maxn=51000; struct node{ int l,r,pos,c; node(int l0=0,int r0=0,int pos0=0,int c0=0){ l=l0,r=r0,pos=pos0;c=c0; } friend bool operator < (node a,node b){ return a.pos<b.pos; } }; struct rec{ int x1,y1,x2,y2; }d[maxn]; vector <node> v; int w,h,m,n; vector <int> c; map <int,int> mp; struct Tree{ int l,r,cover,len; }tree[8*maxn]; void build(int l,int r,int k){ tree[k].l=l; tree[k].r=r; tree[k].len=0; tree[k].cover=0; if(l+1>=r) return; int mid=(l+r)>>1; build(l,mid,k<<1); build(mid,r,k<<1|1); } void pushup(int k){ if(tree[k].cover>0) tree[k].len=c[tree[k].r]-c[tree[k].l]; else if(tree[k].l+1==tree[k].r) tree[k].len=0; else tree[k].len=tree[k<<1].len+tree[k<<1|1].len; } void insert(int l,int r,int k,int c0){ if(l<=tree[k].l && tree[k].r<=r){ tree[k].cover+=c0; } else{ int mid=(tree[k].l+tree[k].r)>>1; if(r<=mid) insert(l,r,k<<1,c0); else if(l>=mid) insert(l,r,k<<1|1,c0); else{ insert(l,mid,k<<1,c0); insert(mid,r,k<<1|1,c0); } } pushup(k); } ll getans(){ if(v.size()<=0) return (ll)w*(ll)h; c.clear(); mp.clear(); sort(v.begin(),v.end()); for(int i=0;i<v.size();i++){ mp[v[i].l]=i; mp[v[i].r]=i; } for(map <int,int>::iterator it=mp.begin();it!=mp.end();it++){ it->second=c.size(); c.push_back(it->first); } ll ret=0; build(0,c.size()-1,1); insert(mp[v[0].l],mp[v[0].r],1,v[0].c); for(int i=1;i<v.size();i++){ ret+=(ll)(v[i].pos-v[i-1].pos)*(ll)tree[1].len; insert(mp[v[i].l],mp[v[i].r],1,v[i].c); } return (ll)w*(ll)h-ret; } void solve(){ v.clear(); for(int i=0;i<n;i++){ v.push_back(node(max(d[i].x1+1-m,0),d[i].x2,d[i].y1,1)); v.push_back(node(max(d[i].x1+1-m,0),d[i].x2,d[i].y2,-1)); } if(m>1){ v.push_back(node(max(0,w+1-m),w,0,1)); v.push_back(node(max(0,w+1-m),w,h,-1)); } ll ans=getans(); if(m==1){ printf("%I64d\n",ans); return; } v.clear(); for(int i=0;i<n;i++){ v.push_back(node(max(d[i].y1+1-m,0),d[i].y2,d[i].x1,1)); v.push_back(node(max(d[i].y1+1-m,0),d[i].y2,d[i].x2,-1)); } if(m>1){ v.push_back(node(max(0,h+1-m),h,0,1)); v.push_back(node(max(0,h+1-m),h,w,-1)); } ans+=getans(); printf("%I64d\n",ans); } int main(){ while(scanf("%d%d%d%d",&w,&h,&n,&m)!=EOF){ for(int i=0;i<n;i++){ scanf("%d%d%d%d",&d[i].x1,&d[i].y1,&d[i].x2,&d[i].y2); d[i].x1--;d[i].y1--; } solve(); } return 0; }
HDU 4052 Adding New Machine(矩形面积并)
标签:des style http color io os ar for sp
原文地址:http://blog.csdn.net/a1061747415/article/details/39781465