链接:http://hihocoder.com/problemset/problem/1699

快毕业了的菜菜,做了个比赛,遇到四维偏序,调成了傻逼,所以记录下,看了下以前的傻逼代码,发现自己的cdq居然用sort

怪不得总是被卡常,然后就是套路cdq+cdq,这类题的坑点就是有相同的矩形

贴代码:

 #include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL N = 1e5 + ;
const LL mod = 1e9 + ; struct Point {
int x1, y1, x2, y2, partition, id;
bool operator < (const Point &p) const {
if(x1 != p.x1) return x1 < p.x1;
if(y1 != p.y1) return y1 < p.y1;
if(x2 != p.x2) return x2 > p.x2;
if(y2 != p.y2) return y2 > p.y2;
return id < p.id;
}
}p[N], o[N], tmp[N]; int n, bit[N], lim, ret[N]; void add(int x, int ad) {
for(; x <= lim; x += x & -x) bit[x] += ad;
} int ask(int x) {
int sum = ;
for(; x > ; x -= x & -x) sum += bit[x];
return sum;
} void cdq(int l, int r) {
if(l == r) return;
int mid = l + r >> ;
cdq(l, mid); cdq(mid + , r);
int i = l, j = mid + , cnt = l;
while(i <= mid || j <= r) {
if(i > mid) {
if(o[j].partition) ret[o[j].id] += ask(lim) - ask(o[j].y2 - );
tmp[cnt ++] = o[j ++];
} else if(j > r) {
if(!o[i].partition) add(o[i].y2, );
tmp[cnt ++] = o[i ++];
} else if(o[i].x2 >= o[j].x2) {
if(!o[i].partition) add(o[i].y2, );
tmp[cnt ++] = o[i ++];
} else {
if(o[j].partition) ret[o[j].id] += ask(lim) - ask(o[j].y2 - );
tmp[cnt ++] = o[j ++];
}
}
for(i = l; i <= mid; ++ i) if(!o[i].partition) add(o[i].y2, -);
for(i = l; i <= r; ++ i) o[i] = tmp[i];
} bool cmp(const Point &a, const Point &b) {
if(a.y1 != b.y1) return a.y1 < b.y1;
if(a.x2 != b.x2) return a.x2 > b.x2;
if(a.y2 != b.y2) return a.y2 > b.y2;
return a.id < b.id;
} void solve(int l, int r) {
if(l == r) return;
int mid = l + r >> ;
solve(l, mid); solve(mid + , r);
int i = l, j = mid + , cnt = l - ;
while(i <= mid || j <= r) {
if(i > mid) o[++ cnt] = p[j ++], o[cnt].partition = ;
else if(j > r) o[++ cnt] = p[i ++], o[cnt].partition = ;
else if(cmp(p[i], p[j])) o[++ cnt] = p[i ++], o[cnt].partition = ;
else o[++ cnt] = p[j ++], o[cnt].partition = ;
}
for(i = l; i <= r; ++ i) {
p[i] = o[i];
}
cdq(l, r);
}
int main() {
scanf("%d", &n);
for(int i = ; i <= n; ++ i) {
scanf("%d%d%d%d", &p[i].x1, &p[i].y1, &p[i].x2, &p[i].y2);
bit[++ lim] = p[i].y2;
p[i].id = i;
}
sort(bit + , bit + + lim);
lim = unique(bit + , bit + + lim) - bit - ;
for(int i = ; i <= n; ++ i) {
p[i].y2 = lower_bound(bit + , bit + + lim, p[i].y2) - bit;
}
for(int i = ; i <= lim; ++ i) bit[i] = ;
sort(p + , p + + n);
solve(, n);
sort(p + , p + + n);
for(int i = n - ; i > ; -- i) {
if(p[i].x1 == p[i + ].x1 && p[i].y1 == p[i + ].y1)
if(p[i].x2 == p[i + ].x2 && p[i].y2 == p[i + ].y2)
ret[p[i].id] = ret[p[i+].id];
}
for(int i = ; i <= n; ++ i) printf("%d\n", ret[i]);
return ;
}

hihocoder1699的更多相关文章

随机推荐

  1. glibc库函数,系统调用API

    glibc封装了大部分系统API,我们一般都是使用glibc封装的接口进行系统调用,碰到一些没有封装的接口,可以通过这个 函数syscall 进行系统调用.   /* Invoke `system c ...

  2. Shiro框架 (原理分析与简单实现)

    Shiro框架(原理分析与简单实现) 有兴趣的同学也可以阅读我之前分享的:Java权限管理(授权与认证)CRM权限管理   (PS : 这篇博客里面的实现方式没有使用框架,完全是手写的授权与认证,可以 ...

  3. [Python3网络爬虫开发实战] 7.2-Splash的使用

    Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库.利用它,我们同样可以实现动态渲染页面的抓取. 1. 功能介 ...

  4. 零基础入门学习Python(32)--异常处理:你不可能总是对的

    知识点 即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误.运行期检测到的错误被称为异常. 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里: Python标准异常总结 序 ...

  5. MySQL-----删

    删 **清空数据库内容** delete from 数据库表名; ----清内容,但是自增列的数不清. truncate table 数据库表名; --------自增列的数也清. **清除指定的行数 ...

  6. Django之CBV和FBV

    Django之CBV和FBV CBV和FBV是C和F的区别: C是Class,F是Function 在请求中,有GET请求和POST请求. 在写CBV时,url是可以对应一个类的,在类中,分别写出GE ...

  7. UVa Sculpture(离散化 floodfill)

    题意: 给定n个立方体的一个顶点坐标和3边长度,  问这些立方体组成的雕塑的表面积和体积,   坐标都是整数,n最大为50,  最大为500, 边长最大也是500. 分析: 继UVa221后又一道离散 ...

  8. BNUOJ 26228 Juggler

    Juggler Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 42 ...

  9. [HDU2136] Largest prime factor(素数筛)

    传送门 题意 给出若干个数n(n<=1000000),求每个n的最大质因子的排名. 质数的排名:如果素数p是第k小的素数,那么p的排名就是k. 思路 乍一看不知道怎么搞. 其实可以想想我们怎么筛 ...

  10. HDU 4960 (水dp)

    Another OCD Patient Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. Th ...