精华内容
下载资源
问答
  • 本章讲述了相交线,角的关系,平行线平行线的条件,平行线的性质以及作等角。其中,有一个很重要的条件:它们是否都在同一平面内。下面分段叙述。一、相交线“相交线”是指在同一平面内,在一点相遇的一组直线(10-...
    2ce19651df9d2efa6e7388bb28cd92bd.png

    我是一名小学生,

    现在已升入五年级了。

    此公众号文章皆为我原创的习作。

    请点击上方清月澹水木关注我哦。

    183be51e50f0437c72fbc7b68e640e83.png

    本章讲述了相交线,角的关系,平行线,平行线的条件,平行线的性质以及作等角。其中,有一个很重要的条件:它们是否都在同一平面内。

    下面分段叙述。

    一、相交线

    相交线是指在同一平面内,在一点相遇的一组直线(10-5)。

    74d74ff68266ed6ef52c549c736bfcd8.png(10-5)相交线中,比较特殊的是垂直线和垂线段,它们是一个道理,不过垂直线都是直线,而垂线段中至少有一条线段(10-6)。747dde867cde23d2a156de1e065a1bce.png(10-6)两线垂直——不管是垂直线还是垂线段,则称一条直线(线段)垂直于另一条直线(线段),它们的交点叫做垂足,它们交成直角(10-7)。a2d6c3f383dc79314e64e070f7a575ff.png(10-7)知道了什么是垂直线和垂线段,就要到生活中去应用。这里应用的是后者。有一个村子,还没有修水管。它的旁边有一条河,要用水管把河水引到村里。为了节省材料和时间,工程师打算找出河与村子间最短的距离。于是,他画出了下图(10-8)。d2cdc47ecc530d6689bd60bc4a04bfe3.png(10-8)最终,他找到了最短的距离,水管很快修好了。而这最短的距离,就是村子到小河所作的垂线段。证明过程如下。
    村子可以近似的看成一个点,A小河可以近似的看成一条直线,BC(10-9)。
    4a4f2290a5dc1cb0df7f01641c7bb7df.png(10-9)AD垂直于BC,连接AB因为ADB=900。勾股定理a2+b2=c2 所以AD2+BD2=AB2因为AD2BD2的和是AB2,所以AB2>AD2,所以AB>AD这里,如果AD不是最短的,且AB是最短的,则AB。而已经证明了AB>AD:大的小于小的,这是不可能的。其次,也可证明ABAD同理,AD小于ABC连线中的任意一条。所以,它最短。从直线外一点到该直线的连线中,垂线段最短。点到直线所作的垂线段是它们间的距离。那么,从ABC所作的垂线段只有AD一条吗?是的。因为,如果从A向别的方向画线段,线段的一端要么落在BC之外,要么落在D的两侧,而它们不可能与BC垂直。从一直线外一点到该直线,能且只能作一条垂直线(垂线段)。不管在不在同一平面内。如果ABC上,则有以下两种情况。第一种:只能作一条垂直线(垂线段)。在同一平面内是这样的。因为,如果要过A作多于一条直线(线段)它们,除了与BC垂直的那条,一定落在所作的垂直线的两侧,而它们不可能再与BC垂直。在同一平面内,过一直线上一点到该直线只能作一条垂直线(垂线段)。第二种:可以作无数条垂直线(垂线段)。不在同一平面内是这样的。因为,交BCA的平面有无数个,每个面上都作一条与BC垂直的直线(线段), 无数个面就能作无数条。不在同一平面内,过直线上一点可作无数条与该直线垂直的直线(线段)。这些垂直线(垂线段)一定围成一个圆。

    二、角的关系

    如图(10-10),ab互相垂直,c与它们的垂足相交,∠1=2,因为它们都等于90°

    ced5711346857f969290429cf62532d6.png (10-10) 有∠1与∠2这样的位置关系的角,叫作对顶角。图中的对顶角还有:∠3、∠4、∠5、∠6、∠7、∠8对顶角相等。因为,以∠5、∠8为例,∠5+6+4=180° 8+4+6=180°;把“∠6+4”看成一个整体;180°=180° 等量加等量,其和还相等;∠5+等量8+“等量 5与∠8是等量,它们相等。两角相加,其和等于一直角,则称此两角互为余角。图中互为余角的角有:∠5、∠6,∠5、∠7,∠6、∠8,∠7、∠8两角相加,其和等于二直角(一平角), 则称此两角互为补角。图中互为补角的角有:∠1、∠4,∠1、∠2,∠1、∠3,∠2、∠4,∠2、∠3,∠3、∠4因为“等量加等量,其和还相等”, 所以等角或同角的余角为等角或同角,等角或同角的补角为等角或同角

    三、平行线

    “平行线”是指在同一平面内永不相交的一组直线(11-1)。

    b22d17c47fb0e4ff9340eeb051f7954d.png (11-1)(11-1)中,ab互相平行。 不管在不在同一平面内,与一直线平行的直线有无数条。因为,一个面上有无数条直线,而一个空间中有无数个面。无数个面上有无数条直线。即使一平面(空间)中一定有一条直线是该直线本身,也是这样,因为无数-1=无数。如果过一点,则有一条。而且,平行于该直线的直线也互相平行。知道了什么是平行线,就要到生活中去应用。比如:如何做一把直尺(直尺对边平行)?那么如何确定二直线是否平行?或者说,二直线平行的条件是什么?

    四、平行线的条件

    二直线平行的条件与此二直线上的角有关。08592dbc756bea68458cec7071f8715f.png(11-2)如图(11-2),1与∠2是同位角,3与∠2是内错角,3与∠4是同旁内角。同位角相等,二直线平行;内错角相等,二直线平行;同旁内角互补(互为补角,以后皆称为互补),二直线平行。首先看“内错角99b462851ab578b13090198ab1ba9fa7.png(11-3)如图(11-3),AEF=EFD。由此可知,AB平行于CD(“平行”的符号是“∥”,以后用符号表示)。因为,如果AB不平行于CD,则它们相交。设它们相交与G 连接BGDG。此时, ∆EGF中,外角AEF等于内对角EFD:这是不可能的。所以,ABCD这里有一个定义:三角的外角大于任何一个内对角。然后看“同位角”。cb8d9ed177701e91b39effcb9b2b39a1.png(11-4)如图(11-4),2=3ab,因为“内错角相等,二直线平行。因为对顶角相等1与∠2是对顶角,它们相等。而3等于2因为“等于同量的量彼此相等,所以1=3它们是二平行线上的同位角。最后看“同旁内角a75e4e8e6c4630515a63ef3da174db4b.png(11-5)如图(11-5), 3=1ab 因为“同位角相等,二直线平行。显而易见,3+2=180°,将“3=1代到这个式子里。 于是,1+2=180°。它们是二平行线上的同旁内角。利用平行线的条件,可以作平行线(11-6)。8ee1e50285cd5732f19caa2bef4a6325.png

    (11-6)

    五、平行线的性质

    如果二直线平行,它们的同位角、内错角和同旁内角分别有什么关系?

    知道“1+12”,就可以知道“2-1=1”。 知道同位角、内错角和同旁内角分别有什么关系时二直线平行,就可以知道二直线平行时同位角、内错角和同旁内角分别有什么关系。

    就是说,平行线性质的定义就是把平行线条件的定义反过来说。

    二直线平行,同位角相等;二直线平行,内错角相等;二直线平行,同旁内角互补。

    在“平行线条件的定义中,“同位角相等”、“内错角相等”、同旁内角互补”是条件;而在“平行线性质的定义”中,“直线平行是条件。

    六、作等角

    如果要在一长方形木板上切下一个平行四边形,使它的其中一组对边在长方形木板的一组对边上,就需要作等角(11-7)。

    800c94c75839e0ff50a62136f657d26b.png(11-7)这里插一段话。根据定义“一圆上的一弧比该弧所对的角等于该圆的圆周比周角 可以推测出以下三条定义:等弧对等角、等弧对等弦、等角对等弦。作等角时,要用到这三条定义。1ee2ee587bedaef7870bebe3d98cbd3b.png(11-8) 如图(11-8), 设要以b为顶点作与1相等的角。以点a为圆心,以线段a为距离画弧。因为“等弧对等弦”,“等角对等弦 连接dc,并以d为圆心,以dc为距离画弧。以b为圆心,以ac为距离画弧;再以e为圆心,以dc为距离画弧。在两弧相交的位置上一点就是平行四边形的顶点。连接bf1=2abfc是要作的平行四边形。拓展如图(11-9), 要将十字形切两刀,使它可以拼成一个正方形。19fbec10b4e8aa4e64accfdd89162687.png(11-9)ab就是所切的两刀。因为1=2直角相等,十字形中的小正方形边长相等,所以 ∆A= ∆B。因为小正方形边长相等,小正方形边长的一半相等,直角相等,所以 ∆C= ∆B。同理, ∆D = ∆C。于是,c=d=f=e。所以,c+d=e+f。而c+d=be+f=a,所以a=b。每切一下可得两条边,所以,切两下就行。以上是本章的主要内容。本章中需要注意的是研究对象是否在同一平面内。就是说,要先选定研究对象的取值范围,再研究。cfb0ebbdf75d3cac2571823d25f5dca9.png

    0d51e2ec6e1ca9665fb5eae459cd147f.png

    f352fa9c6ef20c2d7a693a03bb9ab33f.png

    95f44e7a3a701aa5d6cacd2dc17cfdd5.png

    9416994990b432214da58dad4adba96d.png

    f54122d15812c39c27aca11cfb43910d.png

    end

    da530027a7947b340e424093c937d69b.png

     更多精彩文章 

    《启示》观后感

    ◀《武士道》读后感

    ◀ 疫情下的我们

    ◀ 雪絮儿

    ◀ 我的乐园

    ◀ 短篇小说——白眼狼

    ◀ 我家乡的海

    ◀ 照片里的温暖 | 四年级的习作

    ◀ 兵者,诡道也——《资治通鉴》读后感|四年级的作文·爱雅

    《药》读后感|四年级的作文·爱雅

    ◀ 雨中黄山|四年级的作文·爱雅

    ◀ Red Leaves

    ◀ 清明·踏青|三年级的小学生·爱雅

    ◀ SGS宇宙之战---第一章|小学三年级完成的第一部小说

    《六·上 数学第一章 丰富的图形世界》学后感

    ◀《六·上 数学第二章 有理数及其运算》学后感

    ◀《六·上 数学第三章 整式及其加减》学后感

    ◀ 0乘0有意义吗,0除以0呢?

    ◀《狂人日记》读后感

    ◀《三体》读后感|四年级的小学生·爱雅

    点击在看

    送你小花花

    927c33d4373d67d4d39b51e5ebc02c64.gif

    展开全文
  • 今天讲的内容是:人教版小学四年级数学上册第59页“点到直线的距离”和“平行线之间...教材用29个字解释“平行线之间的距离”:端点分别在两条平行线上,且与平行线垂直的所有线段的长度都相等。这句话好读吗?不好...

    今天讲的内容是:人教版小学四年级数学上册第59页“点到直线的距离”和“平行线之间的距离”。

    c6eb8e0bb814b733cfd114e5f41edab6.png

    “平行线之间的距离”是小学在讲,初中也讲,高中还要讲。当然涉及的深度和广度不可同日而语。

    但今天讲“平行线之间的距离”的感觉是千言万语不能汇成一句话。又像是球已经传到了球门口,可是却不让踢了。

    91412f1069b177ddbcd22ce9b820c939.png

    教材用29个字解释“平行线之间的距离”:端点分别在两条平行线上,且与平行线垂直的所有线段的长度都相等。

    这句话好读吗?不好读。

    这句话好记吗?不好记。

    88f416d6fcc9559f0f1e3f1109cead2d.png

    初中用12个字概括“平行线之间的距离”:平行线之间的距离处处相等。

    这句话好读吗?好读。

    这句话好理解吗?好理解。

    5933fe929e0b3a680139a3d93ad8e99d.png

    为什么在小学四年级的课本里,不让孩子去记这句又好读又好理解的12个字呢?

    刚开始很不理解,教材为什么不直接用这12个字而要用29个字来解释,想了几天后有点儿明白了。

    713ec3cb458d82155428f25f0dc3b464.png

    一、理解、体会

    这是小学阶段制定目标最常用的两个词。让孩子们“通过探索和交流初步体会……,经历……的形成过程,加深对……的理解”。

    所以小学阶段的知识,在逐渐弱化对定义的背诵,更注重孩子们对概念的理解、体验。

    e7c3d70984d75b4ff82a468163e9ebc0.png

    二、不过度引深

    当把“平行线之间的距离处处相等”这句话总结出来后,就像打开了“潘多拉的魔盒”。各种各样由这句话展开的题的类型以及引申的类型就会变化多端。

    这样对于在小学阶段的老师就不好把握住“度”,就容易偏离了小学阶段只是对定义的“理解”这条轨道。

    87f1705a60355dd92fb3c88f7064f621.png

    三、解决生活实际

    在小学阶段学习“平行线间的距离”更多的是为了解决生活中的实际问题。例如墙上挂的画是否挂正?以及为后面学习平行四边形和梯形的高做铺垫等,都是为了实际应用。所以在这儿就重“实际操作”而轻“概念总结”。

    6d7d6e5d0fb391ecf957b1baf19fc9e3.png

    这是我能想到的不用“平行线之间的距离处处相等”这12个字来总结的理由。

    但说实话,在费了些时间引导着学生理解完那29个字之后,我还是把这12个字告诉了学生一遍,而孩子们在之后的练习当中,脱口而出的是这12个字,而不是那29个字。

    c53f9b08477eb6d31a712ba7b73e4ce8.png

    那么在做题或考试当中如果遇到这部分内容需要解释时,能不能让孩子们直接用“平行线间的距离处处相等”这句话来解释呢?

    展开全文
  • 当两条线段之间可以用一条不覆盖到其他线条且平行于X轴的线段连接时,定义两条线段相互见。求有多少 “两两可见的三条线段” 的数量。 思维: 首先把题目给的数据可视化一下(图有点丑) 然后用肉眼观察(废话) 从...

    POJ1436 线段树入门

    传送门
    大概题意:
    有n条垂直于x轴的线段,给定每条线段的 ‘y’ 范围和 'x’位置
    当两条线段之间可以用一条不覆盖到其他线条且平行于X轴的线段连接时,定义两条线段相互见。求有多少 “两两可见的三条线段” 的数量。

    思维:
    首先把题目给的数据可视化一下(图有点丑)
    图1
    然后用肉眼观察(废话)
    从左到右地看,发现只有 黄色 、蓝色 和 红色这一对能组成符合要求的三元组。
    图2
    这样子看好像看不出什么,所以把图倒过来看看吧,顺便想象一下他们会落下来。
    图3

    那么这里让比较靠近y轴的先落下来,我们会发现一些线段会压在其他线段上面,这时我们就把上面的线段用一个箭头指向下面的线段。
    图4
    我们发现当箭头①指向的线段上连着箭头③,而箭头①出发的线段也有箭头②指向了同样的线段,这时这三个线段就满足了“两两相互可见”
    所以我们可以让线段一段一段地落下来,然后落下来的时候,统计一下它压到了哪些线条,这样子就可以在用循环找出有多少对符合条件的三元组了。

    算法:
    对所有线段根据x轴位置从小到大进行排序
    对y轴范围构建线段树
    对所有线段依x轴位置升序进行以下操作:

    • 查询当前线段y范围内压到了哪些线段,并记录下来
    • 更新当前线段y范围内的线段为当前线段

    对所有记录压到谁的数据进行统计,得出答案(不愿详细写,还是康代码吧hhh)

    实现一:

    #include<stdio.h>
    #include<vector>
    #include<algorithm>
    #include<string.h>
    #define mid int m = (l+r)>>1;
    #define lson l,m,loc<<1
    #define rson m+1,r,loc<<1|1
    using namespace std;
    
    const int maxn = 20000;
    //记录输入数据
    struct Node{
        int y1,y2,x;
    }data[maxn];
    //定义比较函数,x轴的
    bool operator<(const Node&a,const Node &b){
        return a.x<b.x;
    }
    //线段树本体
    int t[maxn<<2];
    //记录哪些线段压着哪些线段,有点像图的邻接表
    vector<int> mark[maxn];
    //这个用来防止重复记录和重复计数,看后面就明白了
    int is[maxn];
    //这个是答案
    int ans;
    //初始化函数
    void init(){
        memset(t,-1,sizeof(t));
        ans = 0;
    }
    //下推函数,一般别人会写成PushDown
    inline void Push(int loc){
        if(t[loc]==-1)return;
        t[loc<<1] = t[loc<<1|1] = t[loc];
        t[loc] = -1;
    }
    //段落更新函数,更改段落L到R的线段标记为V
    void update(int L,int R,int V,int l,int r,int loc){
        if(L<=l&&r<=R){
            t[loc] = V;
            return;
        }
        Push(loc);
        mid;
        if(L<=m)update(L,R,V,lson);
        if(m<R)update(L,R,V,rson);
    }
    //查询函数,记录压着哪些线段了
    void query(int L,int R,int V,int l,int r,int loc){
        if(L<=l&&r<=R&&t[loc]!=-1){
        //is[t[loc]]==V代表这条线段被V压着,如果压了两个同样标记的段落,只算一次
            if(is[t[loc]]!=V){
            mark[V].push_back(t[loc]);
            is[t[loc]] = V;
            }
            return;
        }
        if(l==r)return;
        Push(loc);
        mid;
        if(L<=m)query(L,R,V,lson);
        if(R>m)query(L,R,V,rson);
    }
    int main(){
    //pp是测试个数,num是每个测试用例的输入行数,total...看我下面代码就好了,懒得改代码风格了
        int pp,num,total = 0;
        scanf("%d",&pp);
        while(pp--){
            init();
            scanf("%d",&num);
            total = 0;
            while(num--){
                scanf("%d%d%d",&data[total].y1,&data[total].y2,&data[total].x);
                total++;
            }
            //对输入数据根据X轴位置进行排序
            sort(data,data+total);
            //先查询,再覆盖,然后每个线段的标记都不一样,这个根据排序后的下标来就好了,另外区间可能产生冲突,所以乘以2解决这个矛盾,比如说
            //[3,6],[3,4],[5,6]重叠后,应该是有三段的,但实际上只记录了[3,4]和[5,6],(4,5)被吞掉了
            //将其乘以2后就解决了这个问题,自己算算看?手打累
            for(int i = 0;i<total;++i){
                mark[i+1].clear();
                query((data[i].y1+1)<<1,(data[i].y2+1)<<1,i+1,1,maxn,1);
                update((data[i].y1+1)<<1,(data[i].y2+1)<<1,i+1,1,maxn,1);
            }
            //这里重新利用了一下is数组,用来防止重复计数
            memset(is,0,sizeof(is));
            
            /*debug 显示记录的数据*/
          /*  for(int i = 1;i<total+1;++i){
                printf("%d:  ",i);
                for(int j = 0;j<mark[i].size();++j){
                    printf("%d ",mark[i][j]);
                }
                printf("\n");
            }*/
            //对所有线段标记执行循环,从第二条开始循环,毕竟第一条只能压空气
            for(int i = 2;i<total+1;++i){
            //记录一下当前线段压到了哪些线段
                int len = mark[i].size();
                for(int j = 0;j<len;++j){
                    is[mark[i][j]] = i;
                }
                //对每一个被当前线段压到的线段执行循环
                for(int j = 0;j<len;++j){
                    int to = mark[i][j];
                    int len = mark[to].size();
                    for(int k = 0;k<len;++k){
                    //如果这个线段有被当前线段压到的线段压到且当前线段也压到了这个线段
                    //就说明出现了符合题意三元组
                    //另外后边这个is语句好像没必要加上去hhh
                        if(is[mark[to][k]]&&is[mark[to][k]]!=to){
                            //记录一下算过这条线段了,防止重复计数,其实好像没必要的说,但是加上去好像更保险一些,说不定一不小心记录了两条相同的线段呢?
                            is[mark[to][k]] = to;
                            ++ans;
                        }
                    }
                }
                //神奇的操作,我要取消记录当前线段压到了哪些线段
                for(int j = 0;j<len;++j){
                    is[mark[i][j]] = false;
                }
            }
            //输出答案
            printf("%d\n",ans);
        }
        return 0;
    }
    

    实现二(自以为优化了,但其实好像没什么卵用,只说说优化的部分):

    /*
    ==题意:有n条垂直于x轴的线段,给出他们y范围。
    当两条线段之间有一条垂直于他们并且可以不经过其他线段,
    则可定义两条线段互相可见,
    求出有多少三条线段两两互相可见==
    */
    #include<stdio.h>
    #include<vector>
    #include<algorithm>
    #include<string.h>
    #define mid int m = (l+r)>>1;
    #define lson l,m,loc<<1
    #define rson m+1,r,loc<<1|1
    using namespace std;
    const int maxn = 20000;
    struct Node{
        int y1,y2,x;
    }data[maxn];
    bool operator<(const Node&a,const Node &b){
        return a.x<b.x;
    }
    int t[maxn<<2];
    vector<int> mark[maxn];
    int is[maxn];
    int ans;
    void init(){
        memset(t,-1,sizeof(t));
        ans = 0;
    }
    //t[loc]增加了一个状态0,代表当前区块内有更“细”的区间是被标记的
    //比如说:[1,10]->[1,5],[1,10]的状态是0,[1,5]的状态是3
    //而t[loc]==-1则代表当前段落完全没有被标记的线段
    inline void Push(int loc){
        if(t[loc]!=-1&&t[loc]!=0){
        t[loc<<1] = t[loc<<1|1] = t[loc];
        }
        //有Push下面必有更细的区间
        t[loc] = 0;
    }
    void update(int L,int R,int V,int l,int r,int loc){
        if(L<=l&&r<=R){
            t[loc] = V;
            return;
        }
        Push(loc);
        mid;
        if(L<=m)update(L,R,V,lson);
        if(m<R)update(L,R,V,rson);
    }
    void query(int L,int R,int V,int l,int r,int loc){
        if(L<=l&&r<=R&&t[loc]!=-1&&t[loc]!=0){
            if(is[t[loc]]!=V){
            mark[V].push_back(t[loc]);
            is[t[loc]] = V;
            }
            return;
        }
        //这样子遇到-1状态就可以直接返回了
        if(l==r||t[loc]==-1)return;
        Push(loc);
        mid;
        if(L<=m)query(L,R,V,lson);
        if(R>m)query(L,R,V,rson);
    }
    int main(){
        int pp,num,total = 0;
        scanf("%d",&pp);
        while(pp--){
            init();
            scanf("%d",&num);
            total = 0;
            while(num--){
                scanf("%d%d%d",&data[total].y1,&data[total].y2,&data[total].x);
                total++;
            }
            sort(data,data+total);
            for(int i = 0;i<total;++i){
                mark[i+1].clear();
                query((data[i].y1+1)<<1,(data[i].y2+1)<<1,i+1,1,maxn,1);
                update((data[i].y1+1)<<1,(data[i].y2+1)<<1,i+1,1,maxn,1);
            }
            memset(is,0,sizeof(is));
            /*debug*/
    /*
            for(int i = 1;i<total+1;++i){
                printf("%d:  ",i);
                for(int j = 0;j<mark[i].size();++j){
                    printf("%d ",mark[i][j]);
                }
                printf("\n");
            }
    */
    //另外去除了is的判断
            for(int i = 2;i<total+1;++i){
                int len = mark[i].size();
                for(int j = 0;j<len;++j){
                    is[mark[i][j]] = i;
                }
                for(int j = 0;j<len;++j){
                    int to = mark[i][j];
                    int len = mark[to].size();
                    for(int k = 0;k<len;++k){
                        if(is[mark[to][k]]){
                            ++ans;
                        }
                    }
                }
                for(int j = 0;j<len;++j){
                    is[mark[i][j]] = false;
                }
            }
            printf("%d\n",ans);
        }
        return 0;
    }
    
    

    最后,感谢阅读

    展开全文
  • 所谓可见线段就是在给定的垂直与x轴的直线中,能够在两个直线之间连接一条平行线,并且这条平行线不与任何其他的直线相交。 WA一次,就是因为没有考虑到在建立点树的过程中会出现将 [1, 2] 和 [3, 4] 视为一条连接...

    题中定义了什么叫做可见线段。所谓可见线段就是在给定的垂直与x轴的直线中,能够在两个直线之间连接一条平行线,并且这条平行线不与任何其他的直线相交。

    WA一次,就是因为没有考虑到在建立点树的过程中会出现将 [1, 2] 和 [3, 4] 视为一条连接的直线,所以最后给坐标乘以一个2.

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #include <vector>
    #include <map>
    #define MAXN 8000
    using namespace std;

    struct Seq
    {
    int y1, y2, x;
    bool operator < (Seq t) const
    {
    return x < t.x;
    }
    }e[MAXN+5];

    struct
    {
    int l, r, who;
    }seg[MAXN*8];

    map<int,int>m[MAXN+5];

    void build(int f, int l, int r)
    {
    int mid = l+r >> 1;
    seg[f].l = l, seg[f].r = r;
    seg[f].who = 0;
    if (r > l)
    {
    build(f<<1, l, mid);
    build(f<<1|1, mid+1, r);
    }
    }

    void up(int f)
    {
    if (seg[f<<1].who == seg[f<<1|1].who)
    seg[f].who = seg[f<<1].who;
    else
    seg[f].who = -1;
    }

    void modify(int f, int l, int r, int who, map<int, int>*m)
    {
    int mid = seg[f].l+seg[f].r >> 1;
    if (seg[f].l == l && seg[f].r == r && (seg[f].who != -1 || r==l))
    {
    if (seg[f].who != -1 && seg[f].who != 0)
    m[who][seg[f].who] = 1;
    seg[f].who = who;

    }
    else if (seg[f].r > seg[f].l)
    {
    if (seg[f].who == 0)
    {
    seg[f<<1].who = seg[f<<1|1].who = seg[f].who;
    seg[f].who = -1;
    }
    else if (seg[f].who != -1)
    {
    m[who][seg[f].who] = 1;
    seg[f<<1].who = seg[f<<1|1].who = seg[f].who;
    seg[f].who = -1;
    }
    if (r <= mid)
    modify(f<<1, l, r, who, m);
    else if (l > mid)
    modify(f<<1|1, l, r, who, m);
    else
    {
    modify(f<<1, l, mid, who, m);
    modify(f<<1|1, mid+1, r, who, m);
    }
    up(f);
    }
    }

    int main()
    {
    map<int,int>::iterator it1, it2;
    int T, M, y1, y2, x, ans;
    scanf("%d", &T);
    build(1, 0, 2*MAXN);
    while (T--)
    {
    ans = 0;
    seg[1].who = 0;
    scanf("%d", &M);
    for (int i = 1; i <= M; ++i)
    {
    scanf("%d %d %d", &e[i].y1, &e[i].y2, &e[i].x);
    e[i].y1 <<= 1, e[i].y2 <<= 1;
    m[i].clear();
    }
    sort(e+1, e+1+M);
    for (int i = 1; i <= M; ++i)
    {
    // printf("%d %d %d\n", e[i].y1, e[i].y2, e[i].x);
    modify(1, e[i].y1, e[i].y2, i, m);
    /* for (it = m[i].begin(); it != m[i].end(); ++it)
    printf(".. %d ", it->first);
    */
    }
    for(int i = 1; i <= M; ++i) // 扫描整个表
    {
    for(it1 = m[i].begin(); it1 != m[i].end(); ++it1) // 遍历第i条线的可见线段
    {
    int k = it1->first; // 记录与其中的第k条线段可见
    for(it2 = m[i].begin(); it2 != m[i].end(); ++it2) // 如果第k条线段与第i条线段有共同的可见线段的话 ans++
    {
    if (m[k].count(it2->first))
    ans++;
    }
    }
    }
    printf("%d\n",ans);
    }
    return 0;
    }





    转载于:https://www.cnblogs.com/Lyush/archive/2012/03/08/2385436.html

    展开全文
  • nnn 条垂直于 xxx 轴的线段,对于两条线段,如果有一条平行于 xxx 轴的线穿过它们,并且不经过其他线段,则称这两条线段可见 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 求有多少...
  • 1、点、线、角点的定理:过两点有且只有一条直线点的定理:两点之间线段最短角的定理:同角或等角的补角相等角的定理:同角或等角的余角相等直线定理:过一点有且只有一条直线和已知直线垂直直线定理:直线外一点与...
  • 1.在两条平行线之间画四条垂线段,这四条垂线段的长度关系是( )2.两条直线互相垂直,可以得到( )个直角。3.从直线外一点到这条直线所画线段中,( )最短,垂直线段的长度叫做( )。二、判断题。(对的打"√",错的打"×...
  • 计算经纬度之间的距离

    千次阅读 2017-06-18 02:02:31
    假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈 就叫作“赤道”。在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段, 叫做纬线。...
  • 地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作“赤道”。在赤道的南北两边,画出许多和...
  • 地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作“赤道”。在赤道的南北两边,画出许多和...
  • 假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈 就叫作“赤道”。在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段, 叫做纬线。...
  • 地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作“赤道”。在赤道的南北两边,画出许多和...
  • c# GPS 2个经纬度 点 算之间的距离

    千次阅读 2013-05-03 10:04:17
    假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈 就叫作“赤道”。在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段, 叫做纬线。...
  • 我穿过空间想要遇见你,就像梯度下降只垂直于每条等高线用平行线之间垂线段最小的原理想要找到你 虽然我知道两点之间线段最短,但是我在去寻找你的路上沟壑纵横而且荆棘密布,我无法一步到位遇见你,我在垂直于每条...
  • 根据两点经纬度坐标计算距离

    万次阅读 多人点赞 2015-05-09 11:23:29
    地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作“赤道”。在赤道的南北两边,画出许多和...
  • 线1、同角或等角的余角相等2、过一点有且只有一条直线和已知直线垂直3、过两点有且只有一条直线4、两点之间线段最短5、同角或等角的补角相等6、直线外一点与直线上各点连接的所有线段中,垂线段最短7、平行公理:...
  • 线1、同角或等角的余角相等2、过一点有且只有一条直线和已知直线垂直3、过两点有且只有一条直线4、两点之间线段最短5、同角或等角的补角相等6、直线外一点与直线上各点连接的所有线段中,垂线段最短7、平行公理:...
  • 线1、同角或等角的余角相等2、过一点有且只有一条直线和已知直线垂直3、过两点有且只有一条直线4、两点之间线段最短5、同角或等角的补角相等6、直线外一点与直线上各点连接的所有线段中,垂线段最短7、平行公理:...
  • HDU 4978 计算 凸包

    2017-09-24 23:44:00
    有以无限间隔$D$的水平线分割的平面,在上面随机投下一个圆,圆中有一些点,点之间两两成一条线段,问随机投下至少有一条线段平行线相交的概率。 以下是不严(luan)谨(lai)的思路。 首先都知道对于任意长度$L$的...
  • 题意:给你n条平行或者垂直坐标轴的线段,让你求面积并。 思路:参考了小岛的线段树博客和这个博客。把每一条线段当做一个长或宽为1的矩形。保存矩形的上下两条线,下面的一条线s为1,上面的线s为-1。同时对x1,x2...
  • poj 1436 Horizontally&…

    2014-12-29 08:37:11
    题目大意: 1.给出n条垂直x轴的线段。 2.定义两条线段水平可见当...3.定义三条线段构成一个三角形当且仅当这三条线短两两之间水平可见。 求这n条线段可以构成多少个三角形。 //====================================
  • 线1、同角或等角的余角相等2、过一点有且只有一条直线和已知直线垂直3、过两点有且只有一条直线4、两点之间线段最短5、同角或等角的补角相等6、直线外一点与直线上各点连接的所有线段中,垂线段最短7、平行公理:...
  • 中学大课堂初中各科学习必备(海量学习资源)关注来源:来中考数学 初中几何公式定理:线 1、同角或等角的余角相等2、过一点有且只有一条直线和已知直线垂直3、过两点有且只有一条直线4、两点之间线段最短5、同角或...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

平行线之间垂直线段