• 模板集合——持续更新中


    首先  

    sro_Cydiater_orz  

    sro_姬树流_orz

    两位开搞模板集合已久的大神

    1、对拍

     1 @echo off
     2 set path=C:MinGWStudioMinGWin
     3 g++ -o makedata.exe makedata.cpp
     4 g++ -o right.exe right.cpp
     5 g++ -o test.exe test.cpp
     6 set path=C:Windowssystem32
     7 :loop
     8 makedata.exe
     9 right.exe
    10 test.exe
    11 fc cout1.out cout2.out
    12 if errorlevel==1 pause
    13 goto loop
    View Code

    2、fread

    1 char buf[1<<15],*fs,*ft;
    2 inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
    3 inline int read()
    4 {
    5     int x=0,f=1;  char ch=getc();
    6     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();}
    7     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getc();}
    8     return x*f;
    9 }
    View Code

    3、fwrite

     1 char buf[1<<15],*fs=buf,*ft=buf+(1<<15);
     2 #define ot(x) (fs==ft?fwrite(buf,1,1<<15,stdout),*(fs=buf)++=x:*fs++=x)
     3 inline void print(int x)
     4 {
     5     if(x<0) {ot(45);x=-x;}
     6     static char s[15],*b; b=s;
     7     if(!x)*b++=48;
     8     for(;x;*b++=x%10+48,x/=10);
     9     for(;b--!=s;ot(*b));
    10 }
    View Code

    4、倍增求LCA

     1 void dfs(int x,int fa)
     2 {
     3     anc[x][0]=f[x];
     4     for(int i=1;i<=20;i++)  anc[x][i]=anc[anc[x][i-1]][i-1];
     5     for(int i=Link[x];i;i=e[i].next)
     6         if(e[i].y!=fa)
     7         {
     8             f[e[i].y]=x;
     9             deep[e[i].y]=deep[x]+1;
    10             dfs(e[i].y,x);
    11         }
    12 }
    13 int lca(int x,int y)
    14 {
    15     if(deep[x]<deep[y]) swap(x,y);
    16     for(int i=20;i>=0;i--) if(deep[anc[x][i]]>=deep[y])  x=anc[x][i];
    17     if(x==y) return x;
    18     for(int i=20;i>=0;i--) if(anc[x][i]!=anc[y][i])  x=anc[x][i],y=anc[y][i];
    19     return f[x];
    20 }
    View Code

    5、树链剖分

     1 void dfs1(int x)
     2 {
     3     dep[x]=dep[f[x]]+1;  size[x]=1;
     4     for(int i=a[x];i;i=e[i].next)
     5         if(e[i].y!=f[x]&&!f[e[i].y])
     6         {
     7             f[e[i].y]=x;
     8             dfs1(e[i].y);
     9             size[x]+=size[e[i].y];
    10             if(size[son[x]]<size[e[i].y])  son[x]=e[i].y;
    11         }
    12 }
    13 void dfs2(int x)
    14 {
    15     if(x==son[f[x]])top[x]=top[f[x]]; else top[x]=x;
    16     for(int i=a[x];i;i=e[i].next) if(f[e[i].y]==x)  dfs2(e[i].y);
    17 }
    View Code

    6、Treap

     1 struct data{int l,r,v,size,fix,w;}tr[100005];
     2 int n,len,root,ans;
     3 void update(int k){tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;}
     4 void rturn(int &k){int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;tr[t].size=tr[k].size;update(k);k=t;}
     5 void lturn(int &k){int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;tr[t].size=tr[k].size;update(k);k=t;}
     6 void insert(int &k,int x)
     7 {
     8     if(k==0){len++;k=len;tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].fix=rand();return;}
     9     tr[k].size++;
    10     if(tr[k].v==x)tr[k].w++;//每个结点顺便记录下与该节点相同值的数的个数
    11     else if(x>tr[k].v){insert(tr[k].r,x);if(tr[tr[k].r].fix<tr[k].fix)lturn(k);}
    12     else {insert(tr[k].l,x);if(tr[tr[k].l].fix<tr[k].fix)rturn(k);} 
    13 }
    14 void del(int &k,int x)
    15 {
    16     if(k==0)return; 
    17     if(tr[k].v==x)
    18     {
    19         if(tr[k].w>1){tr[k].w--;tr[k].size--;return;}
    20         if(tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r;//有一个儿子为空
    21         else if(tr[tr[k].l].fix<tr[tr[k].r].fix) rturn(k),del(k,x);
    22         else lturn(k),del(k,x);
    23     }
    24     else if(x>tr[k].v) tr[k].size--,del(tr[k].r,x);
    25     else tr[k].size--,del(tr[k].l,x);
    26 }
    27 int rank(int k,int x)
    28 {
    29     if(k==0) return 0;
    30     if(tr[k].v==x) return tr[tr[k].l].size+1;
    31     else if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+rank(tr[k].r,x);
    32     else return rank(tr[k].l,x);
    33 }
    34 int Findkth(int k,int x)
    35 {
    36     if(k==0)return 0;
    37     if(x<=tr[tr[k].l].size) return Findkth(tr[k].l,x);
    38     else if(x>tr[tr[k].l].size+tr[k].w) return Findkth(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
    39     else return tr[k].v;
    40 }
    41 void get_before(int k,int x)
    42 {
    43     if(k==0)return;
    44     if(tr[k].v<x) ans=k;get_before(tr[k].r,x);
    45     else get_before(tr[k].l,x);
    46 }
    47 void get_behind(int k,int x)
    48 {
    49     if(k==0)return;
    50     if(tr[k].v>x) ans=k;get_behind(tr[k].l,x);
    51     else get_behind(tr[k].r,x);
    52 }
    View Code

    7、替罪羊树

      1 #define INF 1000000000
      2 const double chty=0.75;  //平衡常数
      3 struct node{int son[2],f,size,v;}tr[100005];
      4 int n,len,root,top,stack[100005];
      5 void init()
      6 {
      7     len=2;  root=1;
      8     tr[1].size=2;  tr[1].v=-INF;  tr[1].son[1]=2;
      9     tr[2].size=1;  tr[2].v=INF;   tr[2].f=1;
     10 }
     11 bool balance(int x) 
     12 {
     13     double p=tr[x].size*chty;
     14     return p>=(double)tr[tr[x].son[0]].size&&p>=(double)tr[tr[x].son[1]].size;
     15 }
     16 void dfs(int x)//中序遍历
     17 {
     18     if(!x)  return;
     19     dfs(tr[x].son[0]);
     20     stack[++top]=x;
     21     dfs(tr[x].son[1]);
     22 }
     23 int build(int l,int r)
     24 {
     25     if(l>r)  return 0;
     26     int mid=(l+r)/2,x=stack[mid];
     27     tr[tr[x].son[0]=build(l,mid-1)].f=x;
     28     tr[tr[x].son[1]=build(mid+1,r)].f=x;
     29     tr[x].size=tr[tr[x].son[0]].size+tr[tr[x].son[1]].size+1;
     30     return x;
     31 }
     32 void rebuild(int x)
     33 {
     34     top=0;  dfs(x);
     35     int fa=tr[x].f,which=(tr[fa].son[1]==x);
     36     int sonroot=build(1,top);
     37     tr[tr[fa].son[which]=sonroot].f=fa;
     38     if(x==root)  root=sonroot;
     39 }
     40 int find(int v)
     41 {
     42     int now=root;
     43     while(now)
     44     {
     45         if(v==tr[now].v)  return now;
     46         else now=tr[now].son[v>tr[now].v];
     47     }
     48 }
     49 void insert(int v)
     50 {
     51     int now=root,p=++len; 
     52     tr[p].v=v;  tr[p].size=1;//新开结点
     53     while(1)
     54     {
     55         tr[now].size++;
     56         int which=(v>=tr[now].v);//表示p在当前根的哪个子树内
     57         if(tr[now].son[which])  now=tr[now].son[which];  
     58         else {tr[tr[now].son[which]=p].f=now;  break;}
     59     }
     60     int id=0;
     61     for(int i=p;i;i=tr[i].f)  if(!balance(i))  id=i;//记录不平衡点
     62     if(id)  rebuild(id);//重构子树
     63 }
     64 void del(int x)
     65 {
     66     if(tr[x].son[0]&&tr[x].son[1])
     67     {
     68         int p=tr[x].son[0];
     69         while(tr[p].son[1])  p=tr[p].son[1];
     70         tr[x].v=tr[p].v;  x=p;
     71     }
     72     int Son=(tr[x].son[0])?tr[x].son[0]:tr[x].son[1],which=(tr[tr[x].f].son[1]==x);
     73     tr[tr[tr[x].f].son[which]=Son].f=tr[x].f;
     74     for(int i=tr[x].f;i;i=tr[i].f)  tr[i].size--;
     75     if(x==root)  root=Son;
     76 }
     77 int rank(int v)
     78 {
     79     int now=root,ans=0;
     80     while(now)
     81     {
     82         if(tr[now].v<v)  {ans+=tr[tr[now].son[0]].size+1;  now=tr[now].son[1];}
     83         else now=tr[now].son[0];
     84     }
     85     return ans;
     86 }
     87 int kth(int x)
     88 {
     89     int now=root;
     90     while(1)
     91     {
     92         if(tr[tr[now].son[0]].size==x-1)  return now;
     93         else if(tr[tr[now].son[0]].size>=x)  now=tr[now].son[0];
     94         else x-=tr[tr[now].son[0]].size+1,now=tr[now].son[1];
     95     }
     96     return now;
     97 }
     98 int before(int v)
     99 {
    100     int now=root,ans=-INF;
    101     while(now)
    102     {
    103         if(tr[now].v<v)  ans=max(ans,tr[now].v),now=tr[now].son[1];
    104         else now=tr[now].son[0];
    105     }
    106     return ans;
    107 }
    108 int after(int v)
    109 {
    110     int now=root,ans=INF;
    111     while(now)
    112     {
    113         if(tr[now].v>v)  ans=min(ans,tr[now].v),now=tr[now].son[0];
    114         else now=tr[now].son[1];
    115     }
    116     return ans;
    117 }
    View Code

    8、kmp

    1 void pre(){int j=0;for(int i=2;i<=m;i++){while(j>0&&b[j+1]!=b[i])j=p[j];if(b[j+1]==b[i])j++;p[i]=j;}}
    2 void kmp(){int j=0;for(int i=1;i<=n;i++){while(j>0&&b[j+1]!=a[i])j=p[j];if(b[j+1]==a[i])j++;if(j==m)printf("%d
    ",i-m+1);}
    View Code

    9、AC自动机

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<ctime>
     7 #include<algorithm>
     8 #include<iomanip>
     9 using namespace std;
    10 #define MAXN 1000100
    11 int n,cnt,q[MAXN],fail[MAXN],end[MAXN],tr[MAXN][26];
    12 char ch[MAXN];
    13 void insert()
    14 {
    15     int now=0;
    16     for(int i=1;i<=strlen(ch+1);i++)
    17     {
    18         if(!tr[now][ch[i]-'a']) tr[now][ch[i]-'a']=++cnt;
    19         now=tr[now][ch[i]-'a'];
    20     }
    21     end[now]++;
    22 }
    23 void build()
    24 {
    25     int head=0,tail=0;
    26     for(int i=0;i<26;i++)  if(tr[0][i])  q[++tail]=tr[0][i];
    27     while(++head<=tail)
    28     {
    29         int x=q[head];
    30         for(int i=0;i<26;i++)
    31         {
    32             if(!tr[x][i])  tr[x][i]=tr[fail[x]][i];
    33             else fail[tr[x][i]]=tr[fail[x]][i],q[++tail]=tr[x][i];
    34         }
    35     }
    36 }
    37 void find()
    38 {
    39     scanf("%s",ch+1);  int x=0,ans=0;
    40     for(int i=1;i<=strlen(ch+1);i++)
    41     {
    42         while(x&&!tr[x][ch[i]-'a'])x=fail[x]; x=tr[x][ch[i]-'a']; int temp=x;
    43         while(temp){ans+=end[temp];temp=fail[temp];}
    44     }
    45     printf("%d
    ",ans);
    46 }
    47 int main()
    48 {
    49     freopen("cin.in","r",stdin);
    50     freopen("cout.out","w",stdout);
    51     scanf("%d",&n);
    52     for(int i=1;i<=n;i++) {scanf("%s",ch+1); insert();}
    53     build();
    54     find();
    55     return 0;
    56 }
    View Code

    10、后缀数组

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<algorithm>
     8 using namespace std;
     9 #define FILE "read"
    10 #define MAXN 100010
    11 int n,rank[MAXN],sa[MAXN],p[MAXN],cnt[MAXN],tmp[MAXN],height[MAXN];
    12 char s[MAXN];
    13 namespace Suffix_Array{
    14     bool equ(int x,int y,int l) {return rank[x]==rank[y]&&rank[x+l]==rank[y+l];}
    15     void doubling(){
    16         for(int i=1;i<=n;i++)  rank[i]=s[i],sa[i]=i;
    17         for(int pos=0,l=0,i,sig=255;pos<n;sig=pos){
    18             for(i=n-l+1,pos=0;i<=n;i++)  p[++pos]=i;
    19             for(i=1;i<=n;i++) if(sa[i]>l)  p[++pos]=sa[i]-l;
    20             for(i=1;i<=sig;i++)  cnt[i]=0;
    21             for(i=1;i<=n;i++)  cnt[rank[i]]++;
    22             for(i=1;i<=sig;i++)  cnt[i]+=cnt[i-1];
    23             for(i=n;i;i--)  sa[cnt[rank[p[i]]]--]=p[i];
    24             for(i=1,pos=0;i<=n;i++)  tmp[sa[i]]=equ(sa[i],sa[i-1],l)?pos:++pos;
    25             l=!l?1:l<<1;
    26         }
    27     }
    28     void gethight(){
    29         for(int i=1,j=0,k;i<=n;i++){
    30             if(!(k=sa[rank[i]-1]))  {j=0;  continue;}
    31             if(j) j--;
    32             while(s[i+j]==s[k+j])  j++;
    33             height[rank[i]]=j;
    34         }
    35     }
    36 }
    View Code

    11、归并排序

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cmath>
     7 #include<algorithm>
     8 using namespace std;
     9 #define FILE "read"
    10 #define up(i,j,n) for(int i=j;i<=n;i++)
    11 int n,a[10010];
    12 namespace Init{
    13     char buf[1<<15],*fs,*ft;
    14     inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
    15     inline int read(){
    16         int x=0,f=1;  char ch=getc();
    17         while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();}
    18         while(isdigit(ch))  {x=x*10+ch-'0';  ch=getc();}
    19         return x*f;
    20     }
    21 }
    22 namespace GB_Sort{
    23     int c[10010],len(0);
    24     void dfs2(int l,int r){
    25         int mid=(l+r)>>1,i=l,j=mid+1,len=l-1;
    26         while(i<=mid&&j<=r){
    27             if(a[i]>a[j])  c[++len]=a[j++];
    28             else c[++len]=a[i++];
    29         } 
    30         while(i<=mid)  c[++len]=a[i++];
    31         while(j<=r)  c[++len]=a[j++];
    32         up(i,l,r) a[i]=c[i];
    33     }
    34     void dfs1(int l,int r){
    35         if(l<r){
    36             int mid=(l+r)>>1;
    37             dfs1(l,mid);  dfs1(mid+1,r);
    38             dfs2(l,r);
    39         }
    40     }
    41 }
    42 void init(){
    43     n=Init::read();
    44     up(i,1,n) a[i]=Init::read();
    45 }
    46 void output() {up(i,1,n) printf("%d ",a[i]);  printf("
    %d
    ",ans);}
    47 int main(){
    48     freopen(FILE".in","r",stdin);
    49     freopen(FILE".out","w",stdout);
    50     init();
    51     GB_Sort::dfs1(1,n);
    52     output();
    53     return 0;
    54 }
    View Code

    12、高精度

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<ctime>
      6 #include<cmath>
      7 #include<algorithm>
      8 using namespace std;
      9 typedef long long ll;
     10 #define FILE "read"
     11 #define up(i,j,n) for(ll i=j;i<=n;i++)
     12 #define down(i,j,n) for(ll i=j;i>=n;i--)
     13 struct node{ll num[20010],len;}A,B;
     14 char ch1[20010],ch2[20010];
     15 namespace High{
     16     node add(node a,node b){//高精度加法
     17         ll len=max(a.len,b.len);
     18         node c;
     19         up(i,1,len){
     20             c.num[i]+=a.num[i]+b.num[i];
     21             while(c.num[i]>=10)  c.num[i+1]++,c.num[i]-=10;
     22         }
     23         while(c.num[len+1]>0)  len++;
     24         c.len=len;
     25         return c;
     26     }
     27     ll comp(node a,node b){//高精度数比较
     28         if(a.len>b.len) return -1;
     29         if(a.len<b.len) return 1;
     30         down(i,a.len,1){
     31             if(a.num[i]>b.num[i])  return -1;
     32             if(a.num[i]<b.num[i])  return 1;
     33         }
     34         return 0;
     35     }
     36     node Del(node a,node b){//高精度减法
     37         node c;
     38         ll len=max(a.len,b.len);
     39         up(i,1,len){
     40             c.num[i]+=a.num[i]-b.num[i];
     41             if(c.num[i]<0)  c.num[i]+=10,c.num[i+1]--;
     42         }
     43         while(c.num[len]==0&&len>1)  len--;
     44         c.len=len;
     45         return c;
     46     }
     47     node del(node a,node b){
     48         if(comp(a,b)>0)  {printf("-");  return Del(b,a);}
     49         else return Del(a,b);
     50     }
     51     node mul(node a,ll b){//高精乘单精
     52         node c;  ll len=a.len;
     53         memset(c.num,0,sizeof(c.num));
     54         up(i,1,len){
     55             c.num[i]+=a.num[i]*b;
     56             if(c.num[i]>=10) c.num[i+1]=c.num[i]/10,c.num[i]%=10;
     57         }
     58         while(c.num[len+1]){
     59             len++;
     60             if(c.num[len]>=10)  c.num[len+1]=c.num[len]/10,c.num[len]%=10;
     61         }
     62         c.len=len;
     63         return c;
     64     }
     65     node Mul(node a,node b){//高精乘高精
     66         node c; c.len=1;
     67         up(i,1,a.len)  up(j,1,b.len){
     68             ll k=i+j-1;
     69             c.num[k]+=a.num[i]*b.num[j];
     70             while(c.num[k]>=10)  c.num[k+1]+=c.num[k]/10,c.num[k]%=10,k++;
     71             if(k>c.len)  c.len=k;
     72         }
     73         while(c.num[c.len]==0&&c.len>1)  c.len--;
     74         return c;
     75     }
     76     void div(node a,node b){//高精除高精(答案是单精)
     77         ll l=0,r=2000000000,ans=0;
     78         while(l<=r){
     79             ll mid=(l+r)>>1;
     80             node c=mul(b,mid);
     81             if(comp(c,a)>=0)  {l=mid+1;  ans=mid;}
     82             else r=mid-1;
     83         }
     84         printf("%d
    ",ans);
     85     }
     86 }
     87 void init(){
     88     scanf("%s",ch1+1);  
     89     scanf("%s",ch2+1);
     90     ll n=strlen(ch1+1);
     91     ll m=strlen(ch2+1);
     92     down(i,n,1)  A.num[++A.len]=(ll)ch1[i]-'0';
     93     down(i,m,1)  B.num[++B.len]=(ll)ch2[i]-'0';
     94 }
     95 void output(node c){
     96     down(i,c.len,1)  printf("%d",c.num[i]);
     97 }
     98 int main(){
     99     freopen(FILE".in","r",stdin);
    100     freopen(FILE".out","w",stdout);
    101     init();
    102     //node c=High::Mul(A,B);
    103     //ll p;  scanf("%d",&p);
    104     //node c=High::mul(A,p);
    105     //output(c);
    106     //High::div(A,B);
    107     return 0;
    108 }
    View Code
  • 相关阅读:
    Android开发 View_自定义快速索引侧边栏 SideBarView
    Android开发 PopupWindow开发的一些例子
    Android开发 Fragment里监听返回键
    AndroidStudio 清除项目里无用的资源
    Android开发 SingleLiveEvent解决LiveData或者MutableLiveData多次回调的问题
    字母排列城市列表资源
    Android开发 GridView详解
    Android开发 NestedScrollView嵌套RecyclerView导致的UI加载慢的问题
    Android开发 跳转指定应用商城评分
    Android开发 Activity生命周期详解
  • 原文地址:https://www.cnblogs.com/chty/p/5989716.html
Copyright © 2020-2023  润新知