poj1436(线段树区间染色)

一窥Memory测试算法及自我修复机制 摘要 为了满足新一代设备的需求,Memory的大小每三年就会增加4倍。深亚微米设备包含大量面积更小、访问速度更快的Memory。针对此类设计制定自动测试策略可以减少ATE(自动测试设备)的时间和成本。 内存故障的行为与经典的“Stuck-At”故障不同。因此,Memory的故障模型(由于其阵列结构)与标准逻辑的设计也是不同的。Memory测试除了进行故障检测和定位,还可以实现用冗余单元对... 阅读详情

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 vertical segments are said to form a triangle of segments if each two of them are horizontally visible. How many triangles can be found in a given set of vertical segments?

Task

Write a program which for each data set:

reads the description of a set of vertical segments,

computes the number of triangles in this set,

writes the result.

Input

The first line of the input contains exactly one positive integer d equal to the number of data sets, 1 <= d <= 20. The data sets follow.

The first line of each data set contains exactly one integer n, 1 <= n <= 8 000, equal to the number of vertical line segments.

Each of the following n lines consists of exactly 3 nonnegative integers separated by single spaces:

yi’, yi”, xi - y-coordinate of the beginning of a segment, y-coordinate of its end and its x-coordinate, respectively. The coordinates satisfy 0 <= yi’ < yi” <= 8 000, 0 <= xi <= 8 000. The segments are disjoint.

Output

The output should consist of exactly d lines, one line for each data set. Line i should contain exactly one integer equal to the number of triangles in the i-th data set.

Sample Input

1
5
0 4 4
0 3 1
3 4 2
0 2 2
0 2 3

Sample Output

1

==题意:有n条垂直于x轴的线段,给出他们y范围。当两条线段之间有一条垂直于他们并且可以不经过其他线段,则可定义两条线段互相可见,求出有多少三条线段两两互相可见==

==思路:可以把每个线段看成区间,按y轴建树,然后根据线段的x位置从小到大对区间进行染色,在染色之前先对其区间内的颜色进行标记,这些颜色与当前要染的颜色一定互相可见。最后三重for循环求出两两互相可见的三条线段。但要注意有些区间如1-2,3-4,其染色之后2-3这个会被忽略,因为2-3区间没有点,而线段树储存的颜色是在点上。所以要对y扩大两倍,相当于在原先的两点间在插入一点。==

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <functional>
#define inf 0x7fffffff
using namespace std;
typedef long long ll;
const int MAXN=1e9+10;
const int MAX=16100+10;
int n;
bool vis[MAX>>1][MAX>>1];
struct Line{
    int y1,y2,x;
}line[MAX>>1];
struct NODE{
    int l,r,color;
}tree[MAX*4];

int cmp(Line a,Line b){return a.x<b.x;}

void init(int node,int l,int r){
    tree[node].l=l;
    tree[node].r=r;
    tree[node].color=0;
    if(l==r)    return ;
    int mid=(l+r)>>1;
    init(node<<1,l,mid);
    init(node<<1|1,mid+1,r);    
}

void push_down(int node){
    if(tree[node].color!=-1){
        tree[node<<1].color=tree[node<<1|1].color=tree[node].color;
        tree[node].color=-1;        
    }
}

void updata_tree(int node,int x,int y,int num){
    int l=tree[node].l;
    int r=tree[node].r;
    if(x<=l&&r<=y){
        tree[node].color=num;
        return ;
    }
    push_down(node);
    int mid=(l+r)>>1;
    if(x<=mid)  updata_tree(node<<1,x,y,num);
    if(y>mid)   updata_tree(node<<1|1,x,y,num);
}

void query(int node,int x,int y,int flag){
    if(tree[node].color!=-1){
        vis[tree[node].color][flag]=1;
        return ;
    }
    int l=tree[node].l;
    int r=tree[node].r;
    int mid=(l+r)>>1;
    if(l==r)
        return;
    push_down(node);
    if(x<=mid)  query(node<<1,x,y,flag);
    if(y>mid)   query(node<<1|1,x,y,flag);
}

int main(){
    //ios::sync_with_stdio(false);
    #ifdef ONLINE_JUDGE
    #else
    freopen("in.txt","r",stdin);
    #endif
    int T;
    cin>>T;
    while(T--){
        cin>>n;
        for(int i=1;i<=n;i++){  
            scanf("%d%d%d",&line[i].y1,&line[i].y2,&line[i].x);
            line[i].y1<<=1;
            line[i].y2<<=1;         
        }   
        sort(line+1,line+n+1,cmp);
        memset(vis,0,sizeof(vis));
        init(1,0,MAX);
        for(int i=1;i<=n;i++){
            query(1,line[i].y1,line[i].y2,i);
            updata_tree(1,line[i].y1,line[i].y2,i);
        }       
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(vis[i][j]){
                    for(int k=1;k<=n;k++){
                        if(vis[i][k]&&vis[j][k])
                            ans++;
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
大模型部署指南:LM Studio 本文介绍使用LM Studio部署大模型 阅读详情

相关推荐

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6634

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的博客 533

单细胞双胞过滤-scrublet安装

pip install scrublet ----use-pep517有如下报错,分析可知安装annoy时不会自动更新gcc的版本,centos默认是4.8.5。pip install scrublet ----use-pep517 仍然报错,但似乎不影响使用,提示Successfully installed。打开终端,进入Python环境,输入以下代码,查看Python安装位置。暂时还没尝试是否存在问题,如果存在问题,降级scrublet版本。包的开发依赖的是比较低版本的numpy,会用到。

hzau_t的博客 792

线段树(区间树)之区间染色和4n推导过程

  前言   线段树(区间树)是什么呢?有了二叉树、二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色;正如它的名字而言,主要解决区间的问题   一、线段树说明   1、什么是线段树?   线段树首先是二叉树,并且是平衡二叉树(它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树),并且具有二分性质。 如下图,就是一颗线段树:    ...

weixin_30898109的博客 392

14自由度汽车动力学模型

多体系统分解簧上质量刚体:包含车身主体,具有6个自由度(x/y/z平移 + 俯仰/侧倾/横摆旋转)四个簧下质量刚体:每个车轮独立建模,含垂直跳动(z向)和旋转(绕z轴)自由度总自由度:6(车身) + 4×2(车轮) = 14自由度。

chao189844的博客 1198

ORCAD原理图关联封装时出现ERROR(ORCIS-6245)、ERROR(ORCIS-6013)问题

1、当你进行如下操作时: 系统先是提示你出现ERROR(ORCIS-6245)然后再确定后再出现ERROR(ORCIS-6013)问题 是由于你的数据库的路径不对。 具体操作方法如下:1、先找到你的CAPTURE.INI文件。 2、用记事本打开CAPTURE.INI。找到下图路径 3、在你的Orcad capture CIS原理图软件中点击 Options------>CIS con...

weixin_42304393的博客 2万+

poj2777线段树区间染色

网上的代码有很多但是实现的方式不同,我个人还是比较喜欢带结构体的线段树, 然后本题的关键就在于维护颜色的问题上了, 结构体中的2个变量sum表示是第几种颜色,初始化为1 lazy表示之前是否染过色 如果染过色就把染过的色下传,然后在进行染色 然后就是判断这个点所代表区间的颜色,如果左右区间颜色不同,就令他的颜色为-1,相同就等于左右区间的颜色。 #include<iost...

qq_42759120的博客 295

永磁同步电机解耦控制实战:从电流反馈到内模解耦的算法演进与选型指南

本文深入探讨了永磁同步电机高性能驱动中的核心挑战——交叉耦合问题,并对比分析了电流反馈解耦和内模解耦两大主流算法的原理、性能与适用场景。文章指出,电流反馈解耦动态响应快但对参数敏感,内模解耦鲁棒性更强但略有滞后,为工程师在不同应用需求下的算法选型提供了清晰的实战指南。

weixin_29039773的博客 265

线段树进阶-染色问题 附poj-2777题解

区域染色覆盖问题 假设某大学有一面文化墙,各个学院都可以在上面涂色,要求涂色区域高必须和墙一样,宽度任意但必须是整数(以米为单位)。涂色可以覆盖其他学院的涂色。现在若干个学院涂色之后最终这面墙上能看见多少种颜色。 这就是简单的染色问题了。当然有很多种不同的说法,但整体上离不开这两个问题:1.区域覆盖。2.多种染色方式。既然是区域操作,那么用线段树是比较合理了。用...

iwts 5374

ComfyUI面部修复FaceDetailer保姆级教程:从模型选择到参数调优全解析

本文提供ComfyUI面部修复FaceDetailer的保姆级教程,深度解析从模型选择到参数调优的全过程。针对常见的五官模糊、肤色不均等问题,详细对比了BBox与Segm检测器的优劣,并给出SD1.5与SDXL模型的核心参数联动策略与实战方案,帮助用户精准掌控AI绘画中的面部修复效果。

weixin_29073241的博客 472

OpenCV实战(1)——OpenCV与图像处理基础

OpenCV 是一个跨平台计算机视觉和机器学习库,实现了图像处理和计算机视觉方面的很多通用算法。本节将介绍 OpenCV 的基础知识,以及如何编译运行 OpenCV 程序,并介绍如何完成最基本的图像处理任务——读取、显示和保存图像。除此之外,鼠标事件和图形绘制也是 OpenCV 计算机视觉项目中常用的基本功能,本节介绍了如何使用这两个重要的 OpenCV 功能。

盼小辉丶的博客 12万+

POJ 1436 Horizontally Visible Segments(线段树)

题意:给你一堆平行于y轴的线,如果两条线之间能够有一条平行于x轴的线直接相连,就说这两条线是可见的,现在给你n条线,问有多少组线,每组要求三条且两两可见思路:首先离散所有y轴的点,然后按照x轴排序,这样我们不断地更新线段树,每次先看看能看到那些线段,再把当前这条线更新进去,就能知道某条线与哪些其他线两两可见,最后暴力地看有多少组即可(虽然最差的时候我们我们每次查询都要查到最下面,但是因为时间限制比较

Roll_Keyboard的博客 305

【python三维深度学习】python三维点云从基础到深度学习

从三维点云基础知识到深度学习,将按照以下目录持续进行更新。更新完成的部分可以在三维点云专栏中查看。含数据与python源码。

叶子的博客 2万+

POJ 1436 Horizontally VisibleSegments(线段树:区间覆盖染色)

POJ 1436 Horizontally VisibleSegments(线段树:成段更新+区间开闭) 分析: 1.    首先读入所有的线段,然后按x轴坐标从小到大排序,然后我们一次处理每条线段,用一个二维矩阵mark[i][j]保存第i条线段和第j条线段之间的关系.(如果相互可以看到,则mark为true,否则为false).   2.    下面的问题是如果求出任意两线段之间的可见

code 1600

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

POJ 1436 Horizontally VisibleSegments(线段树成段更新+区间覆盖染色)

Description 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 h...

邵光亮的博客 635

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

POJ 1436 Horizontally Visible Segments(线段树区间染色问题)

题意: 在一个平面内,有一些竖直的线段,若两条竖直线段之间可以连一条水平线,这条水平线不与其他竖直线段相交,称这两条竖直线段为“相互可见”的。若存在三条竖直线段,两两“相互可见”,则构成“线段三角形”。给出一些竖直的线段,问一共有多少“线段三角形”。 解析: 可以将x-y坐标系,逆时针旋转90°来看,那么这题就可以转化成线段树的区间覆盖问题。 这题要解决两个问题: 1. 端点处理

小G的ACM之路 701

POJ 1436 Horizontally Visible Segments(线段树区间染色查询)

题意: 给出N(N <= 8000)条垂直线段,如果两条线段在水平方向上连一条线之后不和其他任何垂直线段相交,那么我们称这两条线段水平可见,如果三条垂直线段两两水平可见,则称其为一个三角,问着N条线段能组成多少三角。 思路: 线段树的区间染色查询: 1. 对区间的x坐标从小到大排序 2. 一边更新线段树一边做好统计工作 3. Query的时候注意要执行PushDown操...

weixin_30258027的博客 73

POJ 1436 Horizontally Visible Segments (线段树·区间染色)

题意   在坐标系中有n条平行于y轴的线段  当一条线段与另一条线段之间可以连一条平行与x轴的线不与其它线段相交  就视为它们是可见的  问有多少组三条线段两两相互可见 先把所有线段存下来  并按x坐标排序  线段树记录对应区间从右往左当前可见的线段编号(1...n)  超过一条就为0  然后从左往右对每条线段  先查询左边哪些线段和它是可见的  把可见关系存到数组中  然后把这条线段对应区间的

Deng's site \# 879

POJ 1436 (线段树 区间染色) Horizontally Visible Segments

这道题做了快两天了。首先就是按照这些竖直线段的横坐标进行从左到右排序。 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖。 对于一条线段来说,先查询和它能相连的所有线段,并加入到一个有向图里面,一遍后面O(n3)暴力统计答案。 然后就是update,用这个线段将对应的区间“染色” 还要注意一个情况就是: 0 3 1, 0 1 2, 2 3 2, 0 3 3折四条...

weixin_30404405的博客 88

POJ 1436 Horizontally Visible Segments (线段树·区间染色)

题意 在坐标系中有n条平行于y轴的线段 当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见 先把全部线段存下来 并按x坐标排序 线段树记录相应区间从右往左当前可见的线段编号(1...n) 超过一条就为0 然后从左往右对每条线段 先查询左边哪些线段和它是可见的 把可见关系存到数组中 然后...

weixin_30794851的博客 72

poj 1436 Horizontally Visible Segments(线段树基础,区间染色,拆点)

题意: 。。。 思路: 首先按x排序,, 然后一条一条覆盖上去,当前为i,如果可以同时看到x和y,且x和y互相能看到,答案加1。。 统计的部分暴力就能ac。。 关键点:相邻整数之间的部分被当作看不见了。。不如x相同的两条 (1, 2) (3, 3)…(2, 3)之间其实是可以看过去的,所以要拆点。int xi[Maxn], y1i[Maxn], y2i[Maxn], rk[Maxn];

slowlight93的专栏 511

POJ 1436——Horizontally Visible Segments(线段树,区间染色+暴力+简单hash)

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

fsdcyr 1148

poj 1436

给出 n 条垂线,问有多少个三元组 中,任意两条可以看得到对方 样例中 答案为 1 ,横坐标 为 1 的线段+横坐标 为 2 (3,4)的线段+横坐标为 1 的线段  做过 poj 2777 区间染色的问题 就 很容易看出这个 题目 其实就 是 该问题 的小 延伸,我们可以根据x坐标进行从小到大的排序,然后对每条线段query该线段左端,改线段统领的 区间内 有多少种color,vis[][

qingniaofy的专栏 2217

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

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

给出 n 条垂线,问有多少个三元组 中,任意两条可以看得到对方 样例中 答案为 1 ,横坐标 为 1 的线段+横坐标 为 2 (3,4)的线段+横坐标为 1 的线段 做过 poj 2777 区间染色的问题 就 很容易看出这个 题目 其实就 是 该问题 的小 延伸,我们可以根据x坐标进行从小到大的排序,然后对每条线段query该线段左端,改线段统领的 区间内 有多少种color,vis[][

Julyana_Lin_夜 547

POJ 1436 区间染色

Horizontally Visible Segments Time Limit:5000MS Memory Limit:65536K Total Submissions:4507 Accepted:1662 Description There is a number of disjoint vertical lin...

acy4225的博客 79

POJ 2777 Count Color (线段树 区间覆盖染色问题)

题目链接POJ2777题目大意有一条长度为n(n≤\le10510^5)的数轴,有T(T≤\le30)种颜色,有m个操作(m≤\le10510^5),操作有以下两种:C a b c:把a与中间染成c色P a b:查询a与b中间有几种颜色 数轴的初始颜色为1注意:a有可能大于b分析这是一道典型的区间覆盖问题,可以用线段树来解决。我们用线段树数组col[]记录区间的颜色信息,若某个区间下含有多种颜色,则

歪歪T的拿金之路 1092
上一篇: poj2528(线段树区间染色+离散化)
下一篇: codeforce834A
siyutt
博客等级 码龄15年 3粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值