zoukankan      html  css  js  c++  java
  • 【BZOJ1176】Mokia(CDQ分治)

    题意:维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.

    修改操作数M<=160000,询问数Q<=10000,W<=2000000.

    思路:CDQ分治

    每个操作有t,x,y三维偏序关系

    对x排序,对t CDQ分治,对y建立树状数组

    树状数组可以用一个时间标记避免每次清空

      1 type arr=record
      2           x,y,a,b,t,s:longint;
      3          end;
      4 var p,q:array[0..310000]of arr;
      5     t:array[0..200000,1..4]of longint;
      6     ans,a:array[1..210000]of longint;
      7     sum,tim:array[1..2100000]of longint;
      8     n1,n,m,i,x,y,z,x1,y1,x2,y2,time:longint;
      9 
     10 procedure swap(var x,y:arr);
     11 var t:arr;
     12 begin
     13  t:=x; x:=y; y:=t;
     14 end;
     15 
     16 procedure qsort(l,r:longint);
     17 var i,j,mid:longint;
     18 begin
     19  i:=l; j:=r; mid:=q[(l+r)>>1].x;
     20  repeat
     21   while mid>q[i].x do inc(i);
     22   while mid<q[j].x do dec(j);
     23   if i<=j then
     24   begin
     25    swap(q[i],q[j]);
     26    inc(i); dec(j);
     27   end;
     28  until i>j;
     29  if l<j then qsort(l,j);
     30  if i<r then qsort(i,r);
     31 end;
     32 
     33 procedure qsort1(l,r:longint);
     34 var i,j,mid:longint;
     35 begin
     36  i:=l; j:=r; mid:=q[(l+r)>>1].t;
     37  repeat
     38   while mid>q[i].t do inc(i);
     39   while mid<q[j].t do dec(j);
     40   if i<=j then
     41   begin
     42    swap(q[i],q[j]);
     43    inc(i); dec(j);
     44   end;
     45  until i>j;
     46  if l<j then qsort1(l,j);
     47  if i<r then qsort1(i,r);
     48 end;
     49 
     50 function lowbit(x:longint):longint;
     51 begin
     52  exit(x and (-x));
     53 end;
     54 
     55 procedure update(x,y:longint);
     56 begin
     57  while x<=m do
     58  begin
     59   if tim[x]<>time then sum[x]:=0;
     60   tim[x]:=time;
     61   sum[x]:=sum[x]+y;
     62   x:=x+lowbit(x);
     63  end;
     64 end;
     65 
     66 function query(x:longint):longint;
     67 begin
     68  query:=0;
     69  while x>0 do
     70  begin
     71   if tim[x]=time then query:=query+sum[x];
     72   x:=x-lowbit(x);
     73  end;
     74 end;
     75 
     76 
     77 procedure cdq(l,r:longint);
     78 var mid,i,j,l1,r1:longint;
     79 begin
     80  if l=r then exit;
     81  mid:=(l+r)>>1;
     82  l1:=l; r1:=mid+1;
     83  for i:=l to r do
     84   if q[i].t<=mid then
     85   begin
     86    p[l1]:=q[i]; inc(l1);
     87   end
     88    else
     89    begin
     90     p[r1]:=q[i]; inc(r1);
     91    end;
     92  for i:=l to r do q[i]:=p[i];
     93  cdq(l,mid);
     94  j:=l; inc(time);
     95  for i:=mid+1 to r do
     96  begin
     97   while (j<=mid)and(q[j].x<=q[i].x) do
     98   begin
     99    if q[j].b=0 then update(q[j].y,q[j].a);
    100    inc(j);
    101   end;
    102   if q[i].b=1 then q[i].s:=q[i].s+query(q[i].y);
    103  end;
    104  cdq(mid+1,r);
    105  l1:=l; r1:=mid+1;
    106  for i:=l to r do
    107   if ((q[l1].x<q[r1].x)and(l1<=mid))or(r1>r) then
    108   begin
    109    p[i]:=q[l1]; inc(l1);
    110   end
    111    else
    112    begin
    113     p[i]:=q[r1]; inc(r1);
    114    end;
    115  for i:=l to r do q[i]:=p[i];
    116 
    117 end;
    118 
    119 begin
    120  assign(input,'bzoj1176.in'); reset(input);
    121  assign(output,'bzoj1176.out'); rewrite(output);
    122  read(n1); read(m); inc(m);
    123  while not eof do
    124  begin
    125   read(x);
    126   if x=3 then break;
    127   inc(n1);
    128   case x of
    129    1:
    130    begin
    131     inc(n);
    132     read(q[n].x,q[n].y,q[n].a);
    133     inc(q[n].x); inc(q[n].y);
    134     q[n].b:=0;
    135     q[n].t:=n;
    136    end;
    137    2:
    138    begin
    139     read(x1,y1,x2,y2);
    140     inc(n); q[n].x:=x1; q[n].y:=y1; q[n].b:=1; q[n].t:=n; t[n1,1]:=n;
    141     inc(n); q[n].x:=x1; q[n].y:=y2+1; q[n].b:=1; q[n].t:=n; t[n1,2]:=n;
    142     inc(n); q[n].x:=x2+1; q[n].y:=y1; q[n].b:=1; q[n].t:=n; t[n1,3]:=n;
    143     inc(n); q[n].x:=x2+1; q[n].y:=y2+1; q[n].b:=1; q[n].t:=n; t[n1,4]:=n;
    144    end;
    145   end;
    146  end;
    147  qsort(1,n);
    148  cdq(1,n);
    149  qsort1(1,n);
    150  for i:=1 to n1 do ans[i]:=q[t[i,1]].s+q[t[i,4]].s-q[t[i,2]].s-q[t[i,3]].s;
    151  for i:=1 to n1 do
    152   if t[i,1]>0 then writeln(ans[i]);
    153  close(input);
    154  close(output);
    155 end.
  • 相关阅读:
    jQueryrocket
    jQueryrocket
    jQueryrocket
    jQueryrocket
    jQueryrocket
    SPListItem.UpdateOverwriteVersion()真的不会创建新版本吗?
    不能访问本地服务器场。没有注册带有FeatureDependencyId 的 Cmdlet
    SharePoint 2013 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)
    使用PowerShell修改操作系统“环境变量”
    无法解决“Microsoft.SharePoint.Security, Version=15.0.0.0,”与“Microsoft.SharePoint.Security, Version=14.0.0.0”之间的冲突
  • 原文地址:https://www.cnblogs.com/myx12345/p/6475278.html
Copyright © 2011-2022 走看看