• 分治(CDQ):[BOI2007]摩基亚Mokia


    【题目描述】

    摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统。和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米。但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题。

    在定位系统中,世界被认为是一个W*W的正方形区域,由1*1的方格组成。每个方格都有一个坐标(x,y),1<=x,y<=W。坐标的编号从1开始。对于一个4*4的正方形,就有1<=x<=4,1<=y<=4(如图):

    请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用户。

    【输入格式】

    有三种命令,意义如下:

    命令 参数 意义
    0 W 初始化一个全零矩阵。本命令仅开始时出现一次。
    1 x y A 向方格(x,y)中添加A个用户。A是正整数。
    2 X1 Y1 X2 Y2 查询X1<=x<=X2,Y1<=y<=Y2所规定的矩形中的用户数量
    3 无参数 结束程序。本命令仅结束时出现一次。

    【输出格式】

    对所有命令2,输出一个一行整数,即当前询问矩形内的用户数量。

    【输入样例】

    0 4

    1 2 3 3

    2 1 1 3 3

    1 2 2 2

    2 2 2 3 4

    3

    【输出样例】

    3

    5

    【提示】

    输入 输出 意义
    0 4
    大小为4*4的全零正方形
    1 2 3 3
    向(2,3)方格加入3名用户
    2 1 1 3 3
    查询矩形1<=x<=3,1<=y<=3内的用户数量

    3 查询结果
    1 2 2 2
    向(2,2)方格加入2名用户
    2 2 2 3 4
    查询矩形2<=x<=3,2<=y<=4内的用户数量

    5 查询结果
    3
    终止程序

    【数据规模】

    1<=W<=2000000

    1<=X1<=X2<=W

    1<=Y1<=Y2<=W

    1<=x,y<=W

    0<A<=10000

    命令1不超过160000个。

    命令2不超过10000个。

      

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn=200010;
     7 const int maxs=2000010;
     8 struct Node{
     9     int id,x,y,d,ans;
    10     Node(int id_=0,int x_=0,int y_=0,int d_=0,int ans_=0){
    11         id=id_;x=x_;y=y_;d=d_;ans=ans_;
    12     }
    13 }p[maxn],t[maxn];
    14 int bit[maxs],s,op,cnt;
    15 int vis[maxs],dep;
    16 void add(int x,int d){
    17     while(x<=s){
    18         if(vis[x]!=dep)
    19             bit[x]=0;
    20         bit[x]+=d;
    21         vis[x]=dep;
    22         x+=x&(-x);
    23     }
    24 }
    25 int Query(int x){
    26     int ret=0;
    27     while(x){
    28         if(vis[x]==dep)
    29         ret+=bit[x];
    30         x-=x&(-x);
    31     }
    32     return ret;
    33 }
    34 
    35 bool cmp1(Node a,Node b){
    36     return a.x<b.x;
    37 }
    38 
    39 bool cmp2(Node a,Node b){
    40     return a.id<b.id;
    41 }
    42 void Solve(int l,int r){
    43     if(l==r)return;
    44     int mid=(l+r)>>1,t1=l,t2=mid+1;
    45     for(int i=l;i<=r;i++){
    46         if(p[i].id<=mid)t[t1++]=p[i];
    47         else t[t2++]=p[i];
    48     }
    49     for(int i=l;i<=r;i++)p[i]=t[i];
    50     Solve(l,mid);++dep;
    51     for(int i=mid+1,j=l;i<=r;i++){
    52         for(;p[i].x>=p[j].x&&j<=mid;j++)
    53             if(p[j].d!=-1)
    54                 add(p[j].y,p[j].d);
    55         if(p[i].d==-1)
    56             p[i].ans+=Query(p[i].y);
    57     }
    58     Solve(mid+1,r);
    59     t1=l;t2=mid+1;
    60     for(int i=l;i<=r;i++)
    61         if(t2==r+1||p[t1].x<p[t2].x&&t1<=mid)t[i]=p[t1++];
    62         else t[i]=p[t2++];
    63     for(int i=l;i<=r;i++)p[i]=t[i];    
    64 }
    65 
    66 int main(){
    67     freopen("mokia.in","r",stdin);
    68     freopen("mokia.out","w",stdout);
    69     int a,b,x,y;
    70     scanf("%d%d",&a,&s);
    71     while(~scanf("%d",&op)&&op!=3){
    72         if(op==1){
    73             scanf("%d%d%d",&x,&y,&a);
    74             p[++cnt]=Node(cnt,x,y,a);
    75         }
    76         else{
    77             scanf("%d%d%d%d",&x,&y,&a,&b);
    78             p[++cnt]=Node(cnt,a,b,-1);
    79             p[++cnt]=Node(cnt,a,y-1,-1);
    80             p[++cnt]=Node(cnt,x-1,b,-1);
    81             p[++cnt]=Node(cnt,x-1,y-1,-1);
    82         }
    83     }
    84     sort(p+1,p+cnt+1,cmp1);
    85     Solve(1,cnt);
    86     sort(p+1,p+cnt+1,cmp2);
    87     for(int i=1,ret;i<=cnt;i++)
    88         if(p[i].d==-1){
    89             ret=0;
    90             ret+=p[i].ans;
    91             ret-=p[++i].ans;
    92             ret-=p[++i].ans;
    93             ret+=p[++i].ans;
    94             printf("%d
    ",ret);
    95         }
    96     return 0;
    97 }
    尽最大的努力,做最好的自己!
  • 相关阅读:
    ASP.NET身份验证机制membership入门——API篇
    测试SQL语句的执行时间
    ASP.NET身份验证机制membership入门——配置篇(2)
    ASP.NET身份验证机制membership入门——配置篇(1)
    ASP.NET身份验证机制membership入门——项目
    ASP.NET用户个性化设置Profile——配置1
    POJ 2762 强连通分量中存在单相连通边 【tarjan+toposort+缩点】.cpp
    POJ 2516 【最小费用最大流】.cpp
    POJ 1904 【强连通分量】.cpp
    POJ 1236 【强连通图+缩点】.cpp
  • 原文地址:https://www.cnblogs.com/TenderRun/p/5309003.html
Copyright © 2020-2023  润新知