1. 链接

    Desiderium

  2. 题意

      给定n条线段,从中选取若干条,共有2n种选法(因为每一条线段有两种方法:选或者不选).

      每一种选法都对应一个长度,也就是所选线段的并集长度.

      求这2n种选法长度之和.

  3. 解法:

    把这n条线段进行离散化,使得任意一条线段都可以由若干条元线段组成.

    什么叫元线段呢?把全部的x坐标进行排序,去重,就得到了很多元线段.

    统计每条元线段出现的次数,也就是说它被这n条线段里面的多少个线段覆盖.

    如合统计呢?假设元线段被m条线段覆盖,那么有n-m条线段不覆盖它.

    所以,该元线段被2n种选法中的2n-2n-m种选法覆盖.

    ans=累加(元线段的长度*元线段使用的次数).

  4. 写法:

    主要是如何统计元线段出现的次数.

    • 建立线段树,把没一条线段进行插入O(nlgn)
    • 树状数组O(nlgn)
    • 普通数组O(n),这种方法最好,不仅简单,而且快.
  5. 代码(树状数组版):

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    #define re(i,n) for(int i=0;i<n;i++)
    typedef long long ll;
    const int maxn = 1e5 + 7;
    const int mod = 1e9 + 7;
    int n;
    struct Re{
    	int l, r;
    }a[maxn];
    int x[maxn << 1], xi;
    int tr[maxn << 1];
    #define lson(x) x<<1,f,mid
    #define rson(x) x<<1|1,mid+1,r
    int lowbit(int x){
    	return x&-x;
    }
    void ins(int x, int v){
    	for (int i = x; i > 0; i -= lowbit(i)){
    		tr[i] += v;
    	}
    }
    int query(int x){
    	int ans = 0;
    	for (int i = x; i < xi; i += lowbit(i)){
    		ans += tr[i];
    	}
    	return ans;
    }
    int data[maxn];
    int f(int m){
    	return data[n] - data[n - m];
    }
    void init(){
    	data[0] = 1;
    	re(i, maxn - 2){
    		data[i + 1] = ((ll)data[i] << 1) % mod;
    	}
    }
    int cnt[maxn << 1];
    int main(){
    	//freopen("in.txt", "r", stdin);
    	init();
    	int T; cin >> T;
    	while (T--){
    		scanf("%d", &n);
    		xi = -1;
    		re(i, n){
    			scanf("%d%d", &a[i].l, &a[i].r);
    			x[++xi] = a[i].l, x[++xi] = a[i].r;
    		}
    		++xi;
    		sort(x, x + xi);
    		xi = unique(x, x + xi) - x;
    		memset(tr, 0, sizeof(tr));
    		re(i, n){
    			int beg = lower_bound(x, x + xi, a[i].l) - x;
    			int over = lower_bound(x, x + xi, a[i].r) - x;
    			ins(beg, -1), ins(over, 1);
    		}
    		cnt[0] = 0;
    		for (int i = 1; i < xi; i++)cnt[i] = query(i);
    		//re(i, xi)printf("(%d,%d) ", i, cnt[i]);
    		//puts("");
    		ll ans = 0;
    		re(i, xi - 1){
    			ll len = (ll)x[i + 1] - x[i];
    			int ge = cnt[i + 1];
    			//cout << len << " " << ge << endl;
    			ans = (len*f(ge) + ans) % mod;
    		}
    		if (ans < 0)ans += mod;
    		printf("%lld\n", ans);
    	}
    	return 0;
    }
    
  6. 代码(普通数组版):

     #include<iostream>
     #include<algorithm>
     #include<stdio.h>
     using namespace std;
     typedef long long ll;
     #define re(i,n) for(int i=0;i<n;i++)
     ;
     ;
     struct Node{
         int l, r;
     }a[maxn];
     int n;
     ], xi;
     ];
     int data[maxn];
     void init(){
         data[] = ;
         ; i < maxn-; i++){
             data[i] = (data[i - ] << ) % mod;
         }
     }
     int main(){
         //freopen("in.txt", "r", stdin);
         int T; cin >> T;
         init();
         while (T--){
             scanf("%d", &n);
             xi = -;
             re(i, n)scanf("%d%d", &a[i].l, &a[i].r), x[++xi] = a[i].l, x[++xi] = a[i].r;
             sort(x, x + xi + );
             xi = unique(x, x + xi + ) - x;
             re(i, xi)cnt[i] = ;
             re(i, n){
                 int f = lower_bound(x, x + xi, a[i].l) - x,
                     t = lower_bound(x, x + xi, a[i].r) - x;
                 cnt[t]++, cnt[f]--;
             }
             ; i >= ; i--){
                 cnt[i] += cnt[i + ];
             }
             ll ans = ;
             re(i, xi-){
                 ] - x[i];
                 ];
                 ans = (ans + (ll)len*(data[n] - data[n - m])) % mod;
             }
             )ans += mod;
             printf("%lld\n", ans);
         }
         ;
     }

hdu5481 Desiderium的更多相关文章

  1. HDU 5481 Desiderium 动态规划

    Desiderium Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=548 ...

随机推荐

  1. x01.os.6: 8086 指令

    M:存储器A:累加器R:寄存器SEGR:段寄存器IMM:立即数X:标志位状态依运算或操作结果而定U:相应标志位未定义-:不影响 数据传送指令 时钟数 访问次数 字节数 对标志位影响 指令意义 MOV ...

  2. X264库直接压缩BITMAP格式数据

    最近帮朋友看了下X264压缩视频,主要参考了雷霄骅(leixiaohua1020)的专栏的开源代码: http://blog.csdn.net/leixiaohua1020/article/detai ...

  3. Arch Linux sudo: PAM authentication error: Module is unknown [Solved!]

    问题描述: 我的 Arch Linux 已经用了快半年多,由于 Arch Linux 的滚挂问题,我从没有直接升级过系统.软件版本以及库自然落后了一些. 就在我准备需要用到 NFS 时,挂载网络文件系 ...

  4. 【简易版】IOS仿periscope自制狂赞飘桃心

    periscope自制狂赞飘桃心 国外的IOS app“periscope”非常的火,观看手机视频直播的时候,点击屏幕任何一个地方,屏幕右下角就能飘出各种颜色的桃心,效果非常的炫! 为此我自制了一个仿 ...

  5. AI (Adobe Illustrator)详细用法(五)

    最后的调整和输出. 一.改变形状工具/宽度工具/包裹工具 1.改变形状工具[整形工具] 改变形状工具可以让我们更细致的控制形状的改变. 用钢笔工具画一条曲线,并设置宽度样式等. 如果想让这条曲线形状变 ...

  6. ASP.NET执行模型之IIS服务器处理流程

    之前在网上看过很多对这方面的讲解,但个人觉得看下来过于 "深奥",不容易理解,所以想用更简单的方式进行阐述,便于理解. 本次我们重点分析用户请求到页面呈现过程中Web服务器的处理过 ...

  7. 《2016ThoughtWorks技术雷达峰会----雷达新趋势》

    雷达新趋势    徐昊,ThoughtWorks中国区CTO 1.Open Source  open source 已经从一个简简单单的软件代码组织方式变成一种文化,一种运动.当谈到Open Sour ...

  8. 网络之OSI七层模型

    1.  物理层:设备之间的比特流的传输,物理接口,电气特性等 2.  数据链路层:成帧,用MAC地址访问媒介,错误检测与修正 3.  网络层:提供逻辑地址(IP),选路 4.  传输层:可靠与不可靠的 ...

  9. 第8章 用户模式下的线程同步(2)_临界区(CRITICAL_SECTION)

    8.4 关键段(临界区)——内部也是使用Interlocked函数来实现的! 8.4.1 关键段的细节 (1)CRITICAL_SECTION的使用方法 ①CRITICAL_SECTION cs;   ...

  10. jsp前三章小测试:错题

    /bin:存放各种平台下用于启动和停止Tomcat的脚本文件 /logs:存放Tomcat的日志文件 /webapps:web应用的发布目录 /work:Tomcat把由JSP生成的Servlet存放 ...