zoukankan      html  css  js  c++  java
  • NOIP 模拟 6 辣鸡

    题解

    难得啊,本来能 (AC) 的一道题,注释没删,挂了五分,难受

    此题暴力很好想,就是直接 (n^2) 枚举不同的矩阵组合,记录块内答案和跨块的答案

    出题人不会告诉你,这题只要输出块内答案就可以拿到 (65pts)

    一个很简单的优化就是按 (x_1) 的值先排个序,然后判断

    if (mat[j].x1-mat[i].x2>1) break;

    但是这种玄学优化仍可以被上下一条链似的块卡掉,但良心出题人竟然没卡。

    正解应该是按两维的坐标均排个序,然后二分查找,求出符合要求的块,复杂度 (mathcal O(nlogn))

    我不会告诉你其实常数小的暴力其实比正解还快了一倍

    Code

    (ACkern 0.4em CODE:)

    #include<bits/stdc++.h>
    #define ri register int
    #define p(i) ++i
    using namespace std;
    namespace IO{
        char buf[1<<21],*p1=buf,*p2=buf;
        #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
        inline int read() {
            ri x=0,f=1;char ch=gc();
            while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
            while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
            return x*f; 
        }
    }
    using IO::read;
    namespace nanfeng{
        #define int long long
        #define cmax(x,y) ((x)>(y)?(x):(y))
        #define cmin(x,y) ((x)>(y)?(y):(x))
        #define FI FILE *IN
        #define FO FILE *OUT
        #undef bool
        static const int N=1e5+7;
        struct Matrix{
            int x1,y1,x2,y2;
            friend inline bool operator<(Matrix m1,Matrix m2) {return m1.x1<m2.x1;}
            Matrix(){}
            Matrix(int x1,int y1,int x2,int y2):x1(x1),y1(y1),x2(x2),y2(y2){}
        }mat[N];
        int n,ans;
        inline int calc(Matrix m) {
            int res=0;
            int x=m.x2-m.x1,y=m.y2-m.y1;
            if (x>y) swap(x,y);
            res+=(x*x<<1);
            res+=(y-x)*(x<<1);
            return res;
        }
        inline int main() {
            // FI=freopen("nanfeng.in","r",stdin);
            // FO=freopen("nanfeng.out","w",stdout);
            n=read();
            for (ri i(1);i<=n;p(i)) {
                int x1=read(),y1=read(),x2=read(),y2=read();
                mat[i]=Matrix(x1,y1,x2,y2);
            }
            if (n==1) {printf("%lld
    ",calc(mat[1]));return 0;}
            sort(mat+1,mat+n+1);
            // for (ri i(1);i<=n;p(i)) 
            for (ri i(1);i<n;p(i)) {
                ans+=calc(mat[i]);
                // printf("%lld %lld %lld %lld
    ",mat[i].x1,mat[i].y1,mat[i].x2,mat[i].y2);
                for (ri j(i+1);j<=n;p(j)) {
                    if (mat[j].x1-mat[i].x2>1) break;
                    if (mat[j].x1-mat[i].x2==1) {
                        if (mat[j].y1-mat[i].y2>1||mat[i].y1-mat[j].y2>1) continue;
                        if (mat[j].y1-mat[i].y2==1||mat[i].y1-mat[j].y2==1) {ans+=1;continue;}
                        ans+=(cmin(mat[i].y2,mat[j].y2)-cmax(mat[i].y1,mat[j].y1))<<1;
                        if (cmax(mat[i].y2,mat[j].y2)>cmin(mat[i].y2,mat[j].y2)) ans+=1;
                        if (cmax(mat[i].y1,mat[j].y1)>cmin(mat[i].y1,mat[j].y1)) ans+=1;
                    } else if (mat[j].y1>mat[i].y2) {
                        if (mat[j].y1-mat[i].y2>1) continue;
                        ans+=(cmin(mat[i].x2,mat[j].x2)-mat[j].x1)<<1;
                        if (mat[i].x1<mat[j].x1) ans+=1;
                        if (cmax(mat[i].x2,mat[j].x2)>cmin(mat[i].x2,mat[j].x2)) ans+=1;
                    } else {
                        if (mat[i].y1-mat[j].y2>1) continue;
                        ans+=(cmin(mat[i].x2,mat[j].x2)-mat[j].x1)<<1;
                        if (mat[i].x1<mat[j].x1) ans+=1;
                        if (cmax(mat[i].x2,mat[j].x2)>cmin(mat[i].x2,mat[j].x2)) ans+=1;
                    }
                    // if (i==2) printf("%lld %lld %lld %lld ans=%lld
    ",mat[j].x1,mat[j].y1,mat[j].x2,mat[j].y2,ans);
                } 
                // printf("ans=%lld
    ",ans);
            }
            // printf("%lld %lld %lld %lld
    ",mat[n].x1,mat[n].y1,mat[n].x2,mat[n].y2);
            printf("%lld
    ",ans+calc(mat[n]));
            return 0;
        }
        #undef int
    }
    int main() {return nanfeng::main();}
    
  • 相关阅读:
    电梯设计需求调研报告
    返回一个整数数组中最大子数组的和。
    返回一个整数数组中最大子数组的和
    四则运算2程序及运行结果
    四则运算2
    上半学期读软件工程方面著作的读书计划
    写输出30道小学生四则运算程序的解题思路及未在规定时间内完成程序的原因
    《人月神话》读后感
    阅读《软件工程—理论方法与实践》第十一章心得体会
    java常见排序方法
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/14876315.html
Copyright © 2011-2022 走看看