[CSP-S模拟测试]:表格(动态开点二维线段树+离散化)
题目传送门(内部题112)
输入格式
一个数$N$,表示矩形的个数。
接下来$N$行,每行四个整数$X_a,Y_a,X_b,Y_b$。分别表示每个矩形左下角和右上角的坐标。
保证$(X_a<X_b,Y_a<Y_b)$。
输出格式
一行,表示能看到的颜色数量。
样例
样例输入:
3
0 -1 1 1
2 1 3 5
-4 0 5 4
样例输出:
4
数据范围与提示
样例解释:

数据范围:
对于$10\%$的数据,保证$N\leqslant 100,|X_a,X_b,Y_a,Y_b|\leqslant 100$
对于$50\%$的数据,保证$N\leqslant 100,000,|X_a,X_b,Y_a,Y_b|\leqslant 1,000$
对于$80\%$的数据,保证$N\leqslant 100,000,|X_a,X_b,Y_a,Y_b|\leqslant 100,000$
对于$100\%$的数据,保证$N\leqslant 100,000,|X_a,X_b,Y_a,Y_b|\leqslant 10^9$
题解
其实$Ctrl+Z$是个提示。
然而我的考场代码……

愣是没有想到可以反着来。
反着来有一个很好的性质,就是如果这段已经被覆盖过了,那么现在插入的这个肯定是被压在下面的。
那么可以用二维线段树,存储哪个区间已经被覆盖了即可,如果有一段区间没有被覆盖,那么答案就$+1$即可。
注意离散化和动态开点即可。
随机数据下很优秀,但是极限数据会被卡,因为时间复杂度还是$\Theta(n^2)$的。
时间复杂度:$\Theta(n^2)$(但是可过)。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int xa,xb,ya,yb;}e[100001];
unordered_map<int,int> mpx,mpy;
int n;
int x[300001],y[300001],topx,topy,cntx,cnty;
int rt,tot,lson[60000000],rson[60000000];
bool tr[60000000];
int ans,res;
void pushup(int x){tr[x]=tr[lson[x]]&tr[rson[x]];}
void add(int &x,int xl,int yl,int xr,int yr,int opt,int XL,int YL,int XR,int YR)
{
if(!x)x=++tot;
if(tr[x]||xr<XL||XR<xl||yr<YL||YR<yl)return;
if(XL<=xl&&xr<=XR&&YL<=yl&&yr<=YR)
{
tr[x]=1;
ans+=res;
res=0;
return;
}
if(opt)
{
int mid=(xl+xr)>>1;
add(lson[x],xl,yl,mid,yr,0,XL,YL,XR,YR);
add(rson[x],mid+1,yl,xr,yr,0,XL,YL,XR,YR);
}
else
{
int mid=(yl+yr)>>1;
add(lson[x],xl,yl,xr,mid,1,XL,YL,XR,YR);
add(rson[x],xl,mid+1,xr,yr,1,XL,YL,XR,YR);
}
pushup(x);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&e[i].xa,&e[i].ya,&e[i].xb,&e[i].yb);
x[++topx]=e[i].xa;x[++topx]=e[i].xb;
y[++topy]=e[i].ya;y[++topy]=e[i].yb;
e[i].xb--;e[i].yb--;
x[++topx]=e[i].xb;y[++topy]=e[i].yb;
}
sort(x+1,x+topx+1);sort(y+1,y+topy+1);
for(int i=1;i<=topx;i++)if(x[i]!=x[i-1])mpx[x[i]]=++cntx;
for(int i=1;i<=topy;i++)if(y[i]!=y[i-1])mpy[y[i]]=++cnty;
cntx++;cnty++;
for(int i=1;i<=n;i++)
{
e[i].xa=mpx[e[i].xa];
e[i].xb=mpx[e[i].xb];
e[i].ya=mpy[e[i].ya];
e[i].yb=mpy[e[i].yb];
}
for(int i=n;i;i--){res=1;add(rt,1,1,cntx,cnty,1,e[i].xa,e[i].ya,e[i].xb,e[i].yb);}
printf("%d\n",ans+1);
return 0;
}
rp++
[CSP-S模拟测试]:表格(动态开点二维线段树+离散化)的更多相关文章
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- [JZOJ3615]【NOI2014模拟】数列(平面几何+二维线段树)
Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的f值为两者位置差与数值差的和,即f(x,y)=|x-y|+|a[x]-a[y]|. 你需要写一个程序支持2种操作(k都是正 ...
- HDU 6464.免费送气球-动态开点-权值线段树(序列中第first小至第second小的数值之和)(感觉就是只有一个状态的主席树) (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
免费送气球 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- [CSP-S模拟测试]:地理课(并查集+线段树分治)
题目传送门(内部题146) 输入格式 从$geography.in$读入数据. 第一行两个数$n,m$,表示有$n$个点,$m$个时刻.接下来$m$行每行三个数,要么是$1\ u\ v$,要么是$2\ ...
- [CSP-S模拟测试]:回文(hash+二维前缀和)
题目描述 闲着无聊的$YGH$秒掉上面两道题之后,开始思考有趣的回文串问题了. 他面前就有一个漂浮着的字符串.显然$YGH$是会$manacher$的,于是他随手求出了这个字符串的回文子串个数.但是他 ...
- P2617 Dynamic Rankings (动态开点权值线段树 + 树状数组)
题意:带修求区间k小 题解:回忆在使用主席树求区间k小时 利用前缀和的思想 既然是前缀和 那么我们可以使用更擅长维护前缀和的树状数组 但是这里每一颗权值线段树就不是带版本的 而是维护数组里i号点的权值 ...
- 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)
[BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...
- demo:动态生成专属二维码
在日常生活中,随处可见二维码,那么js如何生成动态的专属二维码?其实,通过"二维码插件"我们可以快速生成二维码.在这,记录一下的生成专属二维码demo,一起来看看jquery.qr ...
- 微信小程序动态生成保存二维码
起源:最近小程序需要涉及到一些推广方面的功能,所以要写一个动态生成二维码用户进行下载分享,写完之后受益良多,特此来分享一下: 一.微信小程序动态生成保存二维码 wxml: <view class ...
随机推荐
- Robot Framework(二)访问数据库
1.在Test suit中添加Library 直接输入库名,点击确定即可 DatabaseLibrary BuiltIn 2.在用例中,连接数据库,并执行sql Connect To Database ...
- Oracle sqlplus prelim 参数介绍
SQL>conn / as sysdba ORA-00020: maximum number of processes (xxxx) exceeded 报错解决方法 解决 ORA-00020 错 ...
- 配置Mysql远程连接
一.赋予某个用户权限 1.赋予权限格式:grant 权限 on 数据库对象 to 用户@IP(或者相应正则) 注:可以赋予select,delete,update,insert,index等权限精确到 ...
- Git复习(二)之远程仓库、注册GitHub账号、SSH警告、使用GitHub
远程仓库 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都 ...
- Appium Android 获取包名appPackage和appActivity的几种方法
情况1: 安装包未安装到手机 准备前提条件: 1 Android SDK管理工具目录 2 PC端有apk包 使用方法: 1 打开终端,当前路径移动到sdk管理工具目录tools或build-tools ...
- 11 Scrapy框架之递归解析和post请求
一.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求, ...
- 在mysql 上如何在不影响生产的情况下删除一个大表
mysql 中常用的删除的方法基本上有下面三种方式: 1.delete 一般用于删除少量表中的数据 优化建议,一定要加上where 条件,并且where条件的列上 一定要有主键或者索引.否则会出现全表 ...
- java8学习之内部迭代与外部迭代本质剖析及流本源分析
关于Stream在Java8中是占非常主要的地位的,所以这次对它进行进一步探讨[这次基本上都是偏理论的东东,但是理解它很重要~],其实流跟咱们数据库学习当中的sql语句的特点是非常非常之像的,为什么这 ...
- php socket如何实现长连接
长连接是什么? 朋友们应该都见过很多在线聊天工具和网页在线聊天的工具.学校内有一种熟悉的功能,如果有人回复你了,网站会马上出现提示,此时你并没有刷新页面:Gmail也有此功能,如果邮箱里收到了新的邮件 ...
- Android图像处理之图形特效处理
一.Android变形矩阵——Matricx: 跟Android图像的色彩处理基本一样,只是将ColorMatrix换成了Matrix,ColorMatrix是4*5的矩阵,Matrix是3*3的.每 ...