[BZOJ1935][SHOI2007]Tree 园丁的烦恼(离线+动态维护树状数组)
2016-04-05 09:39
549 查看
题目描述
传送门题解
离线+动态维护树状数组。按说以前应该也接触过这样的思想,比如说简单的树状数组求逆序对,还有昨天写的阿狸的打字机应该也用过了这样的思想,但是刚看这道题的时候没有联系到一起,,
坐标范围很大,首先想到离散化,将一个坐标离散化,另一个保留。树状数组按照离散化的那个坐标来建。
之后将所有的坐标按照未离散的一维排序,声明+询问(声明的坐标直接排序,询问的两个坐标拆成4个,就是二维树状数组的思路),然后顺着操作。如果遇到声明的坐标,就将这个位置+1,如果遇到询问的直接求和。
你会发现这样处理的目的是在询问的时候保证之前有声明的坐标都已经加过了,保证的答案的正确,也是动态维护树状数组的精妙所在。
最后将答案汇总一下。
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int max_n=5e5+5; const int max_q=max_n*5; int n,m,tot,cnt,ANS; int x[max_n],y[max_n],a[max_n],b[max_n],c[max_n],d[max_n]; int p[max_q]; struct hp{ int x,y,id,f; }q[max_q]; int C[max_n],ans[max_n][5]; inline int in(){ int x=0; char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x; } inline int cmp(hp a,hp b){ return a.x<b.x||(a.x==b.x&&a.f<b.f); } inline void add(int loc,int val){ for (int i=loc;i<=n;i+=i&(-i)) C[i]+=val; } inline int query(int loc){ int ans=0; for (int i=loc;i>=1;i-=i&(-i)) ans+=C[i]; return ans; } int main(){ n=in(); m=in(); for (int i=1;i<=n;++i){ x[i]=in()+1; y[i]=in()+1; p[++tot]=y[i]; } for (int i=1;i<=m;++i){ a[i]=in()+1; b[i]=in()+1; c[i]=in()+1; d[i]=in()+1; p[++tot]=b[i]; p[++tot]=d[i]; } sort(p+1,p+tot+1); tot=unique(p+1,p+tot+1)-p-1; for (int i=1;i<=n;++i){ y[i]=lower_bound(p+1,p+tot+1,y[i])-p; q[++cnt].x=x[i]; q[cnt].y=y[i]; } for (int i=1;i<=m;++i){ b[i]=lower_bound(p+1,p+tot+1,b[i])-p; d[i]=lower_bound(p+1,p+tot+1,d[i])-p; q[++cnt].x=a[i]-1; q[cnt].y=b[i]-1; q[cnt].id=i; q[cnt].f=1; q[++cnt].x=a[i]-1; q[cnt].y=d[i]; q[cnt].id=i; q[cnt].f=2; q[++cnt].x=c[i]; q[cnt].y=b[i]-1; q[cnt].id=i; q[cnt].f=3; q[++cnt].x=c[i]; q[cnt].y=d[i]; q[cnt].id=i; q[cnt].f=4; } sort(q+1,q+cnt+1,cmp); for (int i=1;i<=cnt;++i){ if (!q[i].f) add(q[i].y,1); else ans[q[i].id][q[i].f]=query(q[i].y); } for (int i=1;i<=m;++i){ ANS=ans[i][4]-ans[i][3]-ans[i][2]+ans[i][1]; printf("%d\n",ANS); } }
总结
数据范围不要再错了。。。考试之前治手残。
再出脑残错误自断双手。
相关文章推荐
- 一个war包远程部署的脚本
- Linux备份工具大集合
- 在CentOS/RHEL上设置SSH免密码登录
- Top 置顶小图标
- Linux下C编程实现---获取本机IP地址
- Linux压缩保留源文件的方法
- Net分布式系统之二:CentOS系统搭建Nginx负载均衡
- xmapp启动Tomcat时报JDK、JRE未安装错误的解决方法
- 4Toxophily
- CentOS-6.3-i386-bin-DVD1.iso下载地址
- centos7 开机/etc/rc.local不执行命令的问题
- linux&shell
- tar压缩解压缩命令详解
- opencv学习---道路检测
- linux platform总线的相关总结
- Linux grep命令和正则表达式
- Apache无法启动,终极解决方法,适用于“应用程序无法正常启动 0xc000007b”错误
- 不同日志打印到不同日志文件的 log4j.properties 配置
- 秒杀系统架构分析与实战
- 微软和 Linux :真正的浪漫还是有毒的爱情?