• 常用模板


    1线性筛

     1 var
     2 n,i,j,m,tot:longint;
     3 ans:int64;
     4 p:array[0..10000005]of longint;
     5 f:array[0..10000005]of boolean;
     6 begin
     7  readln(n);
     8   f[1]:=true;f[0]:=true;
     9   for i:=2 to n do
    10    begin
    11     if not f[i] then begin inc(tot); p[tot]:=i;end;
    12      j:=1;
    13      while (p[j]*i<=n)and(j<=tot) do
    14       begin
    15        f[p[j]*i]:=true;
    16        if i mod p[j]=0 then break;
    17        inc(j);
    18       end;
    19    end;
    20    for i:=2 to n do
    21     if not f[i] then inc(ans);
    22     writeln(ans);
    23 end.
    View Code

    2扩展欧几里得

     1 function exgcd(a,b:int64; var x,y:int64):int64;
     2  var t:int64;
     3  begin
     4  if b=0 then
     5   begin
     6    x:=1;y:=0;
     7    exit(a);
     8   end;
     9   r:=exgcd(b,a mod b,x,y);
    10   t:=x;
    11   x:=y;
    12   y:=t-a div b*y;
    13   exit(r);
    14  end;
    View Code

    3后序遍历

     1 var
     2 s1,s2:string;
     3 procedure dfs(a,b:string);
     4 var k:longint;
     5  begin
     6   if length(a)=1 then begin write(a);exit;end;
     7   k:=pos(a[1],b);
     8   if k>1 then dfs(copy(a,2,k-1),copy(b,1,k-1));
     9   if k<length(b) then dfs(copy(a,k+1,length(a)-k),copy(b,k+1,length(b)-k));
    10   write(b[k]);
    11  end;
    12 begin
    13  readln(s1);
    14  readln(s2);
    15  dfs(s1,s2);
    16 end.
    View Code

     4求n的欧拉函数

     1 var
     2   a,b,c,i,j,k,n,m:longint;
     3   t:int64;
     4 begin
     5   readln(n);
     6   a:=n;
     7   t:=n;
     8   for i:=2 to trunc(sqrt(n))do
     9    if a mod i=0 then
    10     begin
    11      begin
    12       while a mod i =0 do a:=a div i;
    13       t:=t*(i-1)div i;
    14      end;
    15      if i>a then break;
    16      end;
    17      if a<>1 then t:=t*(a-1)div a;
    18      if t=n then t:=t-1;
    19      writeln(t);
    20      end.
    View Code

     5 归并排序与逆序对

     1 var
     2 ans,n:int64;
     3 i,j:longint;
     4 a,t:array[0..1000005]of longint;
     5 procedure merge(l,p,r:longint);
     6  var i,j,k:longint;
     7  begin
     8   i:=l;j:=p+1;k:=l;
     9    while(i<=p)and(j<=r) do
    10     begin
    11      if a[i]<=a[j] then
    12       begin
    13        t[k]:=a[i]; inc(i);
    14       end
    15        else
    16       begin
    17        t[k]:=a[j]; inc(j);
    18            ans:=ans+p-i+1;//求逆序对
    19       end;
    20        inc(k);
    21  
    22     end;
    23  
    24     while i<=p do
    25      begin
    26       t[k]:=a[i];
    27       inc(i);inc(k);
    28      end;
    29      while j<=r do
    30       begin
    31        t[k]:=a[j]; inc(k);
    32        inc(j);
    33       end;
    34     for i:=l to r do a[i]:=t[i];
    35  end;
    36 procedure mergesort(l,r:longint);
    37  var mid:int64;
    38   begin
    39   if l<r then
    40    begin
    41     mid:=(l+r)div 2;
    42     mergesort(l,mid);
    43     mergesort(mid+1,r);
    44     merge(l,mid,r);
    45  
    46    end;
    47  end;
    48 begin
    49  readln(n);
    50  for i:=1 to n do readln(a[i]);
    51  mergesort(1,n);
    52  writeln(ans);
    53 end.

    6 快速幂

     1 var
     2 ans,y,a,b,c,k:int64;
     3 
     4 begin
     5  readln(a,b,c);
     6  ans:=1;y:=a;  k:=b;
     7   while b<>0 do
     8    begin
     9     if (b and 1)=1 then ans:=ans*y mod c;
    10      y:=y*y mod c;
    11      b:=b shr 1;
    12    end;
    13   writeln(a,'^',k,' ','mod',' ',c,'=',ans);
    14 end.
    View Code

    7 矩阵快速幂

     1 var
     2 n,tot,b:int64;
     3 i,j,k,l:longint;
     4 a,ans,x:array[0..105,0..105]of int64;
     5 c:array[0..10000]of int64;
     6 procedure cheng;
     7  var i,j,k:longint;
     8  begin
     9   x:=ans;
    10   fillchar(ans,sizeof(ans),0);
    11   for i:=1 to n do
    12    for j:=1 to n do
    13     for k:=1 to n do
    14      begin
    15       ans[i,j]:=(a[i,k]*x[k,j]+ans[i,j]) mod 1000000007;  //
    16      end;
    17  end;
    18 begin
    19  readln(n,b);
    20  for i:=1 to n do
    21   begin
    22   for j:=1 to n do
    23    read(a[i,j]);
    24    readln;
    25   end;
    26   for i:=1 to n do ans[i,i]:=1;
    27   while b>0 do
    28    begin
    29     inc(tot);
    30     c[tot]:=b mod 2;
    31     b:=b shr 1;
    32    end;
    33    for l:=1 to tot do
    34     begin
    35      if c[l]=1 then cheng;
    36      x:=a;
    37    fillchar(a,sizeof(a),0);
    38      for i:=1 to n do
    39       for j:=1 to n do
    40        for k:=1 to n do
    41         a[i,j]:=(a[i,j]+x[i,k]*x[k,j]) mod 1000000007;
    42     end;
    43     for i:=1 to n do
    44      begin
    45       for j:=1 to n do write(ans[i,j],' ');
    46       writeln;
    47       end;
    48 end.
    View Code

    8 tarjan缩点

      1 var
      2 j,ans,e,n,top,m,tot:longint;
      3 i:longint;
      4 instack,bj:array[0..200005]of boolean;
      5 dis,q,rd,c,stack,dfn,low,a,next,head,belong,b_1,b_2,b:array[0..100005]of longint;
      6 
      7 procedure add(x,y:longint);
      8  begin
      9   inc(e);a[e]:=y;next[e]:=head[x];head[x]:=e;
     10   inc(rd[y]);
     11  end;
     12  procedure tarjan(u:longint);
     13   var i,j,v:longint;
     14    begin
     15     inc(tot);
     16    dfn[u]:=tot; low[u]:=tot;
     17    instack[u]:=true;// enter stack. mark true
     18    inc(top);
     19    stack[top]:=u;
     20    i:=head[u];
     21    while i>0 do
     22     begin
     23      v:=a[i];
     24      if dfn[v]=0 then
     25       begin
     26        tarjan(v);
     27        if low[v]<low[u] then low[u]:=low[v];    // watch out
     28       end
     29         else
     30         if (instack[v])and(low[v]<low[u])then low[u]:=low[v];
     31         i:=next[i];
     32      end;
     33       if dfn[u]=low[u] then
     34        begin
     35         inc(ans);
     36         while stack[top+1]<>u do  //important last time you error here
     37          begin
     38           instack[stack[top]]:=false;
     39           belong[stack[top]]:=ans;
     40           inc(b[ans],c[stack[top]]);
     41           dec(top);
     42          end;
     43        end;
     44     end;
     45    procedure spfa(s:longint);
     46  var
     47   h,t,i,v,u:longint;
     48   begin
     49   fillchar(bj,sizeof(bj),0);
     50    h:=0;t:=1;
     51   // for i:=1 to n do dis[i]:=100000000; last time you error here ,too 
     52    q[1]:=s;
     53    dis[s]:=b[s];
     54    while h<t do
     55     begin
     56       inc(h);
     57       u:=q[h];
     58     //  bj[u]:=false;
     59       i:=head[u];
     60        while i>0 do
     61          begin
     62           v:=a[i];
     63           if (dis[v]<dis[u]+b[v]) then
     64             begin
     65               dis[v]:=dis[u]+b[v];
     66             if not bj[v] then
     67              begin
     68                bj[v]:=true;
     69                 inc(t);
     70                 q[t]:=v;
     71             end;
     72           end;
     73           i:=next[i]; //下一条边
     74           bj[v]:=false;// 松弛y节点
     75          end;
     76     end;
     77       for i:=1 to ans do if tot<dis[i] then tot:=dis[i];
     78   end;
     79 begin
     80  readln(n,m);
     81  for i:=1 to n do
     82   read(c[i]);
     83  for i:=1 to m do
     84   begin
     85    readln(b_1[i],b_2[i]);
     86    add(b_1[i],b_2[i]);
     87   end;
     88   for i:=1 to n do
     89    if dfn[i]=0 then tarjan(i);
     90   //for i:=1 to n do writeln(belong[i]);
     91   fillchar(next,sizeof(next),0);
     92   fillchar(head,sizeof(head),0);
     93   fillchar(a,sizeof(a),0);
     94   fillchar(rd,sizeof(rd),0);
     95   e:=0;
     96   tot:=0;
     97    for i:=1 to m do
     98     if belong[b_1[i]]<>belong[b_2[i]] then add(belong[b_1[i]],belong[b_2[i]]);
     99     for i:=1 to ans do
    100      begin
    101       if rd[i]=0 then spfa(i);
    102      end;
    103      writeln(tot);
    104     end.
    View Code

    9 乘法逆元

     1 var
     2 s1,c,m,x,y:int64;
     3 i:longint ;
     4  procedure exgcd(a,b:int64;var x,y:int64);
     5 var r,t:int64;
     6  begin
     7   if b=0 then
     8    begin
     9     x:=1;y:=0; exit;
    10    end;
    11    exgcd(b,a mod b,x,y);
    12    t:=x;
    13    x:=y;
    14    y:=t-a div b*y;
    15 
    16  end;
    17  {procedure cal(d,m:int64);
    18  var x,y:int64;
    19   begin
    20     exgcd(d,m,x,y);
    21      writeln(((x mod m+m)mod m));
    22   end; }
    23 begin
    24  readln(s1,c);
    25 for i:=1 to s1 do
    26  begin
    27   exgcd(i,c,x,y);
    28   writeln((x mod c+c)mod c);
    29   end;
    30 end.
    View Code

    10 treap

      1 var
      2 tr:array[0..500005]of record
      3   l,r,v,w,num,s:longint;
      4   end;
      5   i,n,tot,ans,m,a,root:longint;
      6 procedure update(x:longint);
      7  begin
      8   tr[x].s:=tr[x].num+tr[tr[x].l].s+tr[tr[x].r].s;
      9  end;
     10  procedure right(var x:longint);
     11   var k:longint;
     12   begin
     13     k:=tr[x].l;
     14     tr[x].l:=tr[k].r;tr[k].r:=x;
     15     tr[k].s:=tr[x].s;
     16     update(x);
     17     x:=k;
     18   end;
     19   procedure left(var x:longint);
     20    var k:longint;
     21     begin
     22      k:=tr[x].r;
     23      tr[x].r:=tr[k].l;tr[k].l:=x;
     24      tr[k].s:=tr[x].s;
     25      update(x);
     26      x:=k;
     27    end;
     28    procedure insert(var x:longint; v:longint);
     29     begin
     30      if x=0 then
     31       begin
     32         inc(tot);
     33         x:=tot;
     34         tr[x].s:=1; tr[x].num:=1;
     35         tr[x].v:=v; tr[x].w:=random(n+5);   exit;
     36       end;
     37      inc(tr[x].s);
     38      if tr[x].v=v then inc(tr[x].num)
     39      else if (v<tr[x].v) then
     40        begin
     41          insert(tr[x].l,v);
     42          if tr[tr[x].l].w<tr[x].w then right(x);
     43        end
     44      else
     45        begin
     46         insert(tr[x].r,v);
     47         if tr[tr[x].r].w<tr[x].w then left(x);
     48        end;
     49     end;
     50     procedure erase(var x:longint; v:longint);
     51      begin
     52        if x=0 then exit;
     53        if v=tr[x].v then
     54        begin
     55            if tr[x].num>1 then
     56             begin dec(tr[x].num);  dec(tr[x].s);  exit;    end;
     57          if tr[x].l=0 then x:=tr[x].r
     58           else
     59          if tr[x].r=0 then x:=tr[x].l
     60           else
     61             begin
     62               if tr[tr[x].l].w<tr[tr[x].r].w then
     63                begin  right(x);erase(x,v);  end
     64                else
     65                 begin   left(x);erase(x,v); end;
     66             end;
     67        end
     68        else
     69        // begin
     70           if v<tr[x].v then begin dec(tr[x].s);erase(tr[x].l,v); end
     71           else
     72             begin dec(tr[x].s); erase(tr[x].r,v);end;
     73       //  end;
     74      end;
     75      function rank(x,v:longint):longint;
     76       begin
     77         if x=0 then exit(0);
     78         if tr[x].v=v then exit(tr[tr[x].l].s+1)
     79         else
     80           if(v<tr[x].v)  then exit(rank(tr[x].l,v))
     81         else
     82           exit(tr[tr[x].l].s+tr[x].num+rank(tr[x].r,v));
     83       end;
     84 
     85      function num(x,v:longint):longint;
     86       begin
     87        if x=0 then exit(x);
     88        if v<=tr[tr[x].l].s then exit(num(tr[x].l,v))
     89          else
     90        if v>tr[x].num+tr[tr[x].l].s then
     91          exit(num(tr[x].r,v-tr[tr[x].l].s-tr[x].num))
     92            else
     93            exit(tr[x].v);
     94       end;
     95  procedure pre(x,v:longint);
     96  begin
     97    if x=0 then exit;
     98    if v>tr[x].v then
     99     begin
    100       ans:=x; pre(tr[x].r,v);
    101     end
    102      else pre(tr[x].l,v);
    103  end;
    104  procedure sub(x,v:longint);
    105  begin
    106    if x=0 then exit;
    107    if v<tr[x].v then
    108     begin
    109       ans:=x; sub(tr[x].l,v);
    110     end
    111      else sub(tr[x].r,v);
    112  end;
    113 begin
    114 //assign(input,'jj.in');reset(input);
    115 //assign(output,'jj.out');rewrite(output);
    116 randomize;
    117  readln(n);
    118  for i:=1 to n do
    119   begin
    120   readln(a,m);
    121   if a=1 then insert(root,m);
    122   if a=2 then erase(root,m);
    123   if a=3 then writeln(rank(root,m));
    124   if a=4 then writeln(num(root,m));
    125   if a=5 then begin pre(root,m);writeln(tr[ans].v); end;
    126   if a=6 then begin sub(root,m);writeln(tr[ans].v); end;
    127   end;
    128   close(input);
    129   close(output);
    130 
    131   end.
    View Code

    11 树状数组

     1 var
     2 x,y,ch,i,j,n,m:longint;
     3 a,c:array[0..500005]of longint;
     4 function lowbit(x:longint):longint;
     5  begin
     6    exit(x and -x);
     7  end;
     8 procedure build(x,w:longint);
     9 begin
    10  while x<=n do
    11   begin
    12    c[x]:=c[x]+w;
    13    x:=x+lowbit(x);
    14   end;
    15 end;
    16 procedure add(x,w:longint);
    17  begin
    18     while x<=n do
    19      begin
    20        c[x]:=c[x]+w;
    21        x:=lowbit(x)+x;
    22      end;
    23  end;
    24  function sum(x:longint):int64;
    25 var ans:int64;
    26   begin
    27    ans:=0;
    28     while x>0 do
    29      begin
    30       ans:=ans+c[x];
    31       x:=x-lowbit(x);
    32      end;
    33      exit(ans);
    34   end;
    35  function slove(x,y:longint):int64;
    36  var t1,t2:int64;
    37   begin
    38    t1:=sum(x-1);
    39    t2:=sum(y);
    40    exit(t2-t1);
    41   end;
    42 begin
    43  readln(n,m);
    44  for i:=1 to n do
    45   begin
    46     read(a[i]);
    47     build(i,a[i]);
    48   end;
    49   for i:=1 to m do
    50    begin
    51      readln(ch,x,y);
    52      if ch=1 then add(x,y);
    53      if ch=2 then writeln(slove(x,y));
    54    end;
    55 end.
    View Code

    12差分树状数组

     1 var
     2 x,y,ch,i,j,n,m,last,k:longint;
     3 a,c:array[0..500005]of longint;
     4 function lowbit(x:longint):longint;
     5  begin
     6    exit(x and -x);
     7  end;
     8 procedure build(x,w:longint);
     9 begin
    10  while x<=n do
    11   begin
    12    c[x]:=c[x]+w;
    13    x:=x+lowbit(x);
    14   end;
    15 end;
    16 procedure add(x,w:longint);
    17  begin
    18     while x<=n do
    19      begin
    20        c[x]:=c[x]+w;
    21        x:=lowbit(x)+x;
    22      end;
    23  end;
    24  procedure detele(x,w:int64);
    25   begin
    26     while x<=n do
    27      begin
    28        c[x]:=c[x]-w;
    29        x:=x+lowbit(x);
    30      end;
    31   end;
    32  function sum(x:longint):int64;
    33 var ans:int64;
    34   begin
    35    ans:=0;
    36     while x>0 do
    37      begin
    38       ans:=ans+c[x];
    39       x:=x-lowbit(x);
    40      end;
    41      exit(ans);
    42   end;
    43 begin
    44  readln(n,m);
    45  for i:=1 to n do
    46   begin
    47     read(a[i]);
    48     build(i,a[i]-last);
    49     last:=a[i];
    50   end;
    51   for i:=1 to m do
    52    begin
    53      read(ch);
    54      if ch=1 then
    55       begin
    56         read(x,y,k);
    57          add(x,k);
    58         detele(y+1,k);
    59       end;
    60      if ch=2 then begin read(x);writeln(sum(x));end;
    61      readln;
    62    end;
    63 end.

    13 LCA

     1 var
     2 dep,q,fa,a,next,head:array[0..1500005]of longint;
     3 f:array[0..1000005,0..20]of longint;
     4 bj:array[0..1500005]of boolean;
     5 e,n,m,i,k,x,y,root,j,xx,yy:longint;
     6 procedure add(x,y:longint);
     7  begin
     8    inc(e); a[e]:=y;next[e]:=head[x];head[x]:=e;
     9  end;
    10  procedure dfs(x:longint);
    11  var i,v:longint;
    12  begin
    13    i:=head[x];
    14    while i>0 do
    15      begin
    16        v:=a[i];
    17        if dep[v]=0 then
    18          begin
    19            dep[v]:=dep[x]+1;
    20            f[v,0]:=x;
    21            dfs(v);
    22          end;
    23        i:=next[i];
    24      end;
    25  end;
    26  procedure swap(var xx,yy:longint);
    27  var t:longint;
    28   begin
    29    t:=xx;xx:=yy;yy:=t;
    30   end;
    31  function lca(x,y:longint):longint;
    32   var i:longint;
    33   begin
    34    if dep[x]<dep[y] then swap(x,y);
    35 
    36    for i:=20 downto 0 do
    37     begin
    38       if dep[f[x,i]]>=dep[y] then x:=f[x,i];
    39     end;
    40  //    if y=5 then writeln(dep[x],' ',dep[y]);
    41    if x=y then exit(x);
    42    for i:=20 downto 0 do
    43     if f[x,i]<>f[y,i] then
    44       begin
    45         x:=f[x,i];y:=f[y,i];
    46       end;
    47       exit(f[x,0]);
    48   end;
    49 begin
    50  readln(n,m,root);
    51  for i:=1 to n-1 do
    52   begin
    53     readln(x,y);
    54     add(x,y);
    55     add(y,x);
    56   end;
    57   f[root,0]:=root;dep[root]:=1;// wrong here
    58   dfs(root);
    59 
    60    for i:=1 to 20 do
    61     for j:=1 to n do
    62      begin
    63        f[j,i]:=f[f[j,i-1],i-1];
    64      end;
    65    for i:=1 to m do
    66     begin
    67       readln(x,y);
    68       writeln(LCA(x,y));
    69     end;
    70 end.
    View Code
    NOIP2018 rp++
  • 相关阅读:
    StrToUnicode C#语言如何将汉字转换成Unicode字符
    SQLServer 2008数据库查看死锁、堵塞的SQL语句
    String.IsNullOrEmpty和"".length>0 那个更高效
    使用策略设计模式,反射,解决商城系统中的商品折扣问题
    假分页
    MAC校验
    eclipse环境加载svn
    将数据导出Excel格式
    svn提交问题
    字符串前拼接字符
  • 原文地址:https://www.cnblogs.com/brilliant107/p/9381895.html
Copyright © 2020-2023  润新知