CQOI2005 三角形的面积并

烦人的扫描线

#include <iostream>
#include <cstdio>
#include <cstring>
#include <utility>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define eps 1e-8
#define N_MAX 105
#define INF 1e6
int n;
typedef pair<double, double> pdd;
pdd sol[N_MAX];
struct Point{
   double x,y;
   Point(double x = 0, double y = 0):x(x), y(y){}
   bool operator < (const Point& pi){
       return x < pi.x;
   }
   Point operator + (const Point& pi){
       return Point(x + pi.x,y + pi.y);
   }
   Point operator - (const Point& pi){
       return Point(x - pi.x,y - pi.y);
   }
   Point operator * (double t){
       return Point(x * t,y * t);
   }
};
typedef Point Vector;
struct Tr{
   Point p[3];
}tr[N_MAX];
int sign(double x){
   if(fabs(x) < eps)return 0;
   if(x > 0)return 1;
   return -1;
}
int dcmp(double x,double y){
   if(fabs(x - y) < eps)return 0;
   if(x > y) return 1;
   return -1;
}
double cross(Vector a,Vector b){
   return a.x * b.y - b.x * a.y;
}
double dot(Vector a,Vector b){
   return a.x * b.x + a.y * b.y;
}
bool on_segment(Point p,Point a,Point b){
   return sign(dot(p - a,p - b)) <= 0;
}
Point get_line_intersection(Point p,Vector v,Point q,Vector w){
   if(!sign(cross(v,w)))return Point(INF,INF);
   Vector u = p - q;
   double t = cross(w,u) / cross(v,w);
   Point o = p + v * t;
   if(!on_segment(o,p,p + v) || !on_segment(o,q,q + w))return Point(INF,INF);
   return o;
}
double line_area(double a,int side){
   int cnt = 0;
   for(int i = 1; i <= n; i ++){
       if(dcmp(tr[i].p[0].x, a) > 0 || dcmp(tr[i].p[2].x, a) < 0)continue;
       if(!dcmp(tr[i].p[0].x, a) && !dcmp(tr[i].p[1].x, a)){
           if(!side)sol[++cnt] = {tr[i].p[0].y, tr[i].p[1].y};
       }
       if(!dcmp(tr[i].p[1].x, a) && !dcmp(tr[i].p[2].x, a)){
           if(side)sol[++cnt] = {tr[i].p[1].y, tr[i].p[2].y};
       }
       else {
           double d[3];
           int u = 0;
           for(int j = 0; j < 3; j ++){
               Point o = get_line_intersection(tr[i].p[j], tr[i].p[(j + 1) % 3] - tr[i].p[j], Point(a,-INF), Point(0,2 * INF));
               if(dcmp(o.x, INF))d[u ++] = o.y;
           }
           if(u){
               sort(d, d + u);
               sol[++ cnt] = {d[0],d[u - 1]};
           }
       }
   }
   if(!cnt)return 0;
   double res = 0;
   for(int i = 1; i <= cnt; i ++){
       if(sol[i].first > sol[i].second)swap(sol[i].first, sol[i].second);
   }
   sort(sol + 1, sol + cnt + 1);
   double st = sol[1].first,ed = sol[1].second;
   for(int i = 2; i <= cnt; i ++){
       if(sol[i].first <= ed)ed = max(ed, sol[i].second);
       else {
           res += ed - st;
           st = sol[i].first;
           ed = sol[i].second;
       }
   }
   res += ed - st;
   return res;
}
double range_area(double a,double b){
   return (line_area(a,0) + line_area(b,1)) * (b - a) / 2;
}
int main(int argc, char *argv[]){
   scanf("%d", &n);
   vector<double>v;
   for(int i = 1; i <= n; i ++){
       for(int j = 0; j < 3; j ++){
           scanf("%lf %lf", &tr[i].p[j].x, &tr[i].p[j].y);
           v.push_back(tr[i].p[j].x);
       }
       sort(tr[i].p,tr[i].p + 3);
   }
   for(int i = 1; i <= n; i ++){
       for(int j = i + 1; j <= n; j ++){
           for(int x = 0; x < 3; x ++){
               for(int y = 0; y < 3; y ++){
                   Point o = get_line_intersection(tr[i].p[x], tr[i].p[(x + 1) % 3] - tr[i].p[x], 
                                                   tr[j].p[y], tr[j].p[(y + 1) % 3] - tr[j].p[y]);
                   if(dcmp(o.x, INF))v.push_back(o.x);
               }
           }
       }
   }
   sort(v.begin(),v.end());
   double res = 0;
   for(int i = 1; i < v.size(); i ++){
       if(v[i - 1] != v[i])res += range_area(v[i - 1], v[i]);
   }
   printf("%.2lf\n", res);
   return 0;
}
数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值