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 877D - Olya and Energy Drinks 【简单BFS变形】

Olya loves energy drinks. She loves them so much that her roomis full of empty cans from energy drin...
  • my_sunshine26
  • my_sunshine26
  • 2017年10月24日 21:09
  • 909

Codeforces Round #442(Div.2)Problem D Olya and Energy Drinks(BFS)

D. Olya and Energy Drinks time limit per test 2 seconds memory limit per test 256 megabytes in...
  • Shili_Xu
  • Shili_Xu
  • 2017年10月24日 21:56
  • 210

Codeforces 459E Pashmak and Graph(dp+贪心)

题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径。 解题...
  • u011328934
  • u011328934
  • 2014年08月16日 10:57
  • 1599

Almost Acyclic Graph(【CodeForces】915 D)

【题意】n个点m条边,判断是否可以通过删除一条边使整个图不存在环。 【题解】看到题目的第一反应是Tarjan求强连通,求完强连通后,假如存在两个及以上的强连通分量中存在两个点以上,肯定是不行的。因为...
  • sdut16szq
  • sdut16szq
  • 2018年01月19日 10:18
  • 33

01染色 codeforces663C Graph Coloring

传送门:点击打开链接 题意:一个无向图中,每条边可能是0或者1。有一种对节点u的操作,操作时把节点u连接的所有边的权值0变1,1变0.现在要把所有边的权值边成相等的,问最少的操作步数,并打印方案。 ...
  • qwb492859377
  • qwb492859377
  • 2016年04月24日 01:16
  • 471

CodeForces 246D. Colorful Graph【STL】

D. Colorful Graph time limit per test 2 seconds memory limit per test 256 megabytes ...
  • liuke19950717
  • liuke19950717
  • 2016年05月22日 09:25
  • 220

Codeforces Round #460 (Div. 2) D. Substring(图论,记忆化DFS)

描述 You are given a graph with n nodes and m directed edges. One lowercase letter is assigned ...
  • riba2534
  • riba2534
  • 2018年02月01日 10:03
  • 112

codeforces 295B B. Greg and Graph(floyd+dp)

题目链接:codeforces 295B题目大意:给出n个点的完全有权有向图,每次删去一个点,求每次操作前整张图各个点的最短路之和。题目分析: 首先删边对于我们来说是不好做的,所以我们想到了通过加点的...
  • qq_24451605
  • qq_24451605
  • 2015年09月18日 11:53
  • 1483

Codeforces 877D Olya and Energy Drinks【思维优化Bfs】

D. Olya and Energy Drinks time limit per test 2 seconds memory limit per test 256 megaby...
  • mengxiang000000
  • mengxiang000000
  • 2017年10月25日 15:40
  • 430

【Codeforces】 21D Traveling Graph

点击打开链接 一道欧拉回路 ,要求经过每一条边最后并回到起点1,使得走长度的最小。 欧拉回路的必要条件是每个点的度数为偶数,对于奇数的点之间添加上一条边,这里用状压DP枚举。 #include ...
  • u012749539
  • u012749539
  • 2015年03月03日 19:41
  • 512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForces 305D Olya and Graph
举报原因:
原因补充:

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