zoj Monthly, February 2012 - D Under Attack II (zoj 3574)

来源:互联网 发布:ubuntu intel显卡驱动 编辑:程序博客网 时间:2024/05/18 22:52

先离散化建一个二部图,两边都有n个点,然后从左边依次往上扫描,插入线段,每次统计新插入的线段后和原来的线段有多少个交点,这样就知道新插入的线段会增加多少个区域,可以用树状数组来解决这个问题

#include<iostream>#include<vector>#include<cstring>#include<string>#include<cstdio>#include<iomanip>#include<queue>#include<map>#include<algorithm>using namespace std;const int maxn = 30011*5;const int maxc = 30011;vector<int>va;vector<int>vb;vector<int>ca;vector<int>cb;map<int,int>ma;map<int,int>mb;int a,b;int x,y,za,zb,n,tot,all;int k,t;int from[maxc];int to[maxc];int g[maxc];int zx[maxn];int zz[maxn];inline int lowbit(int x){    return x&(-x);}int sum(int now){    int ans = 0;    while(now > 0)    {        ans += zx[now];        now -= lowbit(now);    }    return ans;}void insert(int now){    while(now <= tot)    {        zx[now]++;        now += lowbit(now);    }    return ;}int main(){    while(cin>>a>>b)    {        va.clear();        vb.clear();        ca.clear();        cb.clear();        ma.clear();        mb.clear();        memset(g,0,sizeof(g));        cin>>n;        for(int i=1;i<=n;i++)        {            cin>>k>>t;            za = k*a + t;            zb = k*b + t;            from[i] = za;            to[i] = zb;            ca.push_back(za);            cb.push_back(zb);        }        sort(ca.begin(),ca.end());        sort(cb.begin(),cb.end());        int temp = ca[0];        int t2 = cb[0];        va.push_back(temp);        ma[temp] = 0;        vb.push_back(t2);        mb[t2] = 0;        for(int i=1;i<ca.size();i++)        {            if(temp != ca[i])            {                temp = ca[i];                va.push_back(temp);                ma[temp] = va.size() - 1;            }        }        for(int i=1;i<cb.size();i++)        {            if(t2 != cb[i] )            {                t2 = cb[i];                vb.push_back(t2);                mb[t2] = vb.size() - 1;            }        }        int f,t;        for(int i=1;i<=n;i++)        {            f = ma[from[i]];            t = mb[to[i]];            g[f] = t;        }        tot = va.size();        memset(zx,0,sizeof(zx));        memset(zz,0,sizeof(zz));        all=1;        for(int i=0;i<tot;i++)        {            t = tot - g[i];            temp = sum(t-1) + 1;            insert(t);            all += temp;        }        cout<<all<<endl;    }    return 0;}


原创粉丝点击