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的更多相关文章
随机推荐
- <Redis> 入门四 Jedis操作Redis
pom依赖 <dependencies> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> < ...
- rownum导致sql不能进行谓词推入
背景 案件(13405_RI-再保结算查询导出太慢),造成性能慢的原因是执行以下sql时,每次执行平均需要消耗2秒, 画面上,点击一次导出按钮,就会发起数以百记的调用. SQL执行代码段 select ...
- c++基础_回文数
#include <iostream> using namespace std; int main(){ ;i<;i++){ ; int n=i;//暂存该四位数来计算 ,以防改变i ...
- python实现tcp文件下载器
服务器端代码 import socket import os import threading # 处理客户端请求下载文件的操作(从主线程提出来的代码) def deal_client_request ...
- LeetCode(59)SPiral Matrix II
题目 Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. F ...
- sort 结构体 正数负数分开排序
对于结构体排序的一点点记录,之前遇到过结构体排序,个人比较喜欢使用在结构体当中直接重载小于号的方法, 例如说: struct Node{ int index; int del; bool operat ...
- poj 1088 滑雪 DP(dfs的记忆化搜索)
题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...
- [bzoj1208][HNOI2004][宠物收养所] (平衡树)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- Vue如何在data中正常引入图片路径
在Vue项目中通过data设置图片路径,然后在template中引入后页面无法显示图片,浏览器控制台报错: 刚开始以为是路径出问题了,于是绝对路径.相对路 ...
- 解决在使用Amoeba遇到的问题
最近有同行在使用Amoeba 的过程中多少遇到了一些问题. 总结一下遇到问题的解决方法: 1.读写分离的时候设置的在queryRouter中设置无效? 读写分离配置的优先级别: 1)满足 ...