hihocoder1699
链接: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的更多相关文章
随机推荐
- 大前端之HTML5\CSS3
- python多线程和多进程(二)
---恢复内容开始--- 一.多进程 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. impor ...
- 用element-ui的走马灯carousel轻松实现自适应全屏banner图
写在前面:网站轮播图建议使用swiper组件,非常方便快捷.vue轮播图插件之vue-awesome-swiper 接手一个项目,轮播图是用element-ui的carousel实现的,看起来效果还不 ...
- npm 发包
前几天封装了公用的locaStorage组件,当然封装后需要发布npm官网,于是摸索了一番终于搞定了,总结下来希望对大家有所帮助 npm安装的package一般支持下面几大类: 本地包 url远程包 ...
- Unity 3D 使用TerrainCompose 调用RTP 报错:
Unity 3D:5.2 version TerrainCompose:1.92 version RTP:3.2d version Unity 3D 使用TerrainCompose 调用RTP 报 ...
- Light oj-1004 - Monkey Banana Problem,数字三角形的变形版~
100 ...
- Linux下汇编语言学习笔记45 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- P1219 八皇后 洛谷
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- HDU——1498 50 years, 50 colors
50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Ubuntu 16.04下搭建基于携程Apollo(阿波罗)配置中心单机模式
官网:https://github.com/ctripcorp/apollo Wiki:https://github.com/ctripcorp/apollo/wiki(一切的集成方式和使用方法都在这 ...