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的更多相关文章
随机推荐
- VSCODE插件开发:用户输入输出
阅读这篇文章之前,假设你已经具有开发helloworld的插件的能力. vscode.window 简介 vscode.window 负责当前激活窗口的输入输出,比如展示信息,和用户输入等功能都是用v ...
- C语言学习6
int i; 定义整形变量i int *p; p为指向整型数据的指针变量 int a[n]: 定义整形数组a,他有n个元素 int *p[n]: 定义指针数组p,它有n个指向整型数据的指针元素组 ...
- Nginx学习总结(4)——负载均衡session会话保持方法
负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法: 1.使用cookie 将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在 ...
- 2018/2/14 x-pack的学习
x-pack是什么?它能提供的作用如下,下面描述的这些功能都属于x-park:Shield: 提供对数据的 Password-Protect,以及加密通信.基于角色的权限控制,IP 过滤,审计,可以有 ...
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- Discuz! X2.5数据库字典【转载】
DROP TABLE IF EXISTS pre_common_admincp_cmenu; CREATE TABLE pre_common_admincp_cmenu ( `id` SMALLINT ...
- 06-js的逻辑结构
<html> <head> <title>js的逻辑结构和循环结构学习</title> <meta charset="UTF-8&quo ...
- MongoDB小结09 - update【定位修改器】
如果要操作数组中的值,可以用值在数组中的位置当做参数来删除 db.user.update({"name":"codingwhy.com"},{"$se ...
- Java发送邮件示例
利用Java发送邮件示例: 1.发送QQ邮件 import java.util.Properties; import javax.mail.Message; import javax.mail.Mes ...
- 百度语音识别API初探
近期想做个东西把大段对话转成文字.用语音输入法太慢,所以想到看有没有现成的API,网上一搜,基本就是百度和讯飞. 这里先看百度的 笔者使用的是Java版本号的 下载地址:http://bos.nj.b ...