CodeForces 305D Olya and Graph

原创 2015年11月21日 20:32:44

题目大意

给定一条单向链,上面有一些和链方向一致的边,每条边(包括加的)长度都是1,求有多少种方式加边可以使每一对(i,j)满足i<j有:dis(i,j)=jidis(i,j)=jik

解答

由题目易知,所有边的长度必须是k+1的并且所有边的起点必须在一个k+1的连续区间中,所以,所有不满足上述条件的直接输出0,当k+1>=n时,直接输出1(没有可以连的边)。
如果并没有在链上的边,我们就可以在每一个长度为k+1的区间中随意连线
如果有边,就相当于确定了区间的范围
我们只需要找到第一个可以连边的区间,这个区间的方案数应为2k+1个,然后我们向后移1个,我们发现,最后一个不连边的方案,显然是包含在上一个区间中的,所以最后一个必须是连边的,故这个区间新增的方案数为2k个,由此即可得到答案

参考代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

const int MOD = 1000000007;

int n, m, k;
vector<int> ser;
int tw[1000005];
int l, r;

int main()
{
    tw[0] = 1;
    for (int i = 1; i < 1000005; i++)
        tw[i] = (tw[i-1] + tw[i-1]) % MOD;
    ios::sync_with_stdio(false);
    cin >> n >> m >> k;
    while (m--) {
        cin >> l >> r;
        if (r-l != 1 && r-l != k+1) {
            cout << "0";
            return 0;
        }
        if (r-l == k+1) {
            ser.push_back(r);
        }
    }
    k++;
    if (ser.size() >= 2) {
        if (ser[ser.size()-1] - ser[0] >= k) {
            cout << "0";
            return 0;
        }
    }
    if (k >= n) {
        cout << "1";
        return 0;
    }
    int m = ser.size();
    if (m == 0) {
        int ans = tw[min(n-k, k)];
        for (int i = k+k+1; i <= n; i++) {
            ans += tw[k-1];
            ans %= MOD;
        }
        cout << ans;
        return 0;
    }
    int ans = tw[min(n-k, k) - m];
    for (int i = max(ser[m-1], 2*k) + 1; i <= n && i-ser[0] < k; i++) {
        ans += tw[k-1-m];
        ans %= MOD;
    }
    cout << ans;
    return 0;
}

相关文章推荐

【CodeForces 293B】Distinct Paths 搜索与剪枝

Distinct Paths Time Limit: 2000MS Memory Limit: 262144KB Description You have ...

codeforces 474E 最长跳跃路线 简化版

题目描述 BSNY来到一个木桩阵,这个木桩阵是由n个木桩组成的,排成直线,每个木桩有个高度hi,BSNY可以从某个木桩开始,一直向后跳,但跳跃的位置是由限制的,如果BSNY现在在第i个木桩,想跳到第j...

Codeforces Round #305 (Div. 2) 548D - Mike and Feet

题意:给你一个n,有n个数A[i] 要求输出ans[i] ans[i]就是最大的区间长度为i的区间内的最小值 思路: 这个思路以前做01矩阵的时候遇到过 l[i]就是以i为最小值往左延伸到...

Codeforces Round #179 (Div. 2)---D. Greg and Graph(离线+floyd)

Greg has a weighed directed graph, consisting of n vertices. In this graph any pair of distinct vert...

Codeforces 366D Dima and Trap Graph【二分+Dfs】

D. Dima and Trap Graph time limit per test 3 seconds memory limit per test 256 megabytes ...

CodeForces 387D George and Interesting Graph

题意: 一幅有趣的图的定义为有向无自环图  它有个根  根与每个点有去边和回边  除根外每个点入度出度都是2 为了将一幅图变有趣  每次操作可以删边或加边  求  最少几次操作能使所给图变有趣 思...

Codeforces 366D Dima and Trap Graph (DFS剪枝水过...)

题目大意: 就是现在给你一个有n个点m条边的图(1 然后每条边上都有一个区间限制[L, R], 现在从点1出发选择一个能够到达n的路径, 对于这条路径初始的时候选择一个x如果x对于这个路径上的每...

Codeforces 296D Greg and Graph【Floyd+逆序思维】好题

D. Greg and Graph time limit per test 3 seconds memory limit per test 256 megabytes input...

Codeforces 366D Dima and Trap Graph(搜索剪枝/二分)

题目地址:点击打开链接 题意:给你一个图,每条边有一个[L, R],只有在这个区间内的点才能通过,问满足能从1 到n的最大连续区间的长度为多少 思路: 二分思路:枚举下界,二分上界,dfs是否...
  • CillyB
  • CillyB
  • 2017年03月07日 20:47
  • 292

CodeForces 366D Dima and Trap Graph

D. Dima and Trap Graph time limit per test 3 seconds memory limit per test 256 megabytes input...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForces 305D Olya and Graph
举报原因:
原因补充:

(最多只允许输入30个字)