• BZOJ 1018


    program bzoj1018;
    type
      node=array [0..5] of boolean;
      pair=array [0..1] of boolean;
    var
      tot,c,i,j,k,x1,y1,x2,y2:longint;
      ans:boolean;
      ch:char;
      x,y,z:node;
      left,right:array [0..200001] of longint;
      stu:array [0..200001] of node;
      had:array [0..200001]of pair;
    
    procedure swap(var a,b:longint);
    begin
        if a=b then exit;
        a:=a xor b;
        b:=a xor b;
        a:=a xor b;
    end;
    
    procedure build(s,e,now:longint);
    var    mid:longint;
    begin
        if s=e then
            begin
                stu[now][0]:=true;
                stu[now][3]:=true;
                exit;
            end;
        mid:=(s+e) >>1;
        inc(tot);
        left[now]:=tot;
        build(s,mid,tot);
        inc(tot);
        right[now]:=tot;
        build(mid+1,e,tot);
    end;
    
    function update(a,b:node;had:pair):node;
    var i,j,k:longint;
        now:node;
    begin
      fillchar(now,sizeof(now),false);
      if had[0] and a[0] and b[0] then now[0]:=true;
      if had[1] and a[1] and b[2] then now[0]:=true;
      if had[0] and a[0] and b[1] then now[1]:=true;
      if had[1] and a[1] and b[3] then now[1]:=true;
      if had[0] and a[2] and b[0] then now[2]:=true;
      if had[1] and a[3] and b[2] then now[2]:=true;
      if had[0] and a[2] and b[1] then now[3]:=true;
      if had[1] and a[3] and b[3] then now[3]:=true;
      if a[4] then now[4]:=true;
      if a[0] and a[3] and had[0] and had[1] and b[4] then now[4]:=true;
      if b[5] then now[5]:=true;
      if b[0] and b[3] and had[0] and had[1] and a[5] then now[5]:=true;
      exit(now);
    end;
    
    procedure insertl(w:boolean;x,l,r,now:longint);
    var mid:longint;
    begin
      if l=r then
        begin
          if w then
            fillchar(stu[now],sizeof(stu[now]),true)
               else
            begin
              fillchar(stu[now],sizeof(stu[now]),false);
              stu[now][0]:=true;
              stu[now][3]:=true;
            end;
          exit;
        end;
      mid:=(l+r)>>1;
      if x<=mid then insertl(w,x,l,mid,left[now])
                else insertl(w,x,mid+1,r,right[now]);
      stu[now]:=update(stu[left[now]],stu[right[now]],had[now]);
    end;
    
    procedure insertr(w:boolean;x,y,l,r,now:longint);
    var mid:longint;
    begin
      mid:=(l+r)>>1;
      if x=mid then
        begin
          had[now][y]:=w;
          stu[now]:=update(stu[left[now]],stu[right[now]],had[now]);
          exit;
        end;
      if x<=mid then insertr(w,x,y,l,mid,left[now])
                else insertr(w,x,y,mid+1,r,right[now]);
      stu[now]:=update(stu[left[now]],stu[right[now]],had[now]);
    end;
    
    function find(x1,x2,l,r,now:longint):node;
    var temp:node;
        mid:longint;
    begin
      if(x1=l)and(x2=r) then exit(stu[now]);
      mid:=(l+r)>>1;
      if x2<=mid then exit(find(x1,x2,l,mid,left[now]))
                 else
      if x1>mid then exit(find(x1,x2,mid+1,r,right[now]))
                else exit(
                          update(find(x1,mid,l,mid,left[now]),
                                 find(mid+1,x2,mid+1,r,right[now]),
                                 had[now])
                         );
    end;
    
    procedure main;
    begin
      readln(c);
      build(1,c,0);
      repeat
        read(ch);
        case ch of
          'E':break;
          'O':begin
                read(ch,ch,ch,y1,x1,y2,x2);
                dec(y1);
                dec(y2);
                if x1=x2 then insertl(true,x1,1,c,0)
                         else
                if x1<x2 then insertr(true,x1,y1,1,c,0)
                         else insertr(true,x2,y1,1,c,0);
              end;
          'C':begin
                read(ch,ch,ch,ch,y1,x1,y2,x2);
                dec(y1);
                dec(y2);
                if x1=x2 then insertl(false,x1,1,c,0)
                         else
                if x1<x2 then insertr(false,x1,y1,1,c,0)
                         else insertr(false,x2,y1,1,c,0);
              end;
          'A':begin
                read(ch,ch,y1,x1,y2,x2);
                dec(y1);
                dec(y2);
                if x1>x2 then
                  begin
                    swap(x1,x2);
                    swap(y1,y2);
                  end;
                x:=find(1,x1,1,c,0);
                y:=find(x1,x2,1,c,0);
                z:=find(x2,c,1,c,0);
                ans:=false;
                ans:=ans or y[y1*2+y2];
                ans:=ans or(x[5] and y[(1-y1)*2+y2]);
                ans:=ans or(z[4] and y[y1*2+1-y2]);
                ans:=ans or(x[5] and z[4] and y[(1-y1)*2+1-y2]);
                if ans then writeln('Y')
                       else writeln('N');
              end;
        end;
      until false;
    end;
    
    
    begin
      main;
    end.

    BZOJ1018

  • 相关阅读:
    3月1日中国观点股评级:将新浪上调至买入评级
    详讯:新浪第四季度净盈余1亿美元
    陈诉称必应1月全球市场份额首超雅虎
    Facebook收买群组动静办事供应商Beluga
    EMC宣布混杂云战略 年内新开6家中国分公司
    动静称微软最快在3月内推出IE9 RTW版
    Unity3D ShaderLab 混合两张贴图(Blend)
    C# 对排序的认识( Comparison ) ,使用匿名方法实现比较器
    C# 优雅的解决 多线程中访问 UI 的问题
    C# 为SharpDevelop4.1 做了一个深色的配色
  • 原文地址:https://www.cnblogs.com/logichandsome/p/4054644.html
Copyright © 2020-2023  润新知