zoukankan      html  css  js  c++  java
  • 《3327: To Be an Dream Architect 》

    一开始想线段树来统计所有直线,发现这样很难做到。

    因为最多只有1e6条直线,那么直线存入结构体然后去重即可。

    这里去重要对结构体重写一下== 和 <。然后就行了。

    也可以把每条直线(x,y,z)换成独特的值来排序,这样可能快一点。

    坑点:不在物体里的点就不要去统计了。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef pair<int,int> pii;
    const int N = 1e6 + 5;
    const int M = 4e4+5;
    const LL Mod = 1e9+7;
    #define pi acos(-1)
    #define INF 1e9
    #define CT0 cin.tie(0),cout.tie(0)
    #define IO ios::sync_with_stdio(false)
    #define dbg(ax) cout << "now this num is " << ax << endl;
    namespace FASTIO{
        inline LL read(){
            LL x = 0,f = 1;char c = getchar();
            while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();}
            while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();}
            return x*f;
        }
    }
    using namespace FASTIO;
    
    struct Node{
        int x,y,z;
        bool operator < (const Node& a)const{
            if(x == a.x){
                if(y == a.y) return z < a.z;
                else return y < a.y;
            }
            else return x < a.x;
        }
        bool operator == (const Node& a)const{
            if(x == a.x && y == a.y && z == a.z) return true;
            else return false;
        }
    }p[N];
    int main()
    {
        int ca;ca = read();
        while(ca--)
        {
            int n,m;n = read(),m = read();
            int tot = 0;
            for(int i = 1;i <= m;++i)
            {
                char a,b;
                int x1,x2;
                scanf("%c=%d,%c=%d",&a,&x1,&b,&x2);
                getchar();
                if(x1 < 1 || x1 > n || x2 < 1 || x2 > n) continue;
                if(a == 'X' && b == 'Y') for(int j = 1;j <= n;++j) p[++tot].x = x1,p[tot].y = x2,p[tot].z = j;
                if(a == 'Y' && b == 'X') for(int j = 1;j <= n;++j) p[++tot].x = x2,p[tot].y = x1,p[tot].z = j;
                if(a == 'X' && b == 'Z') for(int j = 1;j <= n;++j) p[++tot].x = x1,p[tot].y = j,p[tot].z = x2;
                if(a == 'Z' && b == 'X') for(int j = 1;j <= n;++j) p[++tot].x = x2,p[tot].y = j,p[tot].z = x1;
                if(a == 'Y' && b == 'Z') for(int j = 1;j <= n;++j) p[++tot].x = j,p[tot].y = x1,p[tot].z = x2;
                if(a == 'Z' && b == 'Y') for(int j = 1;j <= n;++j) p[++tot].x = j,p[tot].y = x2,p[tot].z = x1;
            }
            sort(p + 1,p + tot + 1);
            int len = unique(p + 1,p + tot + 1) - p - 1;
            printf("%d
    ",len);
        }
        system("pause");
        return 0;
    }
    View Code

    还有一种思路就是不存具体的点然后容斥。(考虑麻烦一点)

  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/zwjzwj/p/14115971.html
Copyright © 2011-2022 走看看