莫队算法
2015-08-01 23:32
281 查看
转自 http://vawait.com/manhattanmst/
严谨的论文请看:戳这里或者戳这里,还有一个blog的也可以看看:戳这里。
View Code
严谨的论文请看:戳这里或者戳这里,还有一个blog的也可以看看:戳这里。
const int maxn = 100010; int n , t , x , f[maxn] , c[maxn]; struct bit { int t[100100] , n; void cl() { clr( t, 0 ); } void add(int x,int y) { for ( ; x; x -= x & (-x) ) if( c[y] < c[t[x]] ) t[x] = y; } int ask(int x) { int s = 0; for ( ; x <= 100000; x += x & (-x) ) if ( c[s] > c[t[x]] ) s = t[x]; return s; } } T; struct nodd { int x , y , n; } a[maxn] , d[maxn] , b[4*maxn]; bool cmp(nodd a,nodd b) { return a.x == b.x ? a.y < b.y : a.x < b.x; } void add(int x,int y,int d) { b[++t].x = x; b[t].y = y; b[t].n = d; } void init() { rep(i,1,n) scanf("%d%d",&a[i].x,&a[i].y) , a[i].n = i; t = 0; rep(k,1,4) { if ( k == 2 || k == 4 ) rep(i,1,n) swap(a[i].x,a[i].y); if ( k == 3 ) rep(i,1,n) a[i].x = -a[i].x; sort( a + 1 , a + 1 + n , cmp ); rep(i,1,n) d[i].x = a[i].y - a[i].x , d[i].y = i; rep(i,1,n) c[i] = a[i].x + a[i].y; c[0] = 2000000000; sort( d + 1 , d + 1 + n , cmp ); rep(i,1,n) f[d[i].y] = i; T.cl(); red(i,n,1) { if ( x = T.ask(f[i]) ) add( a[i].n , a[x].n , c[x] - c[i] );; T.add(f[i],i); } } }
View Code
相关文章推荐
- iptables WEB服务器配置示例
- 一个Netfilter nf_conntrack流表查找的优化-为conntrack增加一个per cpu cache
- chardet字符集检测模块
- !HDU 4334 集合各出一数和为0是否存在-思维、卡时间-(指针的妙用)
- hdu1999 可以筛法做
- 设计模式之工厂方法模式
- 算法学习之旅
- 6.1 守护进程课后题2015/8/1
- 最长回文子串
- Scala深入浅出实战经典-1
- Spark源码阅读笔记之BlockObjectWriter
- Android异步之Asynctask与Handler你所应该知道的一切
- 扩展kmp 模板
- CentOS LNMP环境搭建
- Ubuntu下“超级终端”的使用
- Ubuntu14.04.2无法连接无线网络问题解决方案
- 2015 Multi-University Training Contest 4(hdu 5327 - hdu 5338)
- 【剑指Offer面试题】 九度OJ1524:复杂链表的复制
- 怎么让员工爽起来?小米的创始人都是这么干的!
- HDU-4217(树状数组)