[BZOJ2509][主席树]送分题

主席树模板总结及题集 介绍篇:http://blog.youkuaiyun.com/metalseed/article/details/8045038  -> 理解篇(配图比较生动):http://blog.youkuaiyun.com/regina8023/article/details/41910615  -> 题目:poj2104 区间查询第k大元素,非递归写法,非递归不好进行回溯操作,递归更好写一些 #include #inc 阅读详情
题意

给出平面上的M条平行于坐标轴的线段,问有多少个正方形。


这题其实可以O(n3)暴力10秒卡过去……
对于一个点(x,y),因为线段都是垂直于坐标轴的,我们可以计算出通过它的线段的四个端点。又因为每条线段没有重叠部分,所以可以用类似并查集的方法O(n2)处理出来。

那么暴力就是枚举每个点作为正方形的一个端点,然后枚举正方形的边长再判断。

把平面分成2n条对角线,可以证明每个正方形的两个对角肯定在同一条线段上。
然后对于每条对角线,题目可以转化为有多少对点在彼此的边长范围内。
主席树处理。

O(n2+n2logn)

轻松rank(倒数)1

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#define N 1010
using namespace std;

int n,m,Ans,L[N][N],D[N][N],U[N][N],R[N][N];

inline void reaD(int &x){
    char Ch=getchar();x=0;
    for(;Ch>'9'||Ch<'0';Ch=getchar());
    for(;Ch>='0'&&Ch<='9';x=x*10+Ch-'0',Ch=getchar());
}

int Sl(int x,int y){return L[x][y]<=y?y:L[x][y]=Sl(x,L[x][y]);}
int Sd(int x,int y){return D[x][y]<=x?x:D[x][y]=Sd(D[x][y],y);}
int Sr(int x,int y){return R[x][y]>=y?y:R[x][y]=Sr(x,R[x][y]);}
int Su(int x,int y){return U[x][y]>=x?x:U[x][y]=Su(U[x][y],y);}

struct ft{
    struct tr{
        int l,r,ls,rs,x;
    }T[N<<4];

    int t,rt[N],tc;

    void InserT(int &x,int y,int d){
        x=++t;
        T[x]=T[y];
        T[x].x++;
        if(T[x].l==T[x].r) return ;
        int mid=T[x].l+T[x].r>>1;
        if(d<=mid) InserT(T[x].ls,T[y].ls,d);
        else InserT(T[x].rs,T[y].rs,d);
    }

    int QuerY(int x,int l,int r){
        if(T[x].l==l&&T[x].r==r) return T[x].x;
        int mid=T[x].l+T[x].r>>1;
        if(r<=mid) return QuerY(T[x].ls,l,r);
        if(l>mid) return QuerY(T[x].rs,l,r);
        return QuerY(T[x].ls,l,mid)+QuerY(T[x].rs,mid+1,r);
    }

    void build(int &x,int l,int r){
        x=++t;
        T[x].l=l;T[x].r=r;
        if(l==r) return;
        int mid=l+r>>1;
        build(T[x].ls,l,mid);
        build(T[x].rs,mid+1,r);
    }

    inline void build(){
        build(rt[0],1,n+1);
        tc=t;
    }

    inline void clear(){t=tc;}

    inline void Insert(int x,int L,int d){
        rt[x]=rt[x-1];
        if(d>0) InserT(rt[x],rt[x-1],L);
    }

    inline int Query(int x,int d){return QuerY(rt[x],d,n+1);}
}B;

inline int calc(int x,int y){
    int Res=0;B.clear();
    for(int j=1;x<=n;x++,y++,j++){
        int k=min(x-U[x][y],y-R[x][y]);
        if(k>0)Res+=B.Query(j-1,j)-B.Query(j-k-1,j);
        k=min(D[x][y]-x,L[x][y]-y);
        B.Insert(j,j+k,k);
    }
    return Res;
}

int main(){
    memset(L,-1,sizeof(L));
    memset(D,-1,sizeof(D));
    memset(R,0x7F,sizeof(R));
    memset(U,0x7F,sizeof(U));
    reaD(n);reaD(m);
    for(int i=1,x1,y1,x2,y2;i<=m;i++){
        reaD(x1);reaD(y1);
        reaD(x2);reaD(y2);
        if(x1==x2){
            if(y1>y2) swap(y2,y1);
            for(int j=y1;j<=y2;j++)L[x1][j]=max(y2,L[x1][j]),R[x1][j]=min(y1,R[x1][j]);
        }else{
            if(x1>x2) swap(x1,x2);
            for(int j=x1;j<=x2;j++)D[j][y1]=max(x2,D[j][y1]),U[j][y1]=min(x1,U[j][y1]);
        }
    }
    for(int i=0;i<=n;i++)
        for(int j=0,x,y;j<=n;j++)
            Sl(i,j),Sd(i,j),
            Sr(i,j),Su(i,j);
    B.build();
    for(int i=0,x,y,j;i<=n;i++)Ans+=calc(i,0)+calc(0,i+1);
    return printf("%d\n",Ans),0;
}
【STK】手把手教你利用STK进行弹道导弹和运载火箭发射仿真的相关方法全过程解析 写这个系列主要是这几年做了一些弹道导弹和运载火箭发射的相关仿真项目,stk软件由于其专业性在国内比较小众,相关的教程和书籍、经验贴都不是很多,因此新手在进行开发中容易遇到较多困难,把自己的一些经验体会写下来,一方面供自己总结回顾,另一方面也希望对大家有所帮助。这个系列计划分几篇文章写完,每章的内容结构相似,都分为①如何确定发射场位置和发射轨迹、②导入导弹和运载火箭模型、③设计模型分段动作、④飞行参数分析和相关应用这四个部分,每篇文章争取完整描述1-2个实际项目的操作过程。 阅读详情

相关推荐

利用HTML+CSS设计PPT:html-to-pptx实现自动化转换与可编辑输出

在办公自动化和前端开发领域,将网页技术应用于文档生成是一个重要的技术方向。其核心原理在于通过解析HTML/CSS的结构与样式,将其映射为目标文档的原生对象模型。这项技术的价值在于,它能够将Web技术栈强大的布局与样式能力(如Flexbox、CSS Grid)与办公软件(如Microsoft PowerPoint)的广泛兼容性和可编辑性相结合。在实际应用场景中,这种技术特别适合需要快速生成兼具设计感与实用性的演示文稿,例如数据报告、产品发布和营销材料。本文探讨的html-to-pptx项目正是这一思路的工程实

weixin_30652491的博客 486

BZOJ 题目整理

现在要写一些题目。 现在已经做了:157题

喵~ 2652

用RFSoC ZU47DR搭建软件无线电原型:从零配置Vivado到生成第一个射频信号

本文详细介绍了如何使用Xilinx RFSoC ZU47DR开发板搭建软件无线电原型系统,从Vivado环境配置到生成首个射频信号的全流程。通过整合ARM处理器、FPGA逻辑和高速ADC/DAC,该平台为通信算法验证提供了高效解决方案,特别适合SDR开发者和通信工程师快速实现原型设计。

weixin_26763955的博客 587

BZOJ2509 : 送分题

求出每个点向上下左右能延伸的最大长度$left$、$right$、$up$、$down$。 枚举每一条对角线,如果$j$可以作为左上角,$i$可以作为右下角,那么有: $j+\min(down[j],right[j])-1\geq i$ $i-\min(left[i],up[i])+1\leq j$ $j&lt;i$ 排序+树状数组统计即可。 时间复杂度$O(n^2\log n)$。 ...

weixin_34392906的博客 150

SAP-MM-采购申请字段解析

采购申请抬头以及行项目字段解析

yanzibing99的博客 7305

别再只调API了!深度拆解Dify文件上传的两种传参方式(sys.file vs. inputs.upload_file)

本文深度解析Dify平台文件上传的两种传参方式——sys.file与inputs.upload_file,详细对比其设计原理、技术实现及适用场景。通过代码示例和性能分析,帮助开发者在本地大模型应用中做出精准技术选型,提升文件处理效率与系统稳定性。

weixin_29063979的博客 266

bzoj 2509 送分题 && SNOI省选模拟赛Round3 T3 正方形square 树状数组

题目链接:戳这里2509: 送分题Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 26[Submit][Status][Discuss]Description给出平面上的M条平行于坐标轴的线段,问有多少个正方形。 Input第1行为两个正整数N,M。接下来M行,每行4个非负整数x1,y1,x2,y2(0≤x1≤x2≤N,0≤y

Twin Automata的博客 349

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

伶俐角少儿编程 639

zjnu2017校赛M会长的正方形

出现正方形顶点都在格点上的情况: 设x,y。比如x=0,y=1表示的就是边长为1的正方形,x=0,y=2表示边长为2的正方形,x=1,y=2表示边长为根号5的正方形,x=1,y=3表示的是边长为根号9的正方形。那么特定的x,y可以表示一种正方形。 经过观察,x+y是刚好放下这个正方形所要的格子的边长。x*x+y*y是这个正方形的面积。 再观察,假设格子大小为n,m(n L=1时,这种正方形

Mr_Alice的博客 608

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果识别系统(Python+PySide6界面+训练代码)

本文详细介绍了基于YOLO系列目标检测算法(包括YOLOv5、YOLOv6、YOLOv7和YOLOv8)的水果识别系统的设计与实现。系统采用Python语言开发,结合PySide6构建用户界面,实现了从数据准备、模型训练到部署应用的全流程。本文将提供完整的代码实现、详细的训练过程分析以及性能对比实验,并给出推荐的数据集资源。该系统可以准确识别多种水果类型,为智能农业、自动售货、食品加工等领域提供技术支持。

YOLO 563

使用OpenGL加载和显示DXF格式的3D模型文件编程

这样,我们就完成了使用OpenGL加载和显示DXF格式的3D模型文件的编程。通过实现加载函数和绘制回调函数,我们能够读取DXF文件的数据并使用OpenGL绘制出来。请注意,这只是一个简单的例子,仅涵盖了基本的加载和显示功能。在本文中,我们将探讨如何使用OpenGL编程加载和显示DXF(Drawing Exchange Format)格式的3D模型文件。DXF是一种通用的CAD(计算机辅助设计)文件格式,常用于存储和交换2D和3D图形数据。使用OpenGL加载和显示DXF格式的3D模型文件编程。

2301_79331421的博客 411

很久以前的刷题记录

4.25 bzoj1532 二分+最大流……有点妙 4.24 CF235D 这道题……好神啊…… 题解 4.23 CF235B 思博期望题,bz上有道差不多的 题解 4.22 CF235C 后缀自动机 题解 CF235E 数学,反演 题解 CF235A 太傻了没话说……几个if的问题…… 4.3 bzoj3309 线段树合并(机房里dalao们在讨论在线做法……我反...

weixin_30517001的博客 132

数学建模学习(5):最全概率分析之图表绘制详解,内容比较多,建议收藏

(1) 绘制正整数频率使用 tabulate(X) (2)

全栈川川 4591

poj2104&&hdu2665kth number【主席树入门题+讲解】

又是卡了一天的知识点,(其实是看不下去下午上网来着,(⊙﹏⊙)b)昨天差点找人问带有懒惰标记的线段树和主席树的区别与联系,多亏憋住了……主席树里面存储的某数字出现的次数,而线段树大多数储存数值,也不好说谁好谁不好,毕竟前者主要处理区间内与个数有关系的问题,比如说区间第k小、区间内不重复数字个数等等,这些线段树都做不了,据说修改主席树时要用树状数组,那不就成了树套树?omg    说几个孙大神的课

MissZhou要努力 1113

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【牛客 - 181B】送分题(另类求解a+b,二分)

题干:   对于一套题来说,没有一道送分题,就很不符合常理,但是我又懒得写送分题,所以你可以直接复制以下代码,即可ac本题. #include&lt;cstdio&gt;#include&lt;iostream&gt;  using namespace std; int a,b,c;  int main(){long long l=1,r=int(1e9)&lt;&lt;1:cin》a&gt;...

xuanweiace的博客 768

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SNOI省选模拟赛Round1 T3 tree

题目大意: 给定一颗树,要求支持两种操作: 1 x y:加入一组点对,并输出x到y路径上的和。 2 e v:将第e条边的值改为v,然后询问之前加入的点对距离和的最大值,然后恢复原状。 题解:树链剖分。 我太弱了并不能完全讲清题解的意思,就先占个坑吧。 代码:#include #define maxn 300005 #define ls (id<<1) #define rs (id<<1

Twin Automata的博客 259

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

bzoj2509: 送分题

2509: 送分题 Time Limit:10 SecMemory Limit:128 MBSubmit:53Solved:21[Submit][Status][Discuss] Description 给出平面上的M条平行于坐标轴的线段,问有多少个正方形。 Input 第1行为两个正整数N,M。 接下来M行,每行4个非负整数x1,y...

weixin_30877181的博客 132

snoi省选模拟赛 day3t3 bzoj 2509 正方形

snoi省选模拟赛 day3t3 bzoj 2509 正方形

Rising_shit的博客 528

[主席树] Codeforces 840D .Destiny

%%%Vectorxj 设答案为p=r−l+1kp={r-l+1\over k },如果把区间元素排序,那么答案一定是第p个、第2p个…第kp个元素中的一个。 因为答案出现次数大于p,一定会跨越一个边界,所以以上结论成立 那么就在主席树上二分出这些数,找出最小的满足条件的就可以了#include <cstdio> #include <iostream> #include <algorithm>

CE玩家 1418

[BZOJ Contest-2017省队十连测推广赛2·T2][BZOJ4771][主席树][dfs序]七彩树

%%%Manchery先考虑没有深度限制,要计算子树中不同的颜色的个数,就令所有节点的初始权值为1,就把两两相同颜色的节点的LCA的权值-1,然后求一遍子树权值和就可以了。 但是这样做复杂度是O(n2)O(n^2),而且会在某个节点多次-1。其实只要把颜色相同的节点提出来,按照dfs序的标号排个序,然后在相邻的节点的LCA处-1就行了。然后考虑有深度限制,仔细想想发现这个限制特别像主席树,那么就以

CE玩家 1407

[BZOJ4923][Lydsy六月份月赛 .G][平衡树]K小值查询

直接上题解 学了发非旋转Treap,感觉常数有点大#include <cstdio> #include <iostream> #include <algorithm>using namespace std;const int N=100010;int n,m; int a[N];struct node{ node *l,*r; int val,fix,size,minus; node(

CE玩家 1137

[k短路 && 可持久化堆]HDU5960.Subsequence

如果只求最大价值,显然可以DP fi,jf_{i,j} 表示前 ii 个点,最后一个点的颜色是 jj 的最大价值但是要求第k大的 把每个状态建成点,转移建成边,那么就构成一张图 求第k大就直接套可持久化堆的k短路算法就好了#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #define fi

CE玩家 1100

[(可持久化)字典树 优化建图][2-SAT] LOJ#6036. && 雅礼集训 2017 Day4. 编码

老早以前的坑了 貌似好多地方都有这个题 因为每个串都只有一个问号,问号可取0可取1,这就是一个经典的2-SAT模型 但是直接做的话,边数是n2n^2级别的,不过因为是01串,可以用可持久化字典树优化建图(可能也可以不可持久化,但是我觉得可持久化比较方便)#include <cstdio> #include <iostream> #include <algorithm> #include <st

CE玩家 978

[最短路 && 主席树维护HASH] 51nod1863 Travel

把一条路径上的点值按排名顺序排序,那么路径的优劣就是字典序。相当于是求一条字典序最大的路径。 最长路然后就是老套路,用主席树来维护hash,就可以在O(log)的时间里比较两个串的字典序,然后就套最短路就可以了用对优化的DIJ复杂度就是O((N+M)lognlogn)O((N+M)\log n\log n)#include <cstdio> #include <iostream> #include

CE玩家 883

[主席树优化建图] LOJ#546. 「LibreOJ β Round #7」网格图

最简单的思路是离散化后 O(k2)O(k2)O(k^2) 搞 然而对于横着的朝向,极长的横着相连的格子的答案是相同的,竖着的同理 那么把极长的相连的格子也缩起来,用主席树优化建图,就可以 O(klogk)O(klog⁡k)O(k\log k) 最短路了 #include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;algorit...

CE玩家 726
上一篇: [POI][BZOJ4381]Odwiedziny 访问
下一篇: [BZOJ2186][Sdoi2008]沙拉公主的困惑
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值