萌新求助莫队板子题目
查看原帖
萌新求助莫队板子题目
10667
Hyle33ies楼主2020/12/4 12:27
type node=record
l,r,id:int64;
end;
var
  cnt,a,answer1,answer2:array[0..1000000]of int64;
  q:array[0..1000000]of node;
  l,r,ql,qr,n,m,block,ans,g:int64;
  i:longint;
function gcd(a,b:int64):int64;
begin
  if a mod b=0 then exit(b);
  exit(gcd(b,a mod b));
end;
procedure add(x:int64);
begin
  ans:=ans+2*cnt[a[x]];
  inc(cnt[a[x]])
end;
procedure del(x:int64);
begin
  if cnt[a[x]]>0 then
  begin
    ans:=ans-2*cnt[a[x]]+2;
    dec(cnt[a[x]]);
  end;
end;
function cmp(a,b:node):boolean;
begin
  if a.l div block<>b.l div block then
    exit(a.l<b.l);
  if (a.l div block)and 1>0 then
    exit(a.r<b.r);
  exit(a.r<b.r);
end;
procedure sort(l,r:int64);  
var
  i,j:longint;
  p,mid:node;
begin
  i:=l;
  j:=r;
  mid:=q[(l+r)div 2];
  repeat
    while cmp(q[i],mid) do inc(i);
    while cmp(mid,q[j]) do dec(j);
    if i<=j then
    begin
      p:=q[i];q[i]:=q[j];q[j]:=p;
      inc(i);dec(j);
    end;
  until i>j;
  if l<j then sort(l,j);
  if i<r then sort(i,r);
end;
begin
  //assign(input,'1494.in');reset(input);
  //assign(output,'1494.out');rewrite(output);
  readln(n,m);
  for i:=1 to n do
  begin
    read(a[i]);
  end;
  block:=trunc(n/sqrt(m*2/3));
  for i:=1 to m do
  begin
    readln(q[i].l,q[i].r);
    q[i].id:=i;
  end;
  sort(1,m);
  l:=1;
  r:=0;
  for i:=1 to m do
  begin
    ql:=q[i].l;qr:=q[i].r;
    if ql=qr then
    begin
      answer1[q[i].id]:=0;
      answer2[q[i].id]:=1;
      continue;
    end;
    while(l<ql)do begin del(l);inc(l)end;
    while(l>ql)do begin dec(l);add(l)end;
    while(r<qr)do begin inc(r);add(r)end;
    while(r>qr)do begin del(r);dec(r)end;
    answer1[q[i].id]:=ans;
    answer2[q[i].id]:=int64(qr-ql+1)*(qr-ql)
  end;
  for i:=1 to m do
  begin
    if answer1[i]=0 then
    begin
      answer2[i]:=1;g:=1;
    end else
      g:=gcd(answer1[i],answer2[i]);
    writeln(answer1[i]div g,'/',answer2[i]div g);
  end;
  close(input);close(output);
end.

rt,只过了第一个点,后面都是WA

2020/12/4 12:27
加载中...