zoukankan      html  css  js  c++  java
  • hiho第152周,离散化记笔记记笔记

    感觉自己用node+map的存数据方案有点烦,
    不过还没想到什么骚操作简化,用二进制的话也是换汤不换药,
    一开始node里面全是bool导致A集合里重叠左端点的区间只算了一次,
    60分无限WA,改成int,我真傻,真的

    #include <map>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    const LL N = 1e7 + 7;
    
    struct node{
        int al, ar, bl, br;
        node(){}
        node(int x, int y, int z, int w):al(x),ar(y),bl(z),br(w){}
        node add(node b){return node(al+b.al, ar+b.ar, bl+b.bl, br+b.br);}
    }nodes[N];
    
    LL n, m, a[N];
    map <LL,LL> mp;
    
    int main()
    {
        //freopen("in.txt", "r", stdin);
        scanf("%lld%lld", &n, &m);
        LL l, r, top = 0;
        memset(nodes, 0, sizeof(nodes));
    
        for (LL i = 1; i <= n; i++){
            scanf("%lld%lld", &l, &r);
            if (!mp[l]) mp[l] = ++top;
            nodes[mp[l]] = nodes[mp[l]].add(node(1,0,0,0));
            if (!mp[r]) mp[r] = ++top;
            nodes[mp[r]] = nodes[mp[r]].add(node(0,1,0,0));
            a[i*2 - 1] = l;
            a[i*2] = r;
        }
        for (LL i = 1; i <= m; i++){
            scanf("%lld%lld", &l, &r);
            if (!mp[l]) mp[l] = ++top;
            nodes[mp[l]] = nodes[mp[l]].add(node(0,0,1,0));
            if (!mp[r]) mp[r] = ++top;
            nodes[mp[r]] = nodes[mp[r]].add(node(0,0,0,1));
            a[n*2 + i*2 - 1] = l;
            a[n*2 + i*2] = r;
        }
    
        sort(a + 1, a + 2*n+2*m+1 );
        // top == cnt
        LL cnt = unique(a+1, a+n*2+m*2+1) - (a+1);
        LL cntA = 0, cntB = 0, ans = 0;
    
        for (LL i = 1; i < cnt; i++){
            node t = nodes[mp[a[i]]];
            cntA += t.al - t.ar;
            cntB += t.bl - t.br;
            //printf("%lld %lld
    ", cntA, cntB);
            if (cntA > 0 && cntB == 0){
                ans += a[i+1] - a[i];
            }
        }
        printf("%lld
    ", ans);
        return 0;
    }

    几秒后的更新:
    丢到map,不去重直接排序
    不仅丢掉了wa点,还扔掉了很多冗余过程

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    const LL N = 1e7 + 7;
    struct node{
        int index, al, ar, bl, br;
        node(){}
        node(int in, int x, int y, int z, int w):index(in),al(x),ar(y),bl(z),br(w){}
        bool operator <(const node& b)const{return index < b.index;}
    }nodes[N];
    LL n, m;
    
    int main()
    {
        //freopen("in.txt", "r", stdin);
        scanf("%lld%lld", &n, &m);
        LL l, r, top = 0;
        memset(nodes, 0, sizeof(nodes));
    
        for (LL i = 1; i <= n; i++){
            scanf("%lld%lld", &l, &r);
            nodes[++top] = node(l,1,0,0,0);
            nodes[++top] = node(r,0,1,0,0);
        }
        for (LL i = 1; i <= m; i++){
            scanf("%lld%lld", &l, &r);
            nodes[++top] = node(l,0,0,1,0);
            nodes[++top] = node(r,0,0,0,1);
        }
    
        sort(nodes + 1, nodes + top +1 );
        LL cntA = 0, cntB = 0, ans = 0;
    
        for (LL i = 1; i < top; i++){
            node t = nodes[i];
            cntA += t.al - t.ar;
            cntB += t.bl - t.br;
            //printf("%lld %lld
    ", cntA, cntB);
            if (cntA > 0 && cntB == 0){
                ans += nodes[i+1].index - t.index;
            }
        }
        printf("%lld
    ", ans);
        return 0;
    }
  • 相关阅读:
    Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
    Codeforces Round #406 (Div. 2) D. Legacy 线段树建模+最短路
    HDU 4897 Little Devil I 树链剖分+线段树
    HDU 5405 Sometimes Naive 树链剖分+bit*****
    HDU 5274 Dylans loves tree 树链剖分+线段树
    BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并
    HDU 5544 Ba Gua Zhen dfs+高斯消元
    HDU 3949 XOR 线性基
    BZOJ 2460: [BeiJing2011]元素 线性基
    Educational Codeforces Round 18 C. Divide by Three DP
  • 原文地址:https://www.cnblogs.com/cww97/p/12349361.html
Copyright © 2011-2022 走看看