HDU 5481 Desiderium 动态规划

Desiderium

Time Limit: 1 Sec

Memory Limit: 256 MB

题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=5481

Description

There is a set of intervals, the size of this set is n.

If we select a subset of this set with equal probability, how many the expected length of intervals‘ union of this subset is?

We assume that the length of empty set‘s union is 0, and we want the answer multiply 2n modulo 109+7.

Input

The first line of the input is a integer T, meaning that there are T test cases.

Every test cases begin with a integer n ,which is size of set.

Then n lines follow, each contain two integers l,r describing a interval of [l,r].

1≤n≤100,000.

−1,000,000,000≤l≤r≤1,000,000,000.

Output

For every test case output the answer multiply 2n modulo 109+7.

Sample Input

2
1
0 1
2
0 2
1 3

Sample Output

1
7

HINT

题意

有一条数轴,还有一个区间的集合,集合大小为n。
现在等概率的从集合中选出集合的一个子集,求取出的子集的区间并集的期望长度。
空集的区间并长度被认为是0。

题解:

实际上计算的是所有子集的并集长度之和。

把坐标离散化之后,可以单独考虑每一小段区间在并集内部的出现次数,如果有mm个大区间覆盖这段小区间,就会发现当前仅当这mm个区间都不在子集中时,这一小段区间不会成为并集中的一部分,所以一共有2^n-2^m2
??个子集包含这段小区间。把长度乘出现次数累计到答案里即可

代码:

//qscqesze
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <bitset>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 300006
#define mod 1000000007
#define eps 1e-9
#define e exp(1.0)
#define PI acos(-1)
const double EP  = 1E-10 ;
int Num;
//const int inf=0x7fffffff;
const ll inf=999999999;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
//*************************************************************************************

int p[maxn];
struct node{
    int x,y;
};
node dp2[maxn];
bool cmp(node a,node b)
{
    if(a.x!=b.x) return a.x<b.x;
    return a.y<b.y;
}
int dp[maxn];
void pre()
{
    p[0]=1;
    for(int i=1;i<maxn;i++)
    {
        long long tmp=2LL*p[i-1];
        if(tmp>=mod) tmp-=mod;
        p[i]=(int)tmp;
    }
}
int main()
{
    pre();
    int t=read();
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            long long tmp=(long long)(p[i]-1);
            if(tmp<0) tmp+=mod;
            tmp*=(long long)(p[n-i]);
            if(tmp>=mod) tmp%=mod;
            dp[i]=(int)tmp;
        }
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&dp2[i<<1].x,&dp2[i<<1|1].x);
            dp2[i<<1].y=1;dp2[i<<1|1].y=-1;
        }
        sort(dp2,dp2+2*n,cmp);
        int ans1=0;
        ll ans2=0;
        for(int i=0;i<2*n-1;i++)
        {
            int l=dp2[i].x,r=dp2[i+1].x;
            ans1+=dp2[i].y;
            ans2+=(ll)(r-l)*(ll)dp[ans1];
            if(ans2>=mod) ans2%=mod;
        }
        printf("%I64d\n",ans2);
    }
    return 0;
}
时间: 2025-01-17 07:43:50

HDU 5481 Desiderium 动态规划的相关文章

hdu 2583 permutation 动态规划

Problem Description Permutation plays a very important role in Combinatorics. For example ,1 2 3 4  5 and 1 3 5 4 2 are both 5-permutations. As everyone's known, the number of n-permutations is n!. According to their magnitude relatives ,if we insert

hdu 3853 LOOPS 动态规划

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 迷宫类的动态规划 首先要作个数学推导 假设留在原地.右移.下移的概率分别是a, b, c 用dp[i][j]表示在第i行第j格能走出去的期望步数 则有: dp[i][j] = a * (dp[i][j] + 1) + b * (dp[i][j+1] + 1) + c * (dp[i+1][j] + 1) 整理一下可得: dp[i][j] = 1/(1-a) * (a +  b * (dp[i]

[HDU 1114] Piggy-Bank (动态规划)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 简单完全背包,不多说. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <cmath> 5 #include <map> 6 #include <iterator> 7 #include <vector> 8 using

[HDU 3535] AreYouBusy (动态规划 混合背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个,属性为1的为至多完成1个,属性为2的为任意完成. 每个任务做完后都有个价值,问在T个时间单位内完成n个任务集合的任务获得的最大价值是多少?如果不能满足要求输出-1 首先先分析什么情况下输出-1: 因为属性为0的代表至少要完成1个,当遇到一个属性为0的任务集合里一个都无法完成的时候,输出-1. 其他

百度之星资格赛 hdu 4826 Labyrinth 动态规划

/********************* Problem Description 是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能走一格,且仅仅能向上向下向右走曾经没有走过的格子,每个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币能够为负,须要给强盗写欠条),度度熊刚開始时身上金币数为0.问度度熊走出迷宫时候身上最多有多少金币? Input 输入的第一行是一个整数T

H - Tickets HDU 1260 (动态规划)

H - Tickets Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1260 Description Jesus, what a great movie! Thousands of people are rushing to the cinema. However, this is really a tuff time for Joe who sel

[HDU 2955]Robberies (动态规划)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意是给你一个概率P,和N个银行 现在要去偷钱,在每个银行可以偷到m块钱,但是有p的概率被抓 问你被抓的概率在P以下,最多能偷多少钱. 刚开始我还在想,A银行被抓的概率是a,B银行被抓的概率是b,那么偷A和B被抓的概率是a*b.. 傻逼了- -..a*b是既被A银行抓又被B银行抓.. 所以用逃跑的概率计算 dp[i][j]代表从前i个银行里偷了j元逃跑的最大概率 代码: 1 #include

G - 免费馅饼 HDU 1176 (动态规划---数塔的变形 )

G - 免费馅饼 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1176 Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接.但由

hdu 3779 Railroad (动态规划)

Railroad Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 554    Accepted Submission(s): 223 Problem Description A train yard is a complex series of railroad tracks for storing, sorting, or load