zoukankan      html  css  js  c++  java
  • 洛谷 T150024 矩形面积并(扫描线)

    题目传送门

    扫描线板子.
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<algorithm>
    
    using namespace std;
    
    int n,tot;
    long long ans;
    map<int,map<int,long long> > la,le;
    struct kkk {
    	int l,r,v,o;
    }e[1005];
    
    inline void pushup(int l,int r) {
    	int mid = (l + r) >> 1;
    	if(la[l][r] >= 1)
    		le[l][r] = r - l + 1;
    	else
    		if(l != r)
    			le[l][r] = le[l][mid] + le[mid+1][r];
    		else
    			le[l][r] = 0;
    }
    
    inline void ch(int L,int R,int v,int l,int r) {
    	if(L <= l && R >= r) {
    		la[l][r] += v;
    		pushup(l,r);
    		return ;
    	}
    	int mid = (l + r) >> 1;
    	if(L <= mid) ch(L,R,v,l,mid);
    	if(R > mid) ch(L,R,v,mid + 1,r);
    	pushup(l,r);
    }
    
    inline bool cmp(kkk aa,kkk bb) {
    	return aa.v < bb.v;
    }
    
    int main() {
    //	freopen("rec.in","r",stdin);
    //	freopen("rec.out","w",stdout);
    	scanf("%d",&n);
    	for(int i = 1;i <= n; i++) {
    		int x1,y1,x2,y2;
    		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    		e[++tot].l = y1 + 100000001;
    		e[tot].r = y2 + 100000001;
    		e[tot].v = x1 + 100000001;
    		e[tot].o = 1;
    		e[++tot].l = y1 + 100000001;
    		e[tot].r = y2 + 100000001;
    		e[tot].v = x2 + 100000001;
    		e[tot].o = -1;
    	}
    	sort(e+1,e+tot+1,cmp);
    	for(int i = 1;i <= tot; i++) {
    		ans += le[1][200000002] * (e[i].v - e[i-1].v);
    		ch(e[i].l,e[i].r - 1,e[i].o,1,200000002);
    	}
    	printf("%lld",ans);
    	return 0;
    }
  • 相关阅读:
    EF--CodeFirst
    一个很吊的文章---框架
    EF的代码优先设计
    MVC3--View层
    asp.net返回值当文件下载问题
    MVC源码
    编译原理
    TPatch动态补丁系统(iOS)
    浅析分布式系统
    如何在腾讯云快速构建一个Wordpress个人站点
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/13842146.html
Copyright © 2011-2022 走看看