zoukankan      html  css  js  c++  java
  • CF101B Buses

    题目链接

    题意分析

    计数问题跑DP 这是常识原谅我第一时间没有想出来

    我们用dp[i]表示搭乘第i辆车下车的方案数

    最终的答案 就是把所有终点站ti=n的车下车的方案数累加

    现在考虑怎么转移

    我们先把所有车按照终点站排序

    对于第i辆车 查找哪些车会停在[si,ti-1] 将这些车的方案累加到dp[i]上

    用于终点站是单调的 所以我们可以使用二分确定

    由于有贡献的车必然是一段连续的区间 所以我们通过前缀和优化累加

    CODE:

    #include<bits/stdc++.h>
    #define N 300080
    #define mod 1000000007
    using namespace std;
    int n,m;
    struct Node
    {
    	int s,t;
    	friend bool operator <(const Node &A,const Node &B)
    	{return A.t<B.t;}
    }e[N];
    long long dp[N],sum[N];
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;++i) scanf("%d%d",&e[i].s,&e[i].t);
    	sort(e+1,e+m+1);
    	for(int i=1;i<=m;++i) if(e[i].s==0) dp[i]=1LL;
    	for(int i=1;i<=m;++i)
    	{
    		int le=1,ri=i-1,tmp1=0,tmp2=0;
    		while(le<=ri)
    		{
    			int mid=(le+ri)>>1;
    			if(e[mid].t>=e[i].s) {tmp1=mid;ri=mid-1;}
    			else le=mid+1;
    		}
    		le=1;ri=i-1;
    		while(le<=ri)
    		{
    			int mid=(le+ri)>>1;
    			if(e[mid].t<e[i].t) {tmp2=mid;le=mid+1;}
    			else ri=mid-1;
    		}
    		if(tmp1!=0&&tmp2!=0) dp[i]=(dp[i]+(sum[tmp2]-sum[tmp1-1])%mod+mod)%mod;
    		sum[i]=(sum[i-1]+dp[i])%mod; 
    	}
    	long long tmp=0;
    	for(int i=1;i<=m;++i) if(e[i].t==n) tmp=(tmp+dp[i]+mod)%mod;
    	printf("%lld\n",tmp); 
    	return 0;
    } 
    
  • 相关阅读:
    STL与泛型编程-练习2-GeekBand
    HashSet
    JAVA集合
    分布式锁1 Java常用技术方案
    JAVA 锁
    JAVA多线程二
    JAVA多线程一
    Redis pipeline and list
    mongo 安装
    Intersection of Two Arrays
  • 原文地址:https://www.cnblogs.com/tcswuzb/p/14386907.html
Copyright © 2011-2022 走看看