【CF1028C】Rectangles(线段树)
题意:
n<=1e5,abs(x[i]),abs(y[i]<=1e9
思路:这是正解
离散后线段树强打,数据结构越学越傻
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 1100000
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
struct arr1
{
int x1,y1,x2,y2;
}a[N]; struct arr2
{
int x,y1,y2,z;
}c[N]; struct tree
{
int a,s,x;
}t[N<<]; int b[N],d[N],q[N],m; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void swap(int &x,int &y)
{
int t=x;x=y;y=t;
} int hash1(int x)
{
int l=;
int r=m;
while(l<=r)
{
int mid=(l+r)>>;
if(b[mid]==x) return d[mid];
if(b[mid]<x) l=mid+;
else r=mid-;
}
} bool cmp(arr2 a,arr2 b)
{
return a.x<b.x;
} void pushdown(int p)
{
int l=p<<;
int r=l+;
if(!t[p].a) return;
t[l].s=t[l].s+t[p].a;
t[l].a=t[l].a+t[p].a;
t[r].s=t[r].s+t[p].a;
t[r].a=t[r].a+t[p].a;
t[p].a=;
} void pushup(int p)
{
if(t[p<<].s<t[p+p+].s)
{
t[p].s=t[p+p+].s;
t[p].x=t[p+p+].x;
}
else
{
t[p].s=t[p<<].s;
t[p].x=t[p<<].x;
}
} void build(int l,int r,int p)
{
if(l>r) return;
t[p].a=;
t[p].x=l;
if(l==r) return;
int mid=(l+r)>>;
build(l,mid,p<<);
build(mid+,r,p<<|);
} int query(int l,int r,int x,int y,int p)
{
if(x<=l&&r<=y) return t[p].s;
pushdown(p);
int mid=(l+r)>>;
int ret=-;
if(x<=mid) ret=query(l,mid,x,y,p<<);
if(y>mid)
{
int t=query(mid+,r,x,y,p<<|);
if(t>ret) ret=t;
}
return ret;
} void update(int l,int r,int x,int y,int v,int p)
{
if(x<=l&&r<=y)
{
t[p].s+=v;
t[p].a+=v;
return;
}
pushdown(p);
int mid=(l+r)>>;
if(x<=mid) update(l,mid,x,y,v,p<<);
if(y>mid) update(mid+,r,x,y,v,p<<|);
pushup(p);
} int main()
{
// freopen("cf1028C.in","r",stdin);
// freopen("cf1028C.out","w",stdout);
int x;
scanf("%d",&x);
int k1=x;
m=;
int n=;
for(int i=;i<=x;i++)
{
scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
b[++m]=a[i].x1;
b[++m]=a[i].y1;
b[++m]=a[i].x2;
b[++m]=a[i].y2;
}
sort(b+,b+m+);
d[]=;
for(int i=;i<=m;i++)
if(b[i]==b[i-]) d[i]=d[i-];
else d[i]=d[i-]+;
q[]=b[];
int len=;
for(int i=;i<=m;i++)
if(b[i]!=b[i-]) q[++len]=b[i]; for(int i=;i<=x;i++)
{
c[++n].x=hash1(a[i].x1);
c[n].y1=hash1(a[i].y1);
c[n].y2=hash1(a[i].y2);
c[n].z=;
c[++n].x=hash1(a[i].x2)+;
c[n].y1=hash1(a[i].y1);
c[n].y2=hash1(a[i].y2);
c[n].z=-;
}
sort(c+,c+n+,cmp);
int line=;
int row=;
for(int i=;i<=n;i++)
{
line=max(line,c[i].x);
row=max(row,c[i].y2);
}
build(,row,); int j=;
for(int i=;i<=line;i++)
{
while(j<=n&&c[j].x==i)
{
update(,row,c[j].y1,c[j].y2,c[j].z,);
// printf("%d %d %d\n",c[j].y1,c[j].y2,c[j].z);
j++;
}
int k=query(,row,,row,);
//printf("%d %d\n",i,k);
if(k>=k1-)
{
// int p=find(1,row,1,row,1);
int p=t[].x;
// printf("%d %d\n",i,p);
int x=q[i];
int y=q[p];
printf("%d %d\n",x,y);
return ;
}
}
return ;
}
【CF1028C】Rectangles(线段树)的更多相关文章
- Codeforces 524E Rooks and Rectangles 线段树
区域安全的check方法就是, 每行都有哨兵或者每列都有哨兵,然后我们用y建线段树, 维护在每个y上的哨兵的x的最值就好啦. #include<bits/stdc++.h> #define ...
- [CF983D]Arkady and Rectangles[线段树+可删堆/set]
题意 你有一个无限大的绘图板,开始颜色是\(0\) , 你将进行\(n\) 次绘图,第\(i\) 次绘图会将左下角为 \((x_1, y_1)\),右上角为\((x_2, y_2)\) 的矩形涂成颜色 ...
- VK Cup 2015 - Round 1 E. Rooks and Rectangles 线段树 定点修改,区间最小值
E. Rooks and Rectangles Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemse ...
- hdu2461 Rectangles 线段树--扫描线
You are developing a software for painting rectangles on the screen. The software supports drawing s ...
- VK Cup 2015 - Round 1 -E. Rooks and Rectangles 线段树最值+扫描线
题意: n * m的棋盘, k个位置有"rook"(车),q次询问,问是否询问的方块内是否每一行都有一个车或者每一列都有一个车? 满足一个即可 先考虑第一种情况, 第二种类似,sw ...
- 【做题】CSA72G - MST and Rectangles——Borůvka&线段树
原文链接 https://www.cnblogs.com/cly-none/p/CSA72G.html 题意:有一个\(n \times n\)的矩阵\(A\),\(m\)次操作,每次在\(A\)上三 ...
- 线段树+扫描线 NAIPC 2019 Intersecting Rectangles
你看看你有多菜,一点线段树的小小的运用,就不会写了: 题意:如果矩阵有交集,输出1,否则输出0(不包含内嵌): 思路:本题求交集,还得不包括内嵌的情况: 做过一道是求面积的题.跟这道类似,但在这里定义 ...
- POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- 线段树---Atlantis
题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110064#problem/A Description There are se ...
随机推荐
- POP简单动画简单使用 (入门级别)
动画可以让APP“更友好”的与用户交互,苹果提供很多的好看的动画供开发者使用,不过简单的平移.旋转.缩放.......使用起来很简单,但是想要进行一些比较复杂的动画效果,使用起来就比较难以实现,俗话说 ...
- 使用CAShapeLayer实现复杂的View的遮罩效果
一.案例演示 最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者.服务端返回给我们的图片只是一张矩形的图片,我们如何把一张矩形的图片或者View,加上一层自定 ...
- 【转】如何在VC下检测当前存在的串口及串口热拔插
当我们在用VS进行串口编程时,在打开串口前,经常想知道当前PC上存在多少个串口,哪些串口可用?哪些串口已经打开了,最好是在一个Combo Box中列表系统当前所有可用的串口以供选择,然而如何获取系统当 ...
- C++ string头文件
转载自https://blog.csdn.net/superna666/article/details/52809007/ 作者 zhenzhenjiajia888 标准c++中string类函数介绍 ...
- 【最大权闭合子图 最小割】bzoj1497: [NOI2006]最大获利
最大权闭合子图的模型:今天才发现dinic板子是一直挂的…… Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在 ...
- 洛谷 4219/BZOJ 4530 大融合
4530: [Bjoi2014]大融合 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 990 Solved: 604[Submit][Status] ...
- python入门:数字型和字符串换行要同类型 注意连接符
#!/usr/bin/env python # -*- coding: utf-8 -*- #数字型和字符串换行要同类型 注意连接符 a = 1 b = 2 print(str(a) + " ...
- DeepFaceLab小白入门(6):脸部替换以及合成视频!
前面的都是准备工作,这个环节才是真的换脸.换脸主要分两部分,1,图片换脸,2,把图片合成视频. 7) convert H64 debug.bat 这个环节是和训练环节相对于的,比如我们之前选的是H64 ...
- kafka的初认识
学习地址: http://www.jikexueyuan.com/course/1716_3.html?ss=1 http://www.jikexueyuan.com/course/kafka/ zo ...
- 搜索引擎elasticsearch常用指令演示
目录 交互方式 常用操作示例 添加文档 删除文档 修改文档 查询 简单查询 高级多条件查询 交互方式 操作ES有3种方式: kibana控制台(Dev Tools) Http + json api接口 ...