zoukankan      html  css  js  c++  java
  • bzoj2738

    感人肺腑pascal过不去系列,跪求开O2
    先不说这个了,学完cdq分治之后又顺手学了一下整体二分
    感觉这两个东西很多相似的地方,干脆都叫cdq分治好了
    二分解决k小就是设当前二分的答案为m,把x<=m的标为1,统计区间和,如果大于等于k,说明答案小于等于m,否则大于m
    其实仔细想想主席树就是方便干这个事,但这题主席树?总觉得有点虚
    什么叫整体二分,就是二分答案,把答案能<=m归为1类,另外归为一类,划分成子问题继续解决(分治的策略)
    统计和可以用二维树状数组
    还是由于没开O2和pascal跑得慢,实在弄不过去,有算法上优化的话欢迎指教
    代码仅供参考,因为TLE……

      1 type node=record
      2        x,y,v:longint;
      3      end;
      4      point=record
      5        x0,y0,x1,y1,k:longint;
      6      end;
      7 
      8 var q:array[0..60010] of point;
      9     ans,d,c:array[0..60010] of longint;
     10     v:array[0..60010] of boolean;
     11     a:array[0..250010] of node;
     12     w:array[0..250010] of longint;
     13     b:array[0..510,0..510] of longint;
     14     mx,n,m,i,j,k,p:longint;
     15 
     16 function lowbit(x:longint):longint;
     17   begin
     18     exit(x and (-x));
     19   end;
     20 
     21 procedure add(x,y,w:longint);
     22   var p:longint;
     23   begin
     24     p:=x;
     25     while y<=n do
     26     begin
     27       x:=p;
     28       while x<=n do
     29       begin
     30         inc(b[x,y],w);
     31         x:=x+lowbit(x);
     32       end;
     33       y:=y+lowbit(y);
     34     end;
     35   end;
     36 
     37 function ask(x,y:longint):longint;
     38   var p:longint;
     39   begin
     40     ask:=0; p:=x;
     41     while y>0 do
     42     begin
     43       x:=p;
     44       while x>0 do
     45       begin
     46         ask:=ask+b[x,y];
     47         x:=x-lowbit(x);
     48       end;
     49       y:=y-lowbit(y);
     50     end;
     51   end;
     52 
     53 function check(i:longint):boolean;
     54   var s:longint;
     55   begin
     56     s:=ask(q[i].x1,q[i].y1);
     57     if s<q[i].k then exit(false);
     58     s:=s-ask(q[i].x0-1,q[i].y1);
     59     if s<q[i].k then exit(false);
     60     s:=s+ask(q[i].x0-1,q[i].y0-1);
     61     if s<q[i].k then exit(false);
     62     s:=s-ask(q[i].x1,q[i].y0-1);
     63     if s>=q[i].k then exit(true) else exit(false);
     64   end;
     65 
     66 procedure swap(var a,b:node);
     67   var c:node;
     68   begin
     69     c:=a;
     70     a:=b;
     71     b:=c;
     72   end;
     73 
     74 procedure sort(l,r:longint);
     75   var i,j,x:longint;
     76   begin
     77     i:=l;
     78     j:=r;
     79     x:=a[(l+r) shr 1].v;
     80     repeat
     81       while a[i].v<x do inc(i);
     82       while x<a[j].v do dec(j);
     83       if not(i>j) then
     84       begin
     85         swap(a[i],a[j]);
     86         inc(i);
     87         dec(j);
     88       end;
     89     until i>j;
     90     if l<j then sort(l,j);
     91     if i<r then sort(i,r);
     92   end;
     93 
     94 procedure work(f,t,l,r:longint);
     95   var m,p,l1,l2:longint;
     96   begin
     97   //  writeln(f,' ',r,' ',l,' ',r);
     98     if f>t then exit;
     99     if l>r then exit;
    100     m:=(l+r) shr 1;
    101     while (j<k) and (a[j+1].v<=m) do
    102     begin
    103       add(a[j+1].x,a[j+1].y,1);
    104       inc(j);
    105     end;
    106     while (j>0) and (a[j].v>m) do
    107     begin
    108       add(a[j].x,a[j].y,-1);
    109       dec(j);
    110     end;
    111     p:=0;
    112     for i:=f to t do
    113       if check(c[i]) then
    114       begin
    115         inc(p);
    116         ans[c[i]]:=m;
    117         v[i]:=true;
    118       end
    119       else v[i]:=false;
    120 
    121     l1:=f; l2:=f+p;
    122     for i:=f to t do
    123       if v[i] then
    124       begin
    125         d[l1]:=c[i];
    126         inc(l1);
    127       end
    128       else begin
    129         d[l2]:=c[i];
    130         inc(l2);
    131       end;
    132     for i:=f to t do c[i]:=d[i];
    133     work(l1,t,m+1,r);
    134     work(f,l1-1,l,m-1);
    135   end;
    136 
    137 begin
    138   readln(n,m);
    139   for i:=1 to n do
    140     for j:=1 to n do
    141     begin
    142       inc(k);
    143       a[k].x:=i;
    144       a[k].y:=j;
    145       read(a[k].v);
    146     end;
    147   sort(1,k);
    148   p:=1;
    149   w[1]:=a[1].v;
    150   a[1].v:=1;
    151   for i:=2 to k do
    152   begin
    153     if w[p]<>a[i].v then
    154     begin
    155       inc(p);
    156       w[p]:=a[i].v;
    157     end;
    158     a[i].v:=p;
    159   end;
    160   for i:=1 to m do
    161   begin
    162     with q[i] do readln(x0,y0,x1,y1,k);
    163     c[i]:=i;
    164   end;
    165   j:=0;
    166   work(1,m,1,p);
    167   for i:=1 to m do
    168     writeln(w[ans[i]]);
    169 end.
    View Code
  • 相关阅读:
    CF1109D Sasha and Interesting Fact from Graph Theory 组合数
    和与或 数位dp
    G
    E. String Multiplication dp
    Obtain a Permutation 乱搞
    CF1061E Politics 费用流
    mysql连接报错
    编译安装nginx
    SQL四种语言:DDL,DML,DCL,TCL
    Linux 常用管理命令
  • 原文地址:https://www.cnblogs.com/phile/p/4472946.html
Copyright © 2011-2022 走看看