题解-CF1401E Divide Square
题面
给一个正方形平面边长为 \(10^6\),给 \(n\) 条横线段和 \(m\) 条竖线段,每条线段都与正方形边缘相交且一条直线上不会有两条线段,求被线段划分后有几个块。
数据范围:\(0\le n,m\le 10^5\),\(0<x,y<10^6\),\(0\le (lx<rx),(ly<ry)\le 10^6\)。
蒟蒻语
前天打小号 \(30\) 分钟切了 \(\tt ABCD\) 以为能 \(\tt AK\),结果 \(\tt E\) 少看了条件开始硬钢幸得爆零。
蒟蒻解
结论:\(ans=(\)内部交点数 \(p)+(10^6\) 长度线段数 \(s)+1\)。
这个结论应该比较好找,可以多画几个图找规律。
蒟蒻本来想了一个很炫酷的证明,但被证伪了,看个逊一点的吧……
证明:
对于 \(s=0\) 的情况,所有线段都贴且仅贴一边又互相不重合,所以每多一个交点多一个块易证。
对于 \(s>0\) 的情况,如果一条长度为 \(10^6\) 的线段不穿过线段,那么固然把正方形分成两块多一块。否则从一条被穿过的线段把它拆成两条线段考虑,答案也会 \(+1\)。
综上,\(ans=p+s+1\)。
至于实现,可以用树状数组扫描线,代码中给出一种新奇的树状数组写法。
代码
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair((a),(b))
#define x first
#define y second
#define be(a) (a).begin()
#define en(a) (a).end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
#define R(i,a,b) for(int i=(a),I=(b);i<I;i++)
#define L(i,a,b) for(int i=(a),I=(b);i>I;i--)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
//Data
const int N=1e5,M=1e6;
int n,m; ll ans=1;
vector<int> d;
struct segment{
int op,y,l,r;
segment(){}
segment(int _op,int _y,int _l,int _r){
op=_op,y=_y,l=_l,r=_r;
}
};
vector<segment> a;
//FenwickTree
vector<int> c;
void add(int i,int v){for(;i<sz(c);i|=i+1) c[i]+=v;}
int sum(int i){int v=0;for(;~i;(i&=i+1)--) v+=c[i];return v;}
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
R(i,0,n){
int y,l,r; cin>>y>>l>>r;
if(r-l==M) ++ans;
d.pb(l),d.pb(r),a.pb(segment(0,y,l,r));
}
R(i,0,m){
int x,l,r; cin>>x>>l>>r;
if(r-l==M) ++ans;
d.pb(x),a.pb(segment(1,l,x,1)),a.pb(segment(1,r,x,-1));
}
sort(be(a),en(a),[&](segment p,segment q){
if(p.y!=q.y) return p.y<q.y;
return p.op*p.r>q.op*q.r;
});
sort(be(d),en(d)),d.erase(unique(be(d),en(d)),en(d));
c.assign(sz(d),0);
// c.assign(M+1,0);
for(auto u:a){
if(u.op){
int i=lower_bound(be(d),en(d),u.l)-be(d);
add(i,u.r);
} else {
int l=lower_bound(be(d),en(d),u.l)-be(d);
int r=lower_bound(be(d),en(d),u.r)-be(d);
ans+=sum(r)-sum(l-1);
}
}
cout<<ans<<'\n';
return 0;
}
祝大家学习愉快!
题解-CF1401E Divide Square的更多相关文章
- LeetCode 题解 593. Valid Square (Medium)
LeetCode 题解 593. Valid Square (Medium) 判断给定的四个点,是否可以组成一个正方形 https://leetcode.com/problems/valid-squa ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- IEEE 754标准
IEEE 754-1985 was an industry standard for representing floating-point numbers in computers, officia ...
- paperOne基于java web的简易四则运算出题网站
项目成员:张金生 张政 需求概要 1.运算数均为正整数 2.包含的运算符有+,-,*,/ 3.除法运算结果为整除运算 4.批量生成题目并判题 核心功能分析 1.题目生成——java后端 题目生 ...
- Codeforces Round #665 (Div. 2)
Codeforces Round #665 (Div. 2) A. Distance and Axis 如果\(B\)在\(O\)左边,那么只能是定值\(OA\) 如果\(B\)在\(OA\)中间 ...
- 竞赛题解 - [CF 1080D]Olya and magical square
Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...
- 题解报告:hdu 1398 Square Coins(母函数或dp)
Problem Description People in Silverland use square coins. Not only they have square shapes but also ...
- 【题解】The Great Divide [Uva10256]
[题解]The Great Divide [Uva10256] 传送门:\(\text{The Great Divide [Uva10256]}\) [题目描述] 输入多组数据,每组数据给定 \(n\ ...
- LeetCode题解:(221) Maximal Square
题目说明 Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's a ...
随机推荐
- c++中的几种函数调用约定(转)
C++中的函数调用约定(调用惯例)主要针对三个问题: 1.参数传递的方式(是否采用寄存器传递参数.采用哪个寄存器传递参数.参数压桟的顺序等): 参数的传递方式,最常见的是通过栈传递.函数的调用方将参数 ...
- seaborn库中柱状图绘制详解
柱状图用于反映数值变量的集中趋势,用误差线估计变量的差值统计.理解误差线有助于我们准确的获取柱状图反映的信息,因此打算先介绍一下误差线方面的内容,然后介绍一下利用seaborn库绘制柱状图. 1.误差 ...
- Docker与Ceph的分与合
前言 docker是一个管理工具,在操作系统之上提供了一个新的独立轻环境,好处是本地提供了一个基础镜像,然后基于镜像再运行环境,也可以把环境重新打包为镜像,管理起来类似于git,感觉非常的方便,并且能 ...
- mysql 数据库存储路径更改
使用了VPS一段时间之后发现磁盘空间快满了.本人的VPS在购买的时候买了500gb的磁盘,提供商赠送了20GB的高性能系统磁盘.这样系统就有两个磁盘空间了.在初次安装mysql 的时候将数据库目录安装 ...
- 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
一.微服务网关Spring Cloud Gateway 1.1 导引 文中内容包含:微服务网关限流10万QPS.跨域.过滤器.令牌桶算法. 在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuu ...
- vue实现增删改查(内附源代码)
VUE+Element实现增删改查 @ 目录 VUE+Element实现增删改查 前言 实验步骤 总结: 源代码 前言 &最近因为一些原因,没有更博客,昨天老师布置了一个作业,用vue实现增删 ...
- apiAutoTest-更新2020/11/23
原始版本 简书:https://www.jianshu.com/p/6bfaca87a93b 博客园:https://www.cnblogs.com/zy7y/p/13426816.html test ...
- thinkPHP命令执行漏洞
thinkPHP中反斜杠的作用是类库\命名空间 命令执行的姿势 通过反射invokefunction调用call_user_func_array方法,call_user_func_array函数接受两 ...
- jsp跳转不成功,服务器也不报错,登录页面点击登录没反应,代码如下,请韭菜园子的工友给予指导!
登录后.. 根本跳不到这个检查页面.. 这个登录成功页面也就无从谈起了!
- 死磕以太坊源码分析之p2p节点发现
死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...