题面

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的更多相关文章

  1. LeetCode 题解 593. Valid Square (Medium)

    LeetCode 题解 593. Valid Square (Medium) 判断给定的四个点,是否可以组成一个正方形 https://leetcode.com/problems/valid-squa ...

  2. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  3. IEEE 754标准

    IEEE 754-1985 was an industry standard for representing floating-point numbers in computers, officia ...

  4. paperOne基于java web的简易四则运算出题网站

    项目成员:张金生     张政 需求概要 1.运算数均为正整数 2.包含的运算符有+,-,*,/ 3.除法运算结果为整除运算 4.批量生成题目并判题 核心功能分析 1.题目生成——java后端 题目生 ...

  5. Codeforces Round #665 (Div. 2)

     Codeforces Round #665 (Div. 2)  A. Distance and Axis 如果\(B\)在\(O\)左边,那么只能是定值\(OA\) 如果\(B\)在\(OA\)中间 ...

  6. 竞赛题解 - [CF 1080D]Olya and magical square

    Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...

  7. 题解报告:hdu 1398 Square Coins(母函数或dp)

    Problem Description People in Silverland use square coins. Not only they have square shapes but also ...

  8. 【题解】The Great Divide [Uva10256]

    [题解]The Great Divide [Uva10256] 传送门:\(\text{The Great Divide [Uva10256]}\) [题目描述] 输入多组数据,每组数据给定 \(n\ ...

  9. 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 ...

随机推荐

  1. Markdown语法+Typora快捷键

    1. Markdown语法 1.1 代码块生成 // 对于代码块,使用"```+编程语言"即可生成书写对应代码块的区域 // JS代码块 ​```javascript // Jav ...

  2. 处理ceph incompelete的经验

    前言 最近已经见到几个环境出现过incompelete了,这个在很久以前Jewel正在合入mark-complete工具的时候就有做过类似的处理,但是随着处理的环境越来越多,这个地方还是有些需要注意的 ...

  3. java 打包压缩包下载文件

    1. 下载压缩包zip方法 @Override public void downloadZip(HttpServletResponse servletResponse) { String nowTim ...

  4. 11.java设计模式之享元模式

    基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...

  5. Linux_Python版本控制

    第1步:更新gcc,因为gcc版本太老会导致新版本python包编译不成功 复制代码代码如下: yum -y install gcc 系统会自动下载并安装或更新,等它自己结束 第2步:安装wget,这 ...

  6. Java Web 会话技术总结

    会话技术 会话概念 一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止,一次会话结束. 会话的功能 在一次会话的范围内的多次请求间,共享数据. 会 ...

  7. 在IDM上设置防止过度抓取网站信息

    在使用Internet Download Manager(IDM)下载器时,有时会发现IDM自带的抓取功能过于强大,以至于有时会抓取一些无效的链接.那么,该如何避免IDM的过度抓取呢? 图1:IDM的 ...

  8. 使用Mac清理工具CleanMyMac对Mac电脑进行维护

    CleanMyMac是Mac系统下的一款苹果电脑清理软件,同时也是一款优秀的电脑维护软件,它能通过用户手动运行CleanMyMac内置脚本文件,释放电脑内存,帮助电脑缓解卡顿现象,保证电脑的良好持续运 ...

  9. 基于gin的golang web开发:docker

    Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...

  10. svn学习与应用

    先来认识下svn svn是之前公司一直在用的代码版本控制系统,采用了分支管理系统.顾名思义,可以对代码的版本做系统化管理.通俗讲就是可用于多个人共同开发同一个项目,实现共用资源的目的. 开发同学使用s ...