Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

不知道哪里错了,和网上标程对拍半天都是一样的,交上去还是wa

Posted by wukewen at 2014-01-10 00:44:29 on Problem 2482
type
  arr=record
    whereup,wheredown,x,y,z:int64;
  end;
  arr1=record
    u,v:int64;
  end;
  arr2=record
    ans,lazy:int64;
  end;
var
  a:array[0..40001] of arr;
  orderx:array[0..80001] of arr1;
  tree:array[0..200000] of arr2;
  n,i,j,k,tot,t:longint;
  maxx,maxy,s,d:int64;
function max(a,b:int64):int64;
  begin
  if a>b then exit(a)
     else exit(b);
  end;
procedure swap(var a,b:int64);
  var
    c:int64;
  begin
    c:=a;
    a:=b;
    b:=c;
  end;
procedure sort1(l,r: longint);
var  i,j: longint;
     x:int64;
begin
  i:=l;j:=r;x:=orderx[(l+r) div 2].u;
  repeat
    while orderx[i].u<x do inc(i);
    while x<orderx[j].u do dec(j);
    if not(i>j)
       then begin
              swap(orderx[i].u,orderx[j].u);
              swap(orderx[i].v,orderx[j].v);
              inc(i);dec(j);
            end;
  until i>j;
  if l<j then sort1(l,j);
  if i<r then sort1(i,r);
end;
procedure sort2(l,r: longint);
var  i,j: longint;
     x:int64;
begin
  i:=l;j:=r;x:=a[(l+r) div 2].x;
  repeat
    while a[i].x<x do inc(i);
    while x<a[j].x do dec(j);
    if not(i>j)
       then begin
              swap(a[i].x,a[j].x);
              swap(a[i].y,a[j].y);
              swap(a[i].z,a[j].z);
              swap(a[i].whereup,a[j].whereup);
              swap(a[i].wheredown,a[j].wheredown);
              inc(i);dec(j);
            end;
  until i>j;
  if l<j then sort2(l,j);
  if i<r then sort2(i,r);
end;
procedure add(sub,dep,left,right,l,r:int64);
  var
    mid:int64;
  begin
    if (left=l)and(right=r) then
       begin
       inc(tree[dep].lazy,sub);
       inc(tree[dep].ans,sub);
       exit;
       end;
    mid:=(left+right) div 2;
    if tree[dep].lazy<>0 then
       begin
       inc(tree[dep*2].ans,tree[dep].lazy);
       inc(tree[dep*2].lazy,tree[dep].lazy);
       inc(tree[dep*2+1].ans,tree[dep].lazy);
       inc(tree[dep*2+1].lazy,tree[dep].lazy);
       tree[dep].lazy:=0;
       end;
    if l>=mid+1 then add(sub,dep*2+1,mid+1,right,l,r)
       else if r<=mid then add(sub,dep*2,left,mid,l,r)
            else
            begin
            add(sub,dep*2,left,mid,l,mid);
            add(sub,dep*2+1,mid+1,right,mid+1,r);
            end;
    tree[dep].ans:=max(tree[dep*2].ans,tree[dep*2+1].ans);
  end;
begin
  while not eof do
    begin
    readln(n,maxx,maxy);
    fillchar(tree,sizeof(tree),0);
    for i:=1 to n do
      with a[i] do
        begin
        read(x,y,z);
        whereup:=i*2;
        wheredown:=i*2-1;
        orderx[i*2-1].u:=y;
        orderx[i*2-1].v:=2*i-1;
        orderx[i*2].u:=y+maxy;
        orderx[i*2].v:=2*i;
        end;
    if (maxy=0) then
       begin writeln(0); continue; end;
    sort1(1,2*n);
    d:=orderx[1].u;
    orderx[1].u:=orderx[1].v;
    orderx[1].v:=1;
    for i:=2 to 2*n do
    if orderx[i].u=d then
       begin orderx[i].u:=orderx[i].v; orderx[i].v:=orderx[i-1].v; end
       else
       begin
       d:=orderx[i].u;
       orderx[i].u:=orderx[i].v;
       orderx[i].v:=orderx[i-1].v+2;
       end;
    tot:=orderx[2*n].v;
    sort1(1,2*n);
    sort2(1,n);
    i:=1;
    t:=1;
    s:=0;
    while i<=n do
      begin
      j:=i;
      while (i<=n)and(a[i].x-a[t].x<maxx) do inc(i);

      for k:=j to i-1 do
        add(a[k].z,1,1,tot,orderx[a[k].wheredown].v+1,orderx[a[k].whereup].v);
      s:=max(s,tree[1].ans);
      j:=t;
      while (t<i)and(a[t].x=a[j].x) do inc(t);
      for k:=j to t-1 do
        add(-a[k].z,1,1,tot,orderx[a[k].wheredown].v+1,orderx[a[k].whereup].v);
      end;
    writeln(s);
    end;
end.

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator