• 【模板】扫描线


    真正的模板!!
    网上的标臭得一匹!!

    (Code)

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    
    const int N = 1e6 + 5;
    int n , X[N << 1];
    struct line{
    	int h , l , r , v;
    }l[N << 1];
    struct segment_tree{
    	int tag;
    	LL len;
    }seg[N << 2];
    
    inline bool cmp(line x , line y){return x.h < y.h;}
    
    inline void pushup(int k , int l , int r)
    {
    	if (seg[k].tag) seg[k].len = (long long)X[r + 1] - X[l];
    	else seg[k].len = (long long)seg[k << 1].len + seg[k << 1 | 1].len;
    }
    
    inline void update(int l , int r , int k , int x , int y , int v)
    {
    	if (y <= X[l] || X[r + 1] <= x) return;
    	if (x <= X[l] && X[r + 1] <= y)
    	{
    		seg[k].tag += v;
    		pushup(k , l , r);
    		return;
    	}
    	int mid = (l + r) >> 1;
    	if (x <= X[mid + 1]) update(l , mid , k << 1 , x , y , v);
    	if (y > X[mid + 1]) update(mid + 1 , r , k << 1 | 1 , x , y , v);
    	pushup(k , l , r);
    }
    
    int main()
    {
    	scanf("%d" , &n);
    	int x , y , x2 , y2;
    	for(register int i = 1; i <= n; i++)
    	{
    		scanf("%d%d%d%d" , &x , &y , &x2 , &y2);
    		X[i * 2 - 1] = x , X[i * 2] = x2;
    		l[i * 2 - 1] = (line){y , x , x2 , 1};
    		l[i * 2] = (line){y2 , x , x2 , -1};
    	}
    	n <<= 1;
    	sort(l + 1 , l + n + 1 , cmp);
    	sort(X + 1 , X + n + 1);
    	LL ans = 0;
    	for(register int i = 1; i < n; i++)
    	{
    		update(1 , n - 1 , 1 , l[i].l , l[i].r , l[i].v);
    		ans += (long long)seg[1].len * (l[i + 1].h - l[i].h);
    	}
    	printf("%lld" , ans);
    }
    
  • 相关阅读:
    欢迎加入【TIB自动化测试快讯】邮件列表!
    封装几个有用的QTP函数
    自动测试随想
    WatiN自动化测试
    使用vs2010的Coded UI Test实现数据驱动的用户自动登录测试
    QTP的DataTable操作
    TestComplete自动化测试课程大纲
    快速测试自动化
    自动化测试工程师职位(内部推荐)
    QTP库函数集
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/13485657.html
Copyright © 2020-2023  润新知