zoukankan      html  css  js  c++  java
  • Codeforces 369 E 离线、思维

    E. Valera and Queries

    题意:横坐标轴上,给出 n 段区间(可交叉)。 有 m 个询问,每次询问给出多个点,求这 n 段区间有多少段至少包含了一个点。

    tags:离线+树状数组

    1】数据量太大,所以肯定离线处理。

    2】给出的是区间,而询问给出的是点,我们必须想办法把询问的点转化为区间。所以对于每次给出的 k 个点,我们取出它们分割出的区间。

    3】要求多少个区间包含了点,我们反过来求有多少个区间没有包含任何点。如果给出的区间在分割出来的区间内部,那么这个区间肯定就没有包含这次询问的点。

    4】我们只要把所有的区间按左端点从大到小排序,再右端点从小到大排序。用树状数组维护给出区间的右端点即可。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a; i<=b; ++i)
    #define per(i,b,a) for (int i=b; i>=a; --i)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define MP make_pair
    #define PB push_back
    #define fi  first
    #define se  second
    typedef long long ll;
    const int N = 1000005;
    
    int n, m, bit[N], cnt, ans[N];
    struct Node {
        int l, r, id;
        bool friend operator< (Node a, Node b) {
            if(a.l==b.l && a.r==b.r) return a.id<b.id;
            if(a.l==b.l) return a.r<b.r;
            return a.l > b.l;
        }
    } p[N<<2];
    void Add(int x, int y)
    {
        for(int i=x; i<N; i+=i&-i)
            bit[i] += y;
    }
    int Sum(int x)
    {
        int sum = 0;
        for(int i=x; i; i-=i&-i)
            sum += bit[i];
        return sum;
    }
    int main()
    {
        scanf("%d%d", &n, &m);
        rep(i,1,n)
            ++cnt, scanf("%d%d", &p[cnt].l, &p[cnt].r), p[cnt].id=0;
        int ti, pos, l;
        rep(i,1,m)
        {
            scanf("%d", &ti);
            l = 0;
            rep(j,1,ti)
            {
                scanf("%d", &pos);
                p[++cnt] = (Node){ l+1, pos-1, i };
                l = pos;
            }
            p[++cnt] = (Node){ l+1, N-1, i };
        }
        sort(p+1, p+1+cnt);
        rep(i,1,cnt)
        {
            if(p[i].id==0) Add(p[i].r, 1);
            else ans[p[i].id] += Sum(p[i].r);
        }
        rep(i,1,m) printf("%d
    ", n-ans[i]);
    
        return 0;
    }
  • 相关阅读:
    中国剩余定理
    hdu1808-Halloween treats(抽屉原理)
    快速幂算法
    因子和与因子个数
    乘性函数
    HDU 2669 Romantic (扩展欧几里得定理)
    扩展欧几里得算法
    Bi-shoe and Phi-shoe(欧拉函数)
    欧拉函数
    [51nod]1284 2 3 5 7的倍数(容斥原理)
  • 原文地址:https://www.cnblogs.com/sbfhy/p/8337595.html
Copyright © 2011-2022 走看看