• P4623 [COCI2012-2013#6] BUREK


    题目描述

    给定N个三角形,和M条直线,直线要么平行于X轴,要么平行于Y轴,问这M条直线 分别经过多少个三角形内部 (注意是内部即分开的两个多边形的面积均大于零)。

    输入输出格式

    输入格式:

    第一行一个正整数 N (2≤N≤100000)表示三角形的个数。 接下来N行,每行三个坐标(x1,y1), (x2,y2), (x3,y3) 表示三点,且这三点不共线。所有 坐标均为非负整数且小于106三角形可以重叠。 接下来一个正整数M (2≤M≤100000),表示M个直线。 接下来M行,每行描述一条直线。"x = c"或"y = c" (注意等号两边的空格) c为非负整数,且小于106.

    输出格式:

    每一条直线输出一个整数,表示它穿过的三角形的个数。

    输入输出样例

    输入样例#1: 
    3
    1 0 0 2 2 2
    1 3 3 5 4 0
    5 4 4 5 4 4
    4
    x = 4
    x = 1
    y = 3
    y = 1
    输出样例#1: 
    0
    1
    1
    2
    输入样例#2: 
    4
    2 7 6 0 0 5
    7 1 7 10 11 11
    5 10 2 9 6 8
    1 9 10 10 4 1
    4
    y = 6
    x = 2
    x = 4
    x = 9
    输出样例#2: 
    3
    2
    3
    2

    说明

    • 对于40%的数据M≤300
    • 另有40%的数据,所有三角形的坐标小于1000

     

    Solution:

      本题也是ZYYS,还以为是高深的计算几何,结果贼简单。

      若一条直线经过三角形内部,则该直线一定经过三角形所在矩形,于是我们可以用给定的三点确定一个矩形。

      因为给定直线一定平行于坐标轴,那么一条直线穿过矩形就两种情况,分别与横纵坐标相关,直接分情况讨论,在处理出矩形后对横纵坐标分别差分就好了,若矩形左下角为$(x_1,y_1)$右上角为$(x_2,y_2)$,因为截距为$leq 10^6$非负整数,所以可行的直线范围为$[x_1+1,x_2-1]$和$[y_1+1,y_2-1]$,那么差分时就让$sx[x_1+1]+1,sx[x_2]-1,sy[y_1+1]+1,sy[y_2]-1$。最后求一下前缀和,对于每次询问输出当前点的前缀和就好了。(很,离散都不用,咕咕^_^)

    代码:

    /*Code by 520 -- 9.3*/
    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define RE register
    #define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
    #define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
    using namespace std;
    const int N=1000005;
    int n,m,ppx,xx[N],yy[N],sx[N],sy[N];
    char s[2];
    
    int gi(){
        int a=0;char x=getchar();
        while(x<'0'||x>'9')x=getchar();
        while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+(x^48),x=getchar();
        return a;
    }
    
    int main(){
        n=gi();
        For(i,1,n) {
            RE int x1=gi(),y1=gi(),x2=gi(),y2=gi(),x3=gi(),y3=gi();
            int lx=min(x1,min(x2,x3));
            int ly=min(y1,min(y2,y3));
            int rx=max(x1,max(x2,x3));
            int ry=max(y1,max(y2,y3));
            xx[lx+1]++,xx[rx]--,yy[ly+1]++,yy[ry]--;
        }
        For(i,1,1000000) sx[i]=sx[i-1]+xx[i],sy[i]=sy[i-1]+yy[i];
        m=gi();
        while(m--){
            scanf("%s",s),ppx=gi();
            printf("%d
    ",s[0]=='x'?sx[ppx]:sy[ppx]);
        }
        return 0;
    }
  • 相关阅读:
    【基本知识】verilog中 `define 的使用
    netsuite弹出窗体的数据回传例子
    js使用confirm对用户的行为进行判断 和prompt
    银行支付 接口
    关于IT公司的预见性
    js fix小数点 和int的区别
    ajax和Java session监听
    NetSuite全功能介绍 totemsuite netsuite开发模块
    财务软件间的财务接口(转载)
    去除eclipise f2功能 去除浮动窗口
  • 原文地址:https://www.cnblogs.com/five20/p/9581485.html
Copyright © 2020-2023  润新知