[COCI2017-2018#1] Plahte

题面很长,可往往真正有用的题意却没有这么长,例如说这么一句:

  • 床单放在上面,使它们之间角或边不会互相接触, 边也不会相交,但他可能把较小的床单放在大的上面,或者一个完全覆盖另个。

从这句话中,我们可以看出,矩形是不会相交的,且只有包含关系。所以,我们仅需记录一个矩形的父亲为包含它的所有矩形中最小的那个,原图可由此化为一棵森林。

那么,我们怎么构造一个森林呢?我们这里有两种方法:

  • 用扫描线,线段树处理y轴,每次找到一个矩形之后判断这个矩形的下边界是否合法,如不合法就倍增往其父亲走,直到合法。
  • 对于y轴,我们建一棵标记永久化的线段树。扫到左边界时,直接把标记打到相应区间,直接覆盖。

构造出森林过后,我们就可以在此森林上进行线段树合并或者是set启发式合并即可。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<queue>
#include<ctime>
#define MAXN 200005
#define ll long long
#define maxn 15
#define maxs 1000005
#define inf 1e9
#define eps 1e-9
using namespace std;
inline char gc() {static char now[1<<16],*S,*T;if (T==S) {T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline ll readlong() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x*=10;x+=ch-'0';ch=getchar();}return x*f;
}
inline int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x*=10;x+=ch-'0';ch=getchar();}return x*f;
}
void putint(long long t) {int ans[40]= {0};for(; t; t/=10)ans[++ans[0]]=t%10;for(; ans[0]; ans[0]--)putchar('0'+ans[ans[0]]);putchar('\n');
}
const int N=500005;
int n,m;
struct edge{int to,nxt;
}e[N];
int h[N],cnt;
void add(int x,int y){
//  cout<<x<<' '<<y;e[++cnt]=(edge){y,h[x]};h[x]=cnt;
}
int pre[N],_k[N],_y[N],rt[N];
int ans[N];
int dx,dy,dv;
int g[N<<5];
int col[N<<5],f[N<<5][2];
int cntt,cnty,cnts;
int tot;
struct bed{int x,y,k,i;bool operator <(const bed &a)const{if(x==a.x){return i>a.i;}return x<a.x;}
}mp[N<<2];
int query(int x,int l,int r){if(g[x]>=0||l==r){return g[x];}if(!x){return 0;}int mid=(l+r)>>1;if(dx<=mid){return query(x<<1,l,mid);}else{return query(x<<1|1,mid+1,r);}
}
void push(int x){if(g[x]<0){return ;}g[x<<1]=g[x<<1|1]=g[x];g[x]=-1;
}
void modify(int x,int l,int r){
//  cout<<"Asdf"<<endl;if(dx<=l&&dy>=r){g[x]=dv;return ;}push(x);int mid=(l+r)>>1;if(dx<=mid){modify(x<<1,l,mid);}if(dy>mid){modify(x<<1|1,mid+1,r);}
}
void add_cor(int &x,int l,int r){if(!x){x=++tot;}if(l==r){col[x]=1;return;}int mid=(l+r)>>1;if(dx<=mid){add_cor(f[x][0],l,mid);}else{add_cor(f[x][1],mid+1,r);}col[x]=col[f[x][0]]+col[f[x][1]];
}
int merge(int a,int b,int l,int r){if(!a|!b){return a^b;}if(l==r){return a;}int mid=(l+r)>>1;f[a][0]=merge(f[a][0],f[b][0],l,mid);f[a][1]=merge(f[a][1],f[b][1],mid+1,r);col[a]=col[f[a][0]]+col[f[a][1]];return a;
}
void dfs(int x){for(int i=h[x];i;i=e[i].nxt){int y=e[i].to;if(y!=pre[x]){dfs(y);rt[x]=merge(rt[x],rt[y],1,cnts);}}ans[x]=col[rt[x]];
}
int main(){memset(g,-1,sizeof(g));n=read();m=read();for(int i=1;i<=n;i++){int a=read();int b=read();int c=read();int d=read();mp[++cntt]=(bed){a,b,d,i};_y[++cnty]=b;mp[++cntt]=(bed){c,b,d,-i};_y[++cnty]=d;}for(int i=1;i<=m;i++){int x=read();int y=read();int k=read();mp[++cntt]=(bed){x,y,k,0};_y[++cnty]=y;_k[++cnts]=k;}sort(_y+1,_y+1+cnty);cnty=unique(_y+1,_y+1+cnty)-_y-1;sort(_k+1,_k+1+cnts);cnts=unique(_k+1,_k+1+cnts)-_k-1;sort(mp+1,mp+cntt+1);for(int i=1;i<=cntt;i++){mp[i].y=lower_bound(_y+1,_y+1+cnty,mp[i].y)-_y;if(mp[i].i){mp[i].k=lower_bound(_y+1,_y+1+cnty,mp[i].k)-_y;if(mp[i].i>0){dx=mp[i].y;dy=mp[i].k;dv=mp[i].i;if((pre[dv]=query(1,1,cnty))>0){add(pre[dv],dv);}modify(1,1,cnty);continue;}dx=mp[i].y;dy=mp[i].k;dv=max(pre[-mp[i].i],0);modify(1,1,cnty);continue;}mp[i].k=lower_bound(_k+1,_k+cnts+1,mp[i].k)-_k;dx=mp[i].y;int tmp=query(1,1,cnty);if(tmp>0){dx=mp[i].k;add_cor(rt[tmp],1,cnts);}}for(int i=1;i<=n;i++){if(pre[i]<=0){dfs(i);}}for(int i=1;i<=n;i++){printf("%d\n",ans[i]);}return 0;
}

 

转载于:https://www.cnblogs.com/LHbz/p/9720950.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode-437. 路径总和 III(Java)

给定一个二叉树&#xff0c;它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点&#xff09;。 二叉树不超过1000个节…

美国国家创新体系的演化历程、特点及启示

本文来源&#xff1a;微信公众号科情智库原载于《全球科技经济瞭望》2020年12月第35卷第12期作者&#xff1a;李哲、杨晶、朱丽楠&#xff0c;中国科学技术发展战略研究院国家创新体系反映经济活动中科学技术知识生产和配置的整体状况&#xff0c;其着眼点是激励知识生产、提高…

牛客网--字符串合并处理(Java)

按照指定规则对输入的字符串进行处理。 详细描述&#xff1a; 将输入的两个字符串合并。 对合并后的字符串进行排序&#xff0c;要求为&#xff1a;下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。 对排序后的字符串进行操作…

再造一个爱因斯坦?GPT-3 让我看到了名人“重生”的希望

作者&#xff1a;Manuel Araoz译者&#xff1a;弯月来源&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自从GPT-3推出以来&#xff0c;我就一直在做各种尝试。这是一项非常酷的技术&#xff0c;我发现最有趣的一项实验就是通过GPT-3与已故去的名人对话。在本…

中文乱码解决

1.url链接设置字符编码 mysql.urljdbc:mysql://127.0.0.1:3306/micro_class?characterEncodingutf-82.数据库编码设置 查看数据库编码&#xff1a;show variables like character%; SET character_set_database utf8; SET character_set_server utf8; 转载于:https://www.c…

牛客网--单词倒排(Java)

题目描述 对字符串中的所有单词进行倒排。 说明&#xff1a; 1、每个单词是以26个大写或小写英文字母构成&#xff1b; 2、非构成单词的字符均视为单词间隔符&#xff1b; 3、要求倒排后的单词间隔符以一个空格表示&#xff1b;如果原字符串中相邻单词间有多个间隔符时&am…

【NOIP模拟】健美猫

题面 分析 此题真是一言难尽。下面这么大一串&#xff0c;真的只是在讲一个小模拟。。。此题也是被几个julao反复讲&#xff0c;各种五花八门的奇淫巧技&#xff0c;什么数学变形&#xff0c;树状数组&#xff0c;差分&#xff0c;单调……好吧&#xff0c;我是那种只会30分暴力…

走向通用智能的核心:任务树的建立

来源&#xff1a;混沌巡洋舰人工智能的一个核心问题&#xff0c;是用已有的算法解决新的目标。对于人类来说&#xff0c;最常用的方法是得到和目标最相近的子目标&#xff0c; 子目标的子目标&#xff08;比如饿了就要找吃的&#xff0c;找吃的就要去菜市场买菜&#xff09;&am…

牛客网--字符串运用:密码截取(Java)

题目描述 Catcher是MCA国的情报员&#xff0c;他工作时发现敌国会用一些对称的密码进行通信&#xff0c;比如像这些ABBA&#xff0c;ABA&#xff0c;A&#xff0c;123321&#xff0c;但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA-&g…

关于HotSpot VM以及Java语言的动态编译 你可能想知道这些

目录 1 HotSpot VM的历史2 HotSpot VM 概述2.1 编译器2.2 解释器2.3 解释型语言 VS 编译型语言3 动态编译3.1 什么是动态编译3.2 HotSpot VM对字节码的处理方式3.3 为什么不静态编译1 HotSpot VM的历史 SUN/Oracle JDK中使用的JVM是HotSpot VM. SUN JDK从1.3.1版本开始采用HotS…

马斯克向中国保证

来源&#xff1a;金融时报美国当地时间3月20日&#xff0c;特斯拉公司&#xff08;Tesla Inc.&#xff09;首席执行官埃隆马斯克 &#xff08;Elon Musk&#xff09;通过网络参加中国发展高层论坛会议。马斯克在会议上表示&#xff0c;特斯拉公司将不会向美国政府提供其车辆在中…

牛客网--整数与IP地址间的转换

题目描述 原理&#xff1a;ip地址的每段可以看成是一个0-255的整数&#xff0c;把每段拆分成一个二进制形式组合起来&#xff0c;然后把这个二进制数转变成 一个长整数。 举例&#xff1a;一个ip地址为10.0.3.193 每段数字 相对应的二进制数 10 …

给VBox中的linux添加虚拟硬盘(扩容)

通过virtualbox的设置添加虚拟硬盘 点击添加虚拟硬盘&#xff0c;新建虚拟硬盘虚拟硬盘分区 启动系统&#xff0c;打开终端&#xff0c;切换到root用户 . 输入fdisk -l 回车&#xff0c;会看到新增的硬盘, 一般为/dev/sdb . 输入fdisk /dev/sdb 回车 . 输入n 回车&#xff0c;创…

对抗攻击层出不穷?神经科学带来新突破、导出智能统一框架,Hinton:我早有洞见

来源 &#xff1a;AI科技评论编译 &#xff1a;bluemin校对 &#xff1a;青暮最近的神经科学研究指出了如何击败对抗性示例&#xff0c;并为实现更具弹性、一致性和灵活性的人工智能指明了道路。对抗性示例是当今深度学习研究的热点。数据中微妙的&#xff0c;通常是无形的更改…

索引的概念

索引是定义在存储表&#xff08;Table&#xff09;的基础之上&#xff0c;有助于无需检查所有记录而快速定位所需记录的一种辅助存储机构&#xff0c;由一系列存储在磁盘上的索引项&#xff08;index entries&#xff09;组成&#xff0c;每一索引项又由两部分构成:索引字段和行…

牛客网--蛇形矩阵(Java)

题目描述 题目说明 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 样例输入 5 样例输出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 接口说明 原型 void GetResult(int Num, char * pResult); 输入参数&#xff1a; int Num&#xff1a;输入的正整数N 输出…

增强现实系统的三大关键技术是什么?

来源&#xff1a;VR村增强现实系统的主要任务是进行真实世界和虚拟物体的无缝融合&#xff0c;需要解决真实场景和虚拟物体的合成一致性问题。为了确保真实世界和虚拟对象的无缝融合&#xff0c;根据Ronald Azuma对增强现实技术的定义&#xff0c;在AR应用系统开发中必须要解决…

牛客网--称砝码

题目描述 现有一组砝码&#xff0c;重量互不相等&#xff0c;分别为m1,m2,m3…mn&#xff1b; 每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量(放在同一侧)&#xff0c;问能称出多少种不同的重量。 注&#xff1a; 称重重量包括0 方法原型&#xff1a;p…

51 Nod 1116 K进制下的大数

1116 K进制下的大数 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 20 难度&#xff1a;3级算法题 收藏 关注 有一个字符串S&#xff0c;记录了一个大数&#xff0c;但不知这个大数是多少进制的&#xff0c;只知道这个数在K进制下是K - 1的倍数。现在由你…

数字化?智能化?中国企业智能制造现状究竟如何 李炳积 工信头条 昨天

来源&#xff1a;先进制造业各国智能制造现状30年来&#xff0c;在智能制造领域&#xff0c;各国从早期侧重于智能设计的数值模型和离线模型&#xff0c;发展到以智能制造过程优化为目标在线智能系统&#xff0c;从传统行业进军新兴行业。欧美技术基础较好&#xff0c;对高端技…