zoukankan      html  css  js  c++  java
  • bzoj2506

    不知道该给这题贴什么标签了,但是这是一道好题
    1.注意这道题的询问是满足区间减法的,我们可以把一个询问拆成两个询问离线搞搞,这个思想在后面会见到
    2.分类的思想,这道题的求相同余数看似很烦,实际上我们发现每个数只有10^4,不难发现
    当p>=100时,我们可以完全不虚的穷举k,k+p*1,k+p*2……,计算每个数出现的次数
    当p<100时,我们完全可以直接记录f[p,k]代表到现在出现的次数
    因此这题做法就很明显了

     1 type node=record
     2        x,w,p,k:longint;
     3      end;
     4 
     5 var q:array[0..200010] of node;
     6     a,f2:array[0..100010] of longint;
     7     f1:array[0..100,0..100] of longint;
     8     ans:array[0..100010,0..1] of longint;
     9     mx,j,l,r,p,k,n,m,i,t:longint;
    10 
    11 procedure swap(var a,b:node);
    12   var c:node;
    13   begin
    14     c:=a;
    15     a:=b;
    16     b:=c;
    17   end;
    18 
    19 procedure sort(l,r:longint);
    20   var i,j,x:longint;
    21   begin
    22     i:=l;
    23     j:=r;
    24     x:=q[(l+r) shr 1].x;
    25     repeat
    26       while q[i].x<x do inc(i);
    27       while x<q[j].x do dec(j);
    28       if not(i>j) then
    29       begin
    30         swap(q[i],q[j]);
    31         inc(i);
    32         dec(j);
    33       end;
    34     until i>j;
    35     if l<j then sort(l,j);
    36     if i<r then sort(i,r);
    37   end;
    38 
    39 begin
    40   readln(n,m);
    41   for i:=1 to n do
    42   begin
    43     read(a[i]);
    44     if mx<a[i] then mx:=a[i];
    45   end;
    46   for i:=1 to m do
    47   begin
    48     readln(l,r,p,k);
    49     inc(t); q[t].p:=p; q[t].k:=k; q[t].x:=r; q[t].w:=i*2;
    50     inc(t); q[t].p:=p; q[t].k:=k; q[t].x:=l-1; q[t].w:=i*2-1;
    51   end;
    52   sort(1,2*m);
    53   t:=1;
    54   while q[t].x=0 do inc(t);
    55   for i:=1 to n do
    56   begin
    57     inc(f2[a[i]]);
    58     for j:=1 to 100 do
    59       inc(f1[j,a[i] mod j]);
    60 
    61     while q[t].x=i do
    62     begin
    63       if q[t].p>100 then
    64       begin
    65         for j:=0 to mx div q[t].p do
    66           inc(ans[q[t].w shr 1+q[t].w mod 2,q[t].w mod 2],f2[q[t].p*j+q[t].k]);
    67       end
    68       else ans[q[t].w shr 1+q[t].w mod 2,q[t].w mod 2]:=f1[q[t].p,q[t].k];
    69       inc(t);
    70     end;
    71   end;
    72   for i:=1 to m do
    73     writeln(ans[i,0]-ans[i,1]);
    74 end.
    View Code
  • 相关阅读:
    PHP全栈学习笔记3
    PHP全栈学习笔记3
    JavaScript基础系列
    JavaScript基础系列
    Java语言
    Java语言
    HTML基础系列
    HTML基础系列
    PHP全栈从入门到精通1
    PHP全栈从入门到精通1
  • 原文地址:https://www.cnblogs.com/phile/p/4472959.html
Copyright © 2011-2022 走看看