zoukankan      html  css  js  c++  java
  • Evanyou Blog 彩带

      题目传送门

    BUREK

    格式难调,题面就不放了。


      分析:

      一道比较有思维难度的模拟题。

      首先我们可以想到,对于一个三角形,可以画出一个最小矩形使得这个三角形被完全包围,并且这个矩形的边平行于坐标轴(图就不画了)。如果某条直线经过这个矩形内部,那么它就一定也会把这个三角形分割成两块。而要得到这个矩阵,只需要分别得到三角形三点中的最大与最小横纵坐标就行了,也就分别转化成了横纵向的若干区间。那么问题就转化为:平行于$x$轴的直线被包含于多少纵向区间,平行于$y$轴的直线被包含于多少横向区间内。

      那么这样问题就好办了,有多种解法可以做,这里博主用的是差分+前缀和的模拟方法,具体实现就看代码吧,非常好理解。

      Code:

    //It is made by HolseLee on 23th Oct 2018
    //Luogu.org P4623
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    const int N=2e5+7;
    int n,m,ans[N],tot,cntx,cnty;
    struct Node {
        int x,y,type;
        Node() {}
        Node(const int &_x,const int &_y,const int &_t):
            x(_x), y(_y), type(_t) {}
    }a[N];
    struct Ques {
        int p,id;
    }X[N],Y[N];
    
    inline int read()
    {
        char ch=getchar(); int num=0; bool flag=false;
        while( ch<'0' || ch>'9' ) {
            if( ch=='-' ) flag=true; ch=getchar();
        }
        while( ch>='0' && ch<='9' ) {
            num=num*10+ch-'0'; ch=getchar();
        }
        return flag ? -num : num;
    }
    
    inline bool cmp1(Node &a,Node &b) { return a.x<b.x; }
    inline bool cmp2(Node &a,Node &b) { return a.y<b.y; }
    inline bool cmp3(Ques &a,Ques &b) { return a.p<b.p; }
    
    int main()
    {
        freopen("burek.in","r",stdin);
        freopen("burek.out","w",stdout);
        n=read();
        int mxx,mnx,mxy,mny,x1,x2,x3,y1,y2,y3;
        for(int i=1; i<=n; ++i) {
            x1=read(), y1=read(), x2=read(), y2=read(), x3=read(), y3=read();
            mxx=max(x1,max(x2,x3)); mnx=min(x1,min(x2,x3));
            mxy=max(y1,max(y2,y3)); mny=min(y1,min(y2,y3));
            a[++tot]=Node(mxx,mxy,-1); a[++tot]=Node(mnx+1,mny+1,1);
        }
        m=read(); char op[5],ka[5];
        for(int i=1; i<=m; ++i) {
            scanf("%s%s",op,ka);
            if( op[0]=='x' ) {
                X[++cntx].id=i, X[cntx].p=read();
            } else {
                Y[++cnty].id=i, Y[cnty].p=read();
            }
        }
        int sum=0, now=1;
        sort(a+1,a+tot+1,cmp1);
        sort(X+1,X+cntx+1,cmp3);
        for(int i=1; i<=tot; ++i) {
            while( now<=cntx && X[now].p<a[i].x ) {
                ans[X[now].id]=sum; now++;
            }
            sum+=a[i].type;
        }
        sum=0, now=1;
        sort(a+1,a+tot+1,cmp2);
        sort(Y+1,Y+cnty+1,cmp3);
        for(int i=1; i<=tot; ++i) {
            while( now<=cnty && Y[now].p<a[i].y ) {
                ans[Y[now].id]=sum; now++;
            }
            sum+=a[i].type;
        }
        for(int i=1; i<=m; ++i) printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    吐槽下博客园
    关于爱情
    CCD 驱动 时序理解
    写在博客的第一天
    51单片机最小系统
    swing之登陆功能
    TDSQL | 在整个技术解决方案中HTAP对应的混合交易以及分析系统应该如何实现?
    TDSQL | 深度解读HTAP系统的问题与主义之争
    硬核干货!TDSQL全局一致性读技术详解|
    35w奖金池,腾讯云TDSQL精英挑战赛等你来战!
  • 原文地址:https://www.cnblogs.com/cytus/p/9838780.html
Copyright © 2011-2022 走看看