poj 1436 线段树区间操作 Horizontally Visible Segments

合肥工业大学操作系统实验9 依据操作系统课程所介绍的页面置换算法与动态内存分配的原理,本实验的目的是掌握OPT、FIFO、LRU、LFU、Clock等页面置换算法;掌握可用空间表及分配方法;掌握边界标识法以及伙伴系统的内存分配方法和回收方法。从而深入理解操作系统的内存管理。从而加深对教材上页面置换算法与动态内存分配的理解。 阅读详情
给出 n 条垂线,问有多少个三元组 中,任意两条可以看得到对方
样例中 答案为 1 ,横坐标 为 1 的线段+横坐标 为 2 (3,4)的线段+横坐标为 1 的线段
做过 poj 2777 区间染色的问题 就 很容易看出这个 题目 其实就 是 该问题 的小 延伸,我们可以根据x坐标进行从小到大的排序,然后对每条线段query该线段左端,改线段统领的
区间内 有多少种color,vis[][]记录,如果可以看得到的color在两个color之间加一条相当于边的标记,表示可看见,然后Update
全部query完之后,暴力n^3 求解。。

同时要注意如 样例 中 ,0 2 2,3 4 2这两条线段,可以看到 2 3之间是没有被覆盖的,然而我们查询的时候查到的是2被覆盖,3被覆盖,因此我们会认为[2,3]是被覆盖的。解决方法就是把纵坐标都乘以2.

做题过程:

      哎,12分钟就敲完了。然后调了18分钟还是没过。发现又是思路有点偏颇。刚开始把更新和查询放在一起做了,这样子做是不对的。因为更新只更新到[L,R],但是查询可以查询到更下一层。结果就。。。orz了。

     还有一点是不变的真理。可以用-1表示这个区间有很多种颜色,用0表示这个区间没有颜色。用>= 1来表示颜色。这样形成习惯就好。

     刚开始看的时候没想明白为什么要先按坐标排序,敲的时候想明白了。这样才能保证题意所要求的能相连。

/*
Pro: 0

Sol:

date:
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
#define maxn 20000
#define lson l, m , rt << 1
#define rson m + 1, r, rt << 1 |1
#define havem int m = (l + r ) >> 1
using namespace std;
int T,n;
bool vis[8001][8001];
int color[maxn << 2];
struct Seg{
    int x, y1, y2;
    bool operator <(const Seg & cmp) const{
        return x < cmp.x;
    }
}p[maxn];
void build(int l, int r, int rt){
    color[rt] = 0;
    if(l == r) return ;
    havem;
    build(lson); build(rson);
}
void push_dn(int rt){
    if(color[rt] != -1)
        color[rt << 1] = color[rt << 1 | 1] = color[rt], color[rt] = -1;
}
void query(int L, int R, int val, int l , int r, int rt){
    if(color[rt] != -1){//
        vis[color[rt]][val] = true;
        return ;
    }havem; push_dn(rt);
    if(L <= m) query(L,R,val,lson);
    if(R > m) query(L,R,val,rson);
}
void update(int L,int R,int val, int l, int r,int rt){
//    if(color[rt] != -1){// 不能偷懒,将更新和询问写着一起。因为可能递归到L,R的更下一层,在这里写的话就不对了。。。
//        vis[color[rt]][val] = true;
//    }
    if(L <= l && r <= R){
        color[rt] = val;
        return ;
    }havem; push_dn(rt);
    if(L <= m) update(L,R,val,lson);
    if(R > m) update(L,R,val,rson);
}
int main(){
    scanf("%d",&T);
    while(T --){
        scanf("%d",&n);
        for(int i = 1; i <= n; i ++)
            memset(vis[i],0,sizeof(vis[i]));
        for(int i = 1; i <= n; i ++){
            scanf("%d%d%d",&p[i].y1,&p[i].y2, &p[i].x);
            p[i].y1 <<= 1;
            p[i].y2 <<= 1;
        }
        sort(p + 1, p + n + 1);
        build(0,maxn,1);
        for(int i = 1; i <= n; i ++){
//            query(p[i].y1,p[i].y2,i,0,maxn,1);
            update(p[i].y1,p[i].y2,i,0,maxn,1);
        }
        int cnt = 0;
        for(int i = 1; i <= n; i ++){
            for(int j = 1; j <= n; j ++){
                if(i == j) continue;
                if(vis[i][j]){
                    for(int k = 1; k <= n; k ++){
                        if(k == i || k == j)    continue;
                        if(vis[i][k] && vis[j][k]) cnt ++;
                    }
                }
            }
        }
        printf("%d\n",cnt);
    }
	return 0;
}


深入浅出AXI协议(2)——通道及信号 本文我们继续AXI协议的学习,我们将讨论5个通道的具体内容和相对应的信号。这一部分的内容现在对于大家来说可能很难理解,但是没有关系,随着学习的深入,我们会逐步讲解这里面的所有现在,现在只需要把它们当作一个可以查阅的手册,快速阅读有一个基本的印象即可。 阅读详情

相关推荐

Unity跨平台存储避坑指南:persistentDataPath权限真相

Application.persistentDataPath是Unity中用于持久化数据的核心路径,表面提供跨平台抽象,实则底层访问机制因操作系统而异。其原理并非简单路径映射,而是受Android Scoped Storage、iOS Data Protection、Windows组策略及macOS隐私权限等多层安全模型动态约束。技术价值在于保障用户数据长期可靠存储,但若忽略平台差异,极易引发‘本地正常、真机崩溃’‘iOS可存、Android报错’等线上事故。典型应用场景包括游戏存档、离线缓存、自定义资源包

weixin_32073537的博客 351

POJ 1436 Horizontally Visible Segments(线段树区间修改)

题目链接:点击打开链接 题意:n条竖直线段,如果两条线段之间可见(即可以用一条水平线段连接而不触碰其他线段),则称它们可见。   如果三条线段任意两条都可见, 则称它们为a triangle of segments, 求a triangle of segments的个数 思路: 一开始真没想到n^3的复杂度可以过。。。  如果这样的话, 问题的关键就是怎样判断任意两个线段是否可见。 那么如果

AC_Arthur的专栏 1315

【CAPL实用开发】--- 使用VN1640A测试Busoff快慢恢复

使用VN1640A测试Busoff快慢恢复,包含具体的CAPL代码实现。

LabVIEW、CAPL、python、车载以太网等学习分享,文章正在写 2096

POJ 1436 Horizontally Visible Segments(线段树)

转载请注明出处,谢谢http://blog.youkuaiyun.com/acm_cxlove/article/details/7854526       by---cxlove 题目:给出一些垂直的线段,两两可见的三条线段有多少组。 可见是说找出一条水平线段连接两条线段,而且这条线段不和别的线段相交。 http://poj.org/problem?id=1436 被yobobobo问起,竟然线段

窝不是爱酱,喵~~~~ 1084

educoder数字逻辑实训:寄存器设计与应用(Logisim)

第1关:基本寄存器的设计 任务描述 本关任务:在Logisim中,构建由4个D触发器构成的4位基本寄存器,要求上升沿触发,具有异步复位功能。 第2关:移位寄存器的设计 任务描述 本关任务:在Logisim中,构建由4个D触发器构成的4位右移移位寄存器,要求上升沿触发,具有异步复位功能。 第3关:循环移位寄存器的设计 任务描述 本关任务:在Logisim中,构建由4个D触发器构成的4位循环右移移位寄存器,要求上升沿触发,具有异步复位功能以及并行数据同步加载功能。 第4关:并行..

qq_52209002的博客 1万+

sap 新增科目表_SAP系统中四大科目表的总结

操作科目表定义-OB13 2国家科目表定义-OB13 3集团科目表定义-OB13 4合并科目表(ECCS)定义-CX10 4分配操作科目表到公司代码-OB62 5分配国家科目表到公司代码-OB62 6分配集团科目表到操作科目表-OB13 6分配集团科目表到合并科目表-CXNF 7Operation 8定义集团科目表的科目-FSP0 8定义国家科目表的科目-FSP0 8定义操作科目表的科目-FSP0...

weixin_39585463的博客 1721

poj 1436 Horizontally Visible Segments(线段树、区间覆盖)

Horizontally Visible Segments Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4645   Accepted: 1706 Description There is a number of disjoint vertical line seg

hahahaha 925

Solidworks钣金设计:折弯系数、K因子与折弯扣除的实战应用解析

本文深入解析Solidworks钣金设计中折弯系数、K因子与折弯扣除的核心概念与实战应用。通过厘清三者间的逻辑关系与换算方法,并结合材料特性、工艺参数及车间实测,指导工程师精准确定展开长度,确保设计图纸与加工实物的一致性,有效提升钣金件设计精度与生产效率。

weixin_29268267的博客 924

[poj 1436]Horizontally Visible Segments[线段树]

题意: 给出一系列竖直的线段, 给出上下两端点坐标和横坐标, 定义"水平可见"为两线段之间可以连一条水平线段, 使得该线段不与其他线段接触. 又定义"三条线段可组成三角形"为三条线段两两"水平可见". 问一组线段中一共可以组成多少三角形. 思路: 首先这个"可见"可以想到涂色覆盖问题, 纵向建立线段树. 可知横坐标只起到排序的作用, 并无影响. 因为是一层层添加, 所以就像求逆序数一样

以中有足乐者... 898

ParaView: 从 2 或 3 个标量创建向量

ParaView: 从 2 或 3 个标量创建向量

希望我的博客,能帮上你解决学习中工作中所遇到的问题 585

SAP 针对不同行业(制造业、零售业、金融业)推出了专属的云解决方案,以下是各行业的核心方案与特点

SAP推出行业专属云解决方案:制造业(SAP Digital Manufacturing Cloud)提供AI排产与质量预警,降低缺陷率;零售业(S/4HANA Cloud零售版)实现AI预测补货与全渠道库存同步,减少浪费;金融业(Business ByDesign)支持合规自动化与实时风控,降低审计成本。各方案均采用云原生架构,典型案例显示实施效果显著。

金牌架构师 493

POJ 1436 Horizontally Visible Segments 线段树

http://poj.org/problem?id=1436 题意: 有N根竖直的杆子,每个杆子都用一个长度,两根杆子可以想见意味着两个杆子在水平 方向上存在一条直线,使得该直线连接两个杆子,并且该水平直线和其他的杆子都没有 交点,问一共有多少对三根杆子的组合使得杆子两两可见。 思路: 首先我们可以依次枚举一根杆子作为三根中的某一根,然后再在与这根可见的杆子中找 两根互相可见的杆子。

Chris_Home 929

snmp MIB详解

每个 MIB 对象都由一个对象标识符(OID)和对象类型组成。OID 是一个由多个数字组成的路径(类似于 IP 地址),它标识了 MIB 中对象的层次结构。

dlz0836的博客 3722

poj 1436 Horizontally Visible Segments[线段树]

/* poj 1436 题意: 给出N(N <= 8000)条垂直线段,如果两条线段在水平方向上连一条线之后不和其他任 何垂直线段相交,那么我们称这两条线段水平可见,如果三条垂直线段两两水平可见 ,则称其为一个三角,问着N条线段能组成多少三角。 解法: 线段树记录线段的id号。先将每一条线段按照x坐标排序,然后对于每一条线段, 先查询之前在它覆盖的区域内能看见哪些线段没有被完全覆盖,然后再用这条线

uiiの技术随笔 972

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

POJ1436 Horizontally Visible Segments 线段树区间更新--区间覆盖

题目链接:http://poj.org/problem?id=1436 题目大意:有n条平行于y轴的线段,定义两线段可见,当且仅当这两条线段可以被一条水平线链接,且该水平线段不经过其他垂线段;定义三角形线段为两两可见的三条垂线段。现在给出n条线段,问你一共有多少组三角形线段。 分析:区间覆盖问题,POJ2777的升级版。两条线段a和b可见,就是说在存在某一区间[l,r],使得在

AC_Gibson的专栏 558

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Horizontally Visible Segments POJ - 1436(线段树区间覆盖)

There is a number of disjoint vertical line segments in the plane. We say that two segments are horizontally visible if they can be connected by a horizontal line segment that does not have any common...

tomjobs的博客 534

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Horizontally Visible Segments POJ - 1436

简单线段树维护 #include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; #define lson num&lt;&lt;1,s,mid #define rson num&lt;&lt;1|1,mid+1,e #define maxn 8005 us...

leekerian的博客 203

POJ-1436___Horizontally Visible Segments —— 线段树

题目链接:点我啊╭(╯^╰)╮ 题目大意: &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; nnn 条垂直于 xxx 轴的线段,对于两条线段,如果有一条平行于 xxx 轴的线穿过它们,并且不经过其他线段,则称这两条线段可见 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 求有多少三元组线段,他们之间两两可见? 解题

Scar_Halo 242

POJ-1436Horizontally Visible Segments

能用线段树做,但是n3也过 #include #include #include #include using namespace std; struct edge { int y1,y2,x,id; }E[8008]; int node[8008*8]; bool ok[8008][8008]; inline bool cmp(edge a,edge b) { retu

a962415287的博客 294

poj 1436 Horizontally Visible Segments 线段树求垂直三角形的个数

题目链接:http://poj.org/problem?id=1436 题意:三条垂直线如果能两两用水平线相连,且该水平线不被和其他的垂直线相交,则这三条垂直线成为垂直三角形,然后给你一些线段,数据有y的坐标范围和x的坐标,求所有这些线能够成的垂直三角形的个数 分析:用线段树解决,根据线段x坐标从小到大插入的线段树中,每次插入前先查询这个线段能够看见的线段,把这些线段的id存到这条新要

renew 899

zoj 1391 || poj 1436 Horizontally Visible Segments

给你N条线段(垂直于x轴)的两个y坐标还有x坐标,问相互看到的三元组有多少个。 相互看到指能用一条水平线连起来而且不经过其他线段。 刚开始就想到暴力了,可是很纠结的,如果用线段树计算出相互能看到的对数,然后再暴力,这个时间复杂度不会算,囧。。。 虽然才8000线段,应该不是

小媛在努力~ 1969

POJ1436 Horizontally Visible Segments

个人觉得比较坑的线段树的题目,因为题意我就理解了半天 题意: 有N根竖直的杆子,每个杆子都用一个长度,两根杆子可以想见意味着两个杆子在水平 方向上存在一条直线,使得该直线连接两个杆子,并且该水平直线和其他的杆子都没有 交点,问一共有多少对三根杆子的组合使得杆子两两可见。这里要注意的地方有一点是如果只是两个杆子的边界相同,只要他们中间没有间隔他们也能相互看见,比如说y坐标为1

beyhhhh的博客 401

poj1436 Horizontally Visible Segments

这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见“情况时,由于[1,2],[2,3]将2,3端点覆盖,最终得不到[1,5]和区间[1,4]”可见“的情况,而实际上两者的[2,3]区间是可以存在一条水平线将其直接相连的。接下来将要更新的区间按照x从小

rootial的专栏 395

POJ 1436 Horizontally Visible Segments [线段树-区间更新]【数据结构】

题目链接:http://poj.org/problem?id=1436 ————————————————————————-. Horizontally Visible Segments Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5262 Accepted: 1932 DescriptionTher

Tabris的博客 449

POJ 1436 Horizontally Visible Segments (线段树水过)

题目大意: 就是现在给出n 大致思路: 表示没有想到比较靠谱的计数方法, 用线段树处理出各个线段的可视情况之后如何计数感觉网上说的三重循环枚举的计数方法不可靠 但是还没有想到比较好的方法, 先水过去了... 注意纵坐标都乘上了2的原因是为了处理这一类情况: 前面有线段(2, 0)->(2, 2) 和线段(2, 3)->(2, 5)那么当出现(3, 1)->(3, 4)的时候这

Gatevin的专栏 532

POJ 1436 Horizontally Visible Segments(线段树区间更新)

There is a number of disjoint vertical line segments in the plane. We say that two segments are horizontally visible if they can be connected by a horizontal line segment that does not have any common points with other vertical segments. Three different ve

HJY 417
上一篇: poj 3084 最小割 模板题 PANIC ROOM
下一篇: poj 3667 线段树前后缀区间 Hotel
Julyana_Lin
博客等级 码龄15年 36粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值