codeforces 863E

来源:互联网 发布:冰川网络最新消息 编辑:程序博客网 时间:2024/06/14 22:59

原题链接

我的思路:

这是一条不难的题目,我直接先按左边优先排序,如果左边相同,就按右边排序。

按这样的排序方案排序后,我们来一条条地加边。首先第1条肯定是需要的。对于第2条,假设l1.rl2.r,又由于l1.ll2.l,那么此时第2条就是可以删除的边,因为第2条边干的活第1条边都干了,此时找到答案,结束;如果l1.r<l2.r,那么l2此时对于整体是有贡献的,贡献是[max(l1.r+1, l2.l), l2.r]部分,因此此时需要修改l2.l。此时看第3条边,假设l2.rl3.r,注意,此时虽然已经修改了l2.l,但是覆盖的部分并不会减少,只是多做出贡献的部分减少了,此时l3就是一条没有用的边,找到了答案,退出;否则,此时修改l3.l。然后一直继续下去。

#include <iostream>#include <algorithm>using namespace std;const int maxn = 2e5 +10;typedef struct Node{    int l, r;    int pos;    bool operator < (const Node & R) const    {        if(l != R.l) return l < R.l;        return r < R.r;    }}Node;Node s[maxn];int main() {    int t;    cin >> t;    for(int i = 0; i < t; i++) {        int l, r;        cin >> s[i].l >> s[i].r;        s[i].pos = i + 1;    }    sort(s, s + t);    int ans = -1;    for(int i = 1; i < t; i++) {        if(s[i - 1].r >= s[i].r) {            ans = s[i].pos;            break;        } else if(s[i - 1].l >= s[i].l) {            ans = s[i - 1].pos;            break;        }        s[i].l = max(s[i].l, s[i - 1].r + 1);    }    cout << ans << endl;    return 0;}
原创粉丝点击