【JZOJ3893】【NOIP2014模拟10.25A组】画矩形
2017-01-21 08:00
357 查看
Description
Data Constraint
Solution
后来听说这是一道CDQ分治的题目。对于一个矩形,我们可以在它的左的左下角和右上角打一个+1标记,左上角和右下角打一个-1标记。那么对于一个点的询问就成了询问它左下角的和为多少。我们可以把所有插入拆成两个左边和右边的对一列的操作,和询问放在一起按横坐标进行排序。然后二分时间,对于每次二分的时间t,我们把区间内时间<=t的插入放入树状数组内统计,然后计算区间内时间>=t的方案,然后再把区间内时间
Code
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const int maxn=4e5+5; struct code{ int a,l,r,t,bz; }a[maxn],b[maxn]; int f[maxn],ans1[maxn]; int n,i,t,j,k,l,num,x,y,z,ans,num1; bool cmp(code x,code y){ return x.a<y.a || x.a==y.a && x.bz<y.bz; } int lowbit(int x){ return x&(-x); } void insert(int x,int z){ if (x>maxn-5) return; f[x]+=z;insert(x+lowbit(x),z); } int find(int x){ if (x<1) return 0; return f[x]+find(x-lowbit(x)); } void dg(int l,int r){ int mid,i,j,t; if (l==r) return; mid=(l+r)/2; for (i=l;i<=r;i++){ if (a[i].t<=mid && a[i].bz!=1){ if (a[i].bz==0) insert(a[i].l,1),insert(a[i].r+1,-1); else insert(a[i].l,-1),insert(a[i].r+1,1); }else if (a[i].bz==1 && a[i].t>=mid) ans1[a[i].r]+=find(a[i].l); } for (i=l;i<=r;i++) if (a[i].t<=mid && a[i].bz!=1){ if (a[i].bz==0) insert(a[i].l,-1),insert(a[i].r+1,+1); else insert(a[i].l,+1),insert(a[i].r+1,-1); } num=l-1; if (r-l==1) return; for (i=l;i<=r;i++) if (a[i].t<mid) b[++num]=a[i]; num++; for (i=l;i<=r;i++) if (a[i].t>mid) b[++num]=a[i]; for (i=l;i<=r;i++) a[i]=b[i]; dg(l,mid-1); dg(mid+1,r); } int main(){ // freopen("data.in","r",stdin);freopen("data.out","w",stdout); scanf("%d",&n); for (i=1;i<=n;i++){ scanf("%d%d%d",&z,&x,&y);x++;y++; if (z) a[++num].a=x,a[num].l=y,a[num].t=num,a[num].bz=1,a[num].r=++num1; else{ a[++num].t=num,a[++num].t=num;a[num-1].a=x;scanf("%d%d",&a[num].a,&a[num].r); a[num].a++;a[num].r++;a[num-1].l=a[num].l=y;a[num-1].r=a[num].r; a[num-1].bz=0,a[num].bz=2; } } sort(a+1,a+num+1,cmp); dg(1,num); for (i=1;i<=num1;i++) printf("%d\n",ans1[i]); }
相关文章推荐
- 来自京东、唯品会对微服务编排、API网关、持续集成的实践分享(上)
- 【NOIP2014模拟10.25A组】画矩形
- Nancy简单实战之NancyMusicStore(三):完善商品信息与管理
- 【JZOJ3892】【NOIP2014模拟10.25A组】放棋子
- 第四节 单例模式连接数据库
- PariticalFilter在MFC上的运行,源代码公开
- MFC读写EXIF信息,图片非占用
- day 1
- 【NOIP2014模拟10.25A组】放棋子
- 【LeetCode】 129. Sum Root to Leaf Numbers
- POJ 3624- Charm Bracelet(01背包 滚动数组)
- 图解Linux命令之--wc命令
- OSChina 周六乱弹 ——今年又让支付宝赢了
- C++ crash 堆栈信息获取(三篇)
- 几款国产开源的Windows界面库
- qt之fiddler抓包
- CentOS7需要作的处理
- 在ubuntu下安装free pascal
- 给 Qt sqlite 增加加密功能
- 【数据库开发】Redis消息通知