zoukankan      html  css  js  c++  java
  • BOI2007 Mokia | cdq分治求二维点数模板

    题目链接:戳我

    也没什么,其实主要就是为了存一个求二维坐标上矩形内点的个数的模板。为了之后咕咕咕地复习使用

    不过需要注意的一点是,树状数组传x的时候可千万不要传0了!要不然会一直死循环的。。。qwqwq

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #define MAXN 2000010
    using namespace std;
    int n,s,w,cnt;
    int tree[MAXN<<1];
    struct Node{int a,b,c,sum,name;}node[MAXN],tmp[MAXN];
    inline bool cmp1(struct Node x,struct Node y){return x.a<y.a;}
    inline void add(int x,int val)
    {
        for(int i=x;i<=n;i+=i&(-i))
            tree[i]+=val;
    }
    inline int query(int x)
    {
        int cur_ans=0;
        for(int i=x;i;i-=i&(-i))
            cur_ans+=tree[i];
        return cur_ans;
    }
    inline void clear(int x)
    {
        for(int i=x;i<=n;i+=i&(-i))
            tree[i]=0;
    }
    inline void cdq(int l,int r)
    {
        if(l==r) return;
        int mid=(l+r)>>1;
        cdq(l,mid);cdq(mid+1,r);
        int p=l,q=mid+1,k=l;
        while(p<=mid&&q<=r)
        {
            if(node[p].b<=node[q].b)
            {
                if(node[p].name==0) add(node[p].c,node[p].sum);
                tmp[k++]=node[p++];
            }
            else 
            {
                if(node[q].name>=1) node[q].sum+=query(node[q].c);
                tmp[k++]=node[q++];
            }
        }
        while(p<=mid)
        {
            if(node[p].name==0) add(node[p].c,node[p].sum);
            tmp[k++]=node[p++];
        }
        while(q<=r)
        {
            if(node[q].name>=1) node[q].sum+=query(node[q].c);
            tmp[k++]=node[q++];
        }
        for(int i=l;i<=mid;i++) if(node[i].name==0) clear(node[i].c);
        for(int i=l;i<=r;i++) node[i]=tmp[i];
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d%d",&s,&n);
        scanf("%d",&w);
        while(w!=3)
        {
            if(w==1)
            {
                int x,y,k;
                scanf("%d%d%d",&x,&y,&k);
                node[++cnt]=(Node){cnt,x,y,k,0};
            }
            else
            {
                int x1,x2,y1,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                node[++cnt]=(Node){cnt,x2,y2,0,2};
                node[++cnt]=(Node){cnt,x2,y1-1,0,1};
                node[++cnt]=(Node){cnt,x1-1,y2,0,1};
                node[++cnt]=(Node){cnt,x1-1,y1-1,0,1};
            }
            scanf("%d",&w);
        }
        cdq(1,cnt); 
        sort(&node[1],&node[cnt],cmp1);
        for(int i=1;i<=cnt;i++)
        {
            if(node[i].name==2)
                printf("%d
    ",node[i].sum-node[i+1].sum-node[i+2].sum+node[i+3].sum);
        }
        return 0;
    }
    
  • 相关阅读:
    php7安装Memcached扩展
    php7安装
    结束进程
    openssl 编译
    boost 编译
    php 与 c++ openssl 加密通信
    iptables 端口转发
    获取进程及父进程的两种方式
    windows 下获取父进程pid
    CentOS 64位系统 yum安装32位软件包的方法
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10410249.html
Copyright © 2011-2022 走看看