zoukankan      html  css  js  c++  java
  • ACM菜鸡选手自备的模板(不喜勿喷,纯属自备

                                                                                               目录

    ------------------快速幂

    ------------------矩阵快速幂

    ------------------Dijstrla算法

    ------------------Spfa算法

    ------------------Floyd算法

    ------------------Tarjan算法

    ------------------Prim算法

    ------------------Kruskal算法

    ------------------EdmondsKarp算法

    ------------------Dinic算法

    ------------------拓扑排序

    ------------------树状数组

    ------------------线段树+离散化处理

    ------------------线段树+dfs序

    ------------------线段树+扫描线

    ------------------主席树

    ------------------树链剖分+线段树

    ------------------莫队+dfs序

    ------------------st表

    ------------------multiset的应用

    ------------------kmp算法

    ------------------字典树

    ------------------manacher算法

    ------------------并查集

    ------------------快速乘

    ------------------单调队列

    ------------------三分

    快速幂

     1 typedef long long ll;
     2 ll mod;
     3 ll qpow(ll a, ll n)//计算a^n % mod
     4 {
     5     ll re = 1;
     6     while(n)
     7     {
     8         if(n & 1)//判断n的最后一位是否为1
     9             re = (re * a) % mod;
    10         n >>= 1;//舍去n的最后一位
    11         a = (a * a) % mod;//将a平方
    12     }
    13     return re % mod;
    14 }
    View Code

    矩阵快速幂(19年牛客多校第五场B)

    十进制版本,二进制同理

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 typedef long long ll;
     7 char s[1000005];
     8 ll mod;
     9 struct Matrix
    10 {
    11     ll a[2][2];
    12     Matrix(int x)
    13     {
    14         a[0][0]=a[1][1]=x;
    15         a[1][0]=a[0][1]=0;
    16     }
    17     Matrix operator *(Matrix s)
    18     {
    19         Matrix ans(0);
    20         for(ll k=0; k<2; k++)
    21         {
    22             for(ll i=0; i<2; i++)
    23             {
    24                 ll sum=0;
    25                 for(ll j=0; j<2; j++)
    26                     sum=(sum+a[i][j]*s.a[j][k])%mod;
    27                 ans.a[i][k]=sum;
    28             }
    29         }
    30         return ans;
    31     }
    32 };
    33 Matrix ten(Matrix s)
    34 {
    35     Matrix ans(1);
    36     for(ll i=0; i<10; i++)
    37         ans=ans*s;
    38     return ans;
    39 }
    40 Matrix quick(Matrix s,char a[],ll len)
    41 {
    42     Matrix base(1),ans(1);
    43     Matrix k(1);
    44     base=s;
    45     for(ll i=len-1; i>=0; i--)
    46     {
    47         if(a[i]!='0')
    48         {
    49             for(ll j=1; j<=a[i]-'0'; j++)
    50                 ans=ans*base;
    51         }
    52         base=ten(base);
    53     }
    54     return ans;
    55 }
    56 int main()
    57 {
    58     ll x0,x1,a,b,i,j,len;
    59     Matrix ss(0),ans(0);
    60     while(scanf("%lld %lld %lld %lld",&x0,&x1,&a,&b)!=EOF)
    61     {
    62         scanf("%s",s);
    63         scanf("%lld",&mod);
    64         ss.a[0][1]=1;
    65         ss.a[0][0]=0;
    66         ss.a[1][0]=b;
    67         ss.a[1][1]=a;
    68         if(strcmp(s,"1")==0)
    69         {
    70             printf("%lld
    ",x1);
    71         }
    72         else
    73         {
    74             char *p=s;
    75             len=strlen(p);
    76             if(p[len-1]!='0')
    77             {
    78                 p[len-1]--;
    79             }
    80             else
    81             {
    82                 p[len-1]='9';
    83                 i=len-2;
    84                 while(i>=0&&p[i]=='0')
    85                     p[i]='9',i--;
    86                 p[i]--;
    87             }
    88             if(p[0]=='0')
    89                 ans=quick(ss,p+1,len-1);
    90             else
    91                 ans=quick(ss,p,len);
    92             printf("%lld
    ",(ans.a[1][0]*x0+ans.a[1][1]*x1)%mod);
    93         }
    94     }
    95     return 0;
    96 }
    View Code

    Dijstrla算法(POJ2387)

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 int head[1005];
     7 struct node
     8 {
     9     int k;
    10     int step;
    11     int next;
    12 } a[4005];
    13 int tol;
    14 bool vis[1005];
    15 inline void add(int x,int y,int z)
    16 {
    17     a[tol].next=head[x];
    18     a[tol].k=y;
    19     a[tol].step=z;
    20     head[x]=tol++;
    21     a[tol].next=head[y];
    22     a[tol].k=x;
    23     a[tol].step=z;
    24     head[y]=tol++;
    25 }
    26 int n,t;
    27 bool operator <(const node &x,const node &y)
    28 {
    29     return y.step<x.step;
    30 }
    31 int dij()
    32 {
    33     node r,p;
    34     p.step=0;
    35     p.k=1;
    36     priority_queue<node>q;
    37     q.push(p);
    38     while(!q.empty())
    39     {
    40         p=q.top();
    41         q.pop();
    42         if(vis[p.k])
    43             continue;
    44         vis[p.k]=true;
    45         if(p.k==t)
    46             return p.step;
    47         for(int i=head[p.k]; i!=-1; i=a[i].next)
    48         {
    49             if(!vis[a[i].k])
    50             {
    51                 r.k=a[i].k;
    52                 r.step=p.step+a[i].step;
    53                 q.push(r);
    54             }
    55         }
    56     }
    57     return 0;
    58 }
    59 int main()
    60 {
    61     int x,y,z,i;
    62     while(scanf("%d%d",&n,&t)!=EOF)
    63     {
    64         tol=0;
    65         memset(head,-1,sizeof(head));
    66         memset(vis,false,sizeof(vis));
    67         for(i=0; i<n; i++)
    68             scanf("%d%d%d",&x,&y,&z),add(x,y,z);
    69         printf("%d
    ",dij());
    70     }
    71     return 0;
    72 }
    View Code

    Spfa算法

    判负环(POJ1860)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<queue>
     6 using namespace std;
     7 int head[105];
     8 struct edge
     9 {
    10     double a,b;
    11     int k;
    12     int next;
    13 } aa[305];
    14 int tol;
    15 inline void add(int x,int y,double s1,double s2)
    16 {
    17     aa[tol].next=head[x];
    18     aa[tol].k=y;
    19     aa[tol].a=s1;
    20     aa[tol].b=s2;
    21     head[x]=tol++;
    22 }
    23 double dist[105];
    24 bool vis[105];
    25 int num[105];
    26 int n,m;
    27 int spfa(int x)
    28 {
    29     int i;
    30     queue<edge>q;
    31     edge p;
    32     p.k=x;
    33     q.push(p);
    34     while(!q.empty())
    35     {
    36         p=q.front();
    37         q.pop();
    38         vis[p.k]=false;
    39         for(i=head[p.k]; i!=-1; i=aa[i].next)
    40         {
    41             if(dist[aa[i].k]<(dist[p.k]-aa[i].b)*aa[i].a)
    42             {
    43                 dist[aa[i].k]=(dist[p.k]-aa[i].b)*aa[i].a;;
    44                 if(!vis[aa[i].k])
    45                 {
    46                     vis[aa[i].k]=true;
    47                     num[aa[i].k]++;
    48                     q.push(aa[i]);
    49                     if(num[aa[i].k]>=n)
    50                         return 1;
    51                 }
    52             }
    53         }
    54     }
    55     return 0;
    56 }
    57 int main()
    58 {
    59     int i,j,s,t;
    60     int x,y;
    61     double s1,s2,s3,s4,v;
    62     while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF)
    63     {
    64         tol=0;
    65         memset(vis,false,sizeof(vis));
    66         memset(dist,0,sizeof(dist));
    67         memset(head,-1,sizeof(head));
    68         memset(num,0,sizeof(num));
    69         for(i=0; i<m; i++)
    70         {
    71             scanf("%d%d%lf%lf%lf%lf",&x,&y,&s1,&s2,&s3,&s4);
    72             add(x,y,s1,s2);
    73             add(y,x,s3,s4);
    74         }
    75         dist[s]=v;
    76         if(spfa(s))
    77             printf("YES
    ");
    78         else
    79             printf("NO
    ");
    80     }
    81     return 0;
    82 }
    View Code

    Floyd算法

     1 void floyd()
     2 {
     3        int i,j,k;
     4        for(k=1;k<=N;k++)
     5               for(i=1;i<=N;i++)
     6                      for(j=1;j<=N;j++)
     7                             if(map[i][j]>map[i][k]+map[k][j])
     8                             {
     9                                    map[i][j]=map[i][k]+map[k][j];
    10                                    path[i][j]=path[i][k];
    11                             }
    12 }
    View Code

    Tarjan算法(19南昌邀请赛G)

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<set>
      4 #include<string>
      5 #include<cstring>
      6 #include<map>
      7 #include<stack>
      8 #include<algorithm>
      9 using namespace std;
     10 #define INF 0x3f3f3f3f
     11 int dfn[100005];
     12 int low[100005];
     13 int id[100005];
     14 int due[100005];
     15 struct node
     16 {
     17     int k;
     18     int next;
     19 } e[300005];
     20 int head[100005],tol;
     21 inline void add(int x,int y)
     22 {
     23     e[tol].next=head[x];
     24     e[tol].k=y;
     25     head[x]=tol++;
     26 }
     27 bool vis[100005];
     28 stack<int>st;
     29 int tot,cnt;
     30 struct ss
     31 {
     32     int no;
     33     int num;
     34 }a[100005];
     35 void Tarjan(int x)
     36 {
     37     low[x]=cnt;
     38     dfn[x]=cnt++;
     39     vis[x]=true;
     40     st.push(x);
     41     for(int i=head[x]; i!=-1; i=e[i].next)
     42     {
     43         if(!dfn[e[i].k])
     44         {
     45             Tarjan(e[i].k);
     46             low[x]=min(low[e[i].k],low[x]);
     47         }
     48         else if(vis[e[i].k])
     49         {
     50             low[x]=min(low[x],dfn[e[i].k]);
     51         }
     52     }
     53     int t;
     54     if(dfn[x]==low[x])
     55     {
     56         int k;
     57         do
     58         {
     59             k=st.top();
     60             st.pop();
     61             id[k]=tot;
     62             vis[k]=false;
     63         }
     64         while(k!=x);
     65         tot++;
     66     }
     67 }
     68 bool cmp(ss s1,ss s2)
     69 {
     70     return s1.num>s2.num;
     71 }
     72 int main()
     73 {
     74     int n,m;
     75     int out,in,x,y,i,t,j,ans,q;
     76     bool flag;
     77     while(scanf("%d%d",&n,&q)!=EOF)
     78     {
     79         memset(vis,false,sizeof(vis));
     80         memset(dfn,0,sizeof(dfn));
     81         memset(id,0,sizeof(id));
     82         memset(head,-1,sizeof(head));
     83         tol=0;
     84         tot=1;
     85         cnt=1;
     86         flag=true;
     87         stack<int>ss;
     88         swap(ss,st);
     89         for(i=1;i<=3;i++)
     90         {
     91             for(j=1;j<=n;j++)
     92             {
     93               scanf("%d",&a[j].num),a[j].no=j;
     94             }
     95             sort(a+1,a+n+1,cmp);
     96             for(j=2;j<=n;j++)
     97                 if(a[j-1].num>a[j].num)
     98                 add(a[j-1].no,a[j].no);
     99         }
    100         for(i=1; i<=n; i++)
    101             if(!id[i])
    102             {
    103                 Tarjan(i);
    104             }
    105         for(i=1; i<=n; i++)
    106         {
    107             for(j=head[i]; j!=-1; j=e[j].next)
    108             {
    109                 if(id[i]!=id[e[j].k])
    110                 {
    111                     due[id[e[j].k]]++;
    112                 }
    113             }
    114         }
    115         in=0;
    116         out=0;
    117         for(i=1; i<tot; i++)
    118         {
    119            if(due[i]==0)
    120            {
    121             out++;
    122             ans=i;
    123            }
    124         }
    125       for(i=1;i<=q;i++)
    126       {
    127           scanf("%d",&in);
    128           if(out>=2)
    129             printf("NO
    ");
    130           else if(due[id[in]]==0)
    131           {
    132               printf("YES
    ");
    133           }
    134           else
    135             printf("NO
    ");
    136       }
    137 
    138     }
    139 
    140 }
    View Code

    Prim算法(POJ1287)

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<queue>
     5 #include<cstdlib>
     6 using namespace std;
     7 int head[1005];
     8 #define INF 0x3f3f3f3f
     9 typedef long long ll;
    10 struct node
    11 {
    12     int k;
    13     int step;
    14     int next;
    15 } a[1000005];
    16 int tol;
    17 bool operator <(const node &x,const node &y)
    18 {
    19     return y.step<x.step;
    20 }
    21 int se=0;
    22 bool vis[105];
    23 int dist[1005];
    24 inline void add(int x,int y,int z)
    25 {
    26     a[tol].next=head[x];
    27     a[tol].k=y;
    28     a[tol].step=z;
    29     head[x]=tol++;
    30     a[tol].next=head[y];
    31     a[tol].k=x;
    32     a[tol].step=z;
    33     head[y]=tol++;
    34 }
    35 int n;
    36 int prim()
    37 {
    38     // printf("sss
    ");
    39     node r,p;
    40     p.step=0;
    41     int sum=0;
    42     p.k=1;
    43     priority_queue<node>q;
    44     q.push(p);
    45     dist[1]=0;
    46     while(!q.empty())
    47     {
    48         p=q.top();
    49         q.pop();
    50         if(vis[p.k])
    51             continue;
    52         // printf("p.k=%d %d
    ",p.k,p.step);
    53         vis[p.k]=true;
    54         sum+=p.step;
    55         for(int i=head[p.k]; i!=-1; i=a[i].next)
    56         {
    57             if(a[i].step<dist[a[i].k]&&!vis[a[i].k])
    58             {
    59                 dist[a[i].k]=a[i].step;
    60                 node r;
    61                 r.k=a[i].k;
    62                 r.step=a[i].step;
    63                 q.push(r);
    64             }
    65         }
    66     }
    67     return sum;
    68 }
    69 int main()
    70 {
    71     int x,y,z,i,t,j;
    72     int m;
    73     //  printf("%lld
    ",Fermat(1902382644,1e9+7));
    74     // freopen("in.txt","r",stdin);
    75     while(scanf("%d",&n)!=EOF&&n)
    76     {
    77         tol=0;
    78         scanf("%d",&m);
    79         memset(head,-1,sizeof(head));
    80         memset(vis,false,sizeof(vis));
    81         memset(dist,INF,sizeof(dist));
    82         for(i=1; i<=m; i++)
    83         {
    84            scanf("%d %d %d",&x,&y,&z);
    85            add(x,y,z);
    86         }
    87         //  printf("sss
    ");
    88         printf("%d
    ",prim());
    89     }
    90     return 0;
    91 }
    View Code

    Kruskal算法(POJ2421)

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<vector>
     4 #include<queue>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 int parent[105];
     9 struct node
    10 {
    11     int x,y;
    12     int step;
    13 }a[100005];
    14 int findroot(int x)
    15 {
    16     if(parent[x]!=x)
    17         parent[x]=findroot(parent[x]);
    18     return parent[x];
    19 }
    20 bool mergeroot(int x,int y)
    21 {
    22     int p1=findroot(x);
    23     int p2=findroot(y);
    24     if(p1==p2)
    25         return false;
    26    parent[p1]=p2;
    27    return true;
    28 }
    29 bool cmp(node s1,node s2)
    30 {
    31     return s1.step<s2.step;
    32 }
    33 int main()
    34 {
    35     int n,x,y;
    36     int m,i,j,ans,k;
    37     while(scanf("%d",&n)!=EOF)
    38     {
    39         for(i=1;i<=n;i++)
    40         {
    41            parent[i]=i;
    42         }
    43         k=0;
    44         for(i=1;i<=n;i++)
    45             for(j=1;j<=n;j++)
    46             scanf("%d",&a[k].step),a[k].x=i,a[k++].y=j;
    47             sort(a,a+k,cmp);
    48         ans=0;
    49         scanf("%d",&m);
    50         for(i=1;i<=m;i++)
    51             scanf("%d %d",&x,&y),mergeroot(x,y);
    52         for(i=0;i<k;i++)
    53         {
    54             if(mergeroot(a[i].x,a[i].y))
    55                 ans+=a[i].step;
    56         }
    57         printf("%d
    ",ans);
    58     }
    59     return 0;
    60 }
    View Code

    EdmondsKarp算法(HDU3549)

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<string>
      5 #include<iostream>
      6 #include<queue>
      7 using namespace std;
      8 typedef long long ll;
      9 #define INF 0x3f3f3f3f
     10 struct edge
     11 {
     12     int w;
     13     int k;
     14     int next;
     15 } e[2005];
     16 struct pre
     17 {
     18     int id;
     19     int node;
     20 } pre[2005];
     21 int head[1005];
     22 bool vis[1005];
     23 int tol;
     24 int n,m;
     25 inline void add(int x,int y,int w)
     26 {
     27     e[tol].next=head[x];
     28     e[tol].w=w;
     29     e[tol].k=y;
     30     head[x]=tol++;
     31 }
     32 void init()
     33 {
     34     tol=0;
     35     for(int i=1; i<=n; i++)
     36         head[i]=-1;
     37 }
     38 bool bfs(int x,int y)
     39 {
     40     queue<edge>q;
     41     int i,j;
     42     for(i=1; i<=n; i++)
     43         vis[i]=false;
     44     vis[x]=true;
     45     edge p,r;
     46     p.k=x;
     47     q.push(p);
     48     while(!q.empty())
     49     {
     50         p=q.front();
     51         q.pop();
     52         if(p.k==y)
     53             return true;
     54         for(i=head[p.k]; i!=-1; i=e[i].next)
     55         {
     56             if(!vis[e[i].k]&&e[i].w)
     57             {
     58                 pre[e[i].k].node=p.k;
     59                 pre[e[i].k].id=i;
     60                 vis[e[i].k]=true;
     61                 q.push(e[i]);
     62             }
     63         }
     64     }
     65     return false;
     66 }
     67 int EK(int x,int y)
     68 {
     69     int ans=0;
     70     while(bfs(x,y))
     71     {
     72         int xx=y;
     73         int minv=INF;
     74         while(xx!=x)
     75         {
     76             minv=min(minv,e[pre[xx].id].w);
     77             xx=pre[xx].node;
     78         }
     79         for(int i=n; i!=1; i=pre[i].node)
     80         {
     81             e[pre[i].id].w-=minv;
     82             e[pre[i].id^1].w+=minv;
     83         }
     84         ans+=minv;
     85     }
     86     return ans;
     87 }
     88 int main()
     89 {
     90     int t;
     91     int i,j,x,y,w,k=1;
     92     scanf("%d",&t);
     93     while(t--)
     94     {
     95         scanf("%d %d",&n,&m);
     96         init();
     97         for(i=1; i<=m; i++)
     98             scanf("%d%d%d",&x,&y,&w),add(x,y,w),add(y,x,0);
     99         printf("Case %d: %d
    ",k++,EK(1,n));
    100     }
    101     return 0;
    102 }
    View Code

    Dinic算法(HDU3549)

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<string>
      5 #include<iostream>
      6 #include<queue>
      7 using namespace std;
      8 typedef long long ll;
      9 #define INF 0x3f3f3f3f
     10 struct edge
     11 {
     12     int w;
     13     int k;
     14     int next;
     15     edge(int kk,int ww)
     16     {
     17         k=kk;
     18         w=ww;
     19     }
     20     edge() {}
     21 } e[2005];
     22 int head[1005];
     23 int dis[1005];
     24 bool vis[1005];
     25 int tol;
     26 int n,m;
     27 inline void add(int x,int y,int w)
     28 {
     29     e[tol].next=head[x];
     30     e[tol].w=w;
     31     e[tol].k=y;
     32     head[x]=tol++;
     33 }
     34 bool bfs(int s,int t)
     35 {
     36     int i,j;
     37     queue<int>q;
     38     for(i=1; i<=n; i++)
     39         dis[i]=0;
     40     q.push(s);
     41     dis[s]=1;
     42     while(!q.empty())
     43     {
     44         int x=q.front();
     45         q.pop();
     46         if(x==t)
     47             return true;
     48         for(i=head[x]; i!=-1; i=e[i].next)
     49         {
     50             if(e[i].w&&!dis[e[i].k])
     51             {
     52                 dis[e[i].k]=dis[x]+1;
     53                 q.push(e[i].k);
     54             }
     55         }
     56     }
     57     return false;
     58 }
     59 int dfs(int x,int t,int maxflow)
     60 {
     61     if(x==t)
     62         return maxflow;
     63     int ans=0;
     64     for(int i=head[x]; i!=-1; i=e[i].next)
     65     {
     66         if(dis[e[i].k]==dis[x]+1&&e[i].w&&maxflow>ans)
     67         {
     68             int tt=dfs(e[i].k,t,min(maxflow-ans,e[i].w));
     69             e[i].w-=tt;
     70             e[i^1].w+=tt;
     71             ans+=tt;
     72         }
     73     }
     74     return ans;
     75 }
     76 int Dinc(int s,int t)
     77 {
     78     int ans=0;
     79     while(bfs(s,t))
     80     {
     81         ans+=dfs(s,t,INF);
     82     }
     83     return ans;
     84 }
     85 int main()
     86 {
     87     int t;
     88     int i,j,x,y,w,k=1;
     89     scanf("%d",&t);
     90     while(t--)
     91     {
     92         scanf("%d %d",&n,&m);
     93         tol=0;
     94         for(i=1;i<=n;i++)head[i]=-1;
     95         for(i=1; i<=m; i++)
     96             scanf("%d%d%d",&x,&y,&w),add(x,y,w),add(y,x,0);
     97         printf("Case %d: %d
    ",k++,Dinc(1,n));
     98     }
     99     return 0;
    100 }
    View Code

    拓扑排序

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<string>
     6 #include<queue>
     7 using namespace std;
     8 struct node
     9 {
    10     int k;
    11     int next;
    12 } a[205];
    13 int head[105];
    14 int tol;
    15 inline void add(int x,int y)
    16 {
    17     a[tol].next=head[x];
    18     a[tol].k=y;
    19     head[x]=tol++;
    20 }
    21 int due[105];
    22 bool vis[105];
    23 int main()
    24 {
    25     int n,m,x,y,i,j,cnt,t;
    26     bool flag;
    27     while(scanf("%d%d",&n,&m)!=EOF)
    28     {
    29         memset(due,0,sizeof(due));
    30         memset(head,-1,sizeof(head));
    31         memset(vis,false,sizeof(vis));
    32         tol=0;
    33         for(i=0; i<m; i++)
    34             scanf("%d%d",&x,&y),due[y]++,add(x,y);
    35        flag=true;
    36        t=n;
    37        queue<int>q;
    38        for(i=1;i<=n;i++)
    39        {
    40            if(due[i]==0)
    41            {
    42                node p;
    43                q.push(i);
    44            }
    45        }
    46        while(!q.empty())
    47        {
    48            int p=q.front();
    49            q.pop();
    50            if(vis[p])
    51             continue;
    52             vis[p]=true;
    53            t--;
    54            for(i=head[p];i!=-1;i=a[i].next)
    55            {
    56                if(!vis[a[i].k])
    57                {
    58                    due[a[i].k]--;
    59                    if(!due[a[i].k])
    60                     q.push(a[i].k);
    61                }
    62            }
    63        }
    64      if(!t)
    65         printf("YES
    ");
    66      else
    67         printf("NO
    ");
    68     }
    69     return 0;
    70 }
    View Code

    树状数组

    1.树状数组单点修改(HDU1166)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<string>
     5 #include<algorithm>
     6 using namespace std;
     7 typedef long long ll;
     8 ll c[100005];
     9 ll m;
    10 ll lowbit(ll x)  // 2^k
    11 {
    12     return x&(-x);
    13 }
    14 void update(ll i, ll x)//i点增cs量为x
    15 {
    16     while(i <= m)
    17     {
    18         c[i] += x;
    19         i += lowbit(i);
    20     }
    21 }
    22 ll sum(ll x)//区间求和 [1,x]
    23 {
    24     ll sum=0;
    25     while(x>0)
    26     {
    27         sum+=c[x];
    28         x-=lowbit(x);
    29     }
    30     return sum;
    31 }
    32 
    33 ll Getsum(ll x1,ll x2) //求任意区间和
    34 {
    35     return sum(x2) - sum(x1-1);
    36 }
    37 int main()
    38 {
    39     ll i,j,t;
    40     ll n;
    41     ll op,a1,a2,r,sb;
    42     scanf("%lld",&t);
    43     string q;
    44     ll p=0;
    45     while(t--)
    46     {
    47         scanf("%lld",&m);
    48   p++;
    49   memset(c,0,sizeof(c));
    50 
    51 printf("Case %lld:
    ",p);
    52         for(i=1;i<=m;i++)
    53             {
    54                 scanf("%lld",&r);
    55                 update(i,r);
    56             }
    57              while(cin>>q&&q!="End")
    58              {
    59                  scanf("%lld %lld",&a1,&a2);
    60                  if(q=="Query")
    61                     printf("%lld
    ",Getsum(a1,a2));
    62                  else if(q=="Add")
    63                  {
    64                      update(a1,a2);
    65                  }
    66                  else
    67                     update(a1,-1*a2);
    68              }
    69 
    70     }
    71     return 0;
    72 }
    View Code

    2.树状数组区间修改

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<vector>
     7 #include<set>
     8 #define ll long long
     9 using namespace std;
    10 const int MAXN = 100100;
    11 ll c1[MAXN],c2[MAXN],num[MAXN];
    12 int n;
    13 ll lowbit(ll x)
    14 {
    15     return x & -x;
    16 }
    17 
    18 ll sigma(ll *a,ll pos)
    19 {
    20     ll ans = 0;
    21     while(pos)
    22     {
    23         ans += a[pos];
    24         pos -= lowbit(pos);
    25     }
    26     return ans;
    27 }
    28 
    29 void add(ll a[],int pos, ll num)
    30 {
    31     while(pos < MAXN)
    32     {
    33         a[pos] += num;
    34         pos += lowbit(pos);
    35     }
    36     return ;
    37 }
    38 
    39 int main()
    40 {
    41     scanf("%d",&n);
    42     for(int i = 1; i <= n; i++)
    43     {
    44         scanf("%I64d",num+i);
    45         add(c1,i,num[i] - num[i-1]);
    46         add(c2,i,(i-1)*(num[i]-num[i-1]));
    47     }
    48     //首先进行区间的更新操作
    49     ll l,r,v;
    50     scanf("%I64d%I64d%I64d",&l,&r,&v);
    51     add(c1,l,v);
    52     add(c1,r+1,-v);
    53     add(c2,l,v*(l-1));
    54     add(c2,r+1,-v*r);
    55     //然后进行区间求和操作
    56     scanf("%I64d%I64d",&l,&r);
    57     ll sum1 = (l-1)*sigma(c1,l-1) - sigma(c2,l-1);
    58     ll sum2 = r *sigma(c1,r) - sigma(c2,r);
    59     printf("%I64d
    ",sum2 - sum1);
    60 
    61 }
    View Code

    线段树

    1.线段树+离散化处理(POJ2528)

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #define il inline
      6 #define ull unsigned long long
      7 #define ll long long
      8 #define ls (u<<1)
      9 //等价于u*2
     10 #define rs (u<<1|1)
     11 //等价于u*2+1
     12 #define INF 0x3f3f3f3f
     13 using namespace std;
     14 const int maxn = 200000+7;
     15 int n,m;
     16 int hash1[10000005];
     17 int r[100005];
     18 int l[100005];
     19 int a[600005];
     20 struct node
     21 {
     22     int l,r;
     23     bool flag;
     24 } tree[1600005];
     25 void build(int u, int l, int r)
     26 {
     27     tree[u].l = l;
     28     tree[u].r = r;
     29   //  printf("u=%lld l=%lld r=%lld
    ")
     30     tree[u].flag=false;
     31     if(l==r)
     32     {
     33        //tree[u].flag=false;
     34         return ;
     35     }
     36     ll mid = (l+r) >> 1;
     37     build(ls,l,mid);
     38     build(rs,mid+1,r);
     39   //  pushup(u);
     40 }
     41 inline void pushup(int u)
     42 {
     43     tree[u].flag=tree[ls].flag&&tree[rs].flag;
     44 }
     45 inline void pushdown(int u)
     46 {
     47     tree[ls].flag=tree[rs].flag;
     48 }
     49 void update(int u, int l, int r)
     50 {
     51   // printf("u=%lld l=%lld r=%lld
    ",u,tree[u].l,tree[u].r);
     52     ll mid=(tree[u].l+tree[u].r)>>1;
     53     if(tree[u].flag)
     54         return;
     55     if(tree[u].l>=l&&tree[u].r<=r)
     56     {
     57        // printf("l=%lld r=%lld
    ",tree[u].l,tree[u].r);
     58         tree[u].flag=true;
     59         // tree[u].
     60         return ;
     61     }
     62     if(l<=mid)
     63         update(ls,l,r);
     64     if(r>mid)
     65         update(rs,l,r);
     66        pushup(u);
     67 }
     68 bool query(int u, int l, int r)
     69 {
     70     if(tree[u].flag)
     71         return true;
     72     if(l<=tree[u].l&&r>=tree[u].r)
     73     {
     74         return tree[u].flag;
     75     }
     76    // if(tree[u].lazy)
     77    // pushdown(u);
     78     ll mid=(tree[u].l+tree[u].r)>>1;
     79     bool flag=true;
     80     if(r>mid)
     81        flag=flag&&query(rs,l,r);
     82     if(l<=mid)
     83         flag=flag&&query(ls,l,r);
     84     return flag;
     85 }
     86 
     87 int main()
     88 {
     89     int i,t,k=0,cnt,s,ans;
     90     scanf("%d",&t);
     91     while(t--)
     92     {
     93     k=0;
     94     scanf("%d",&n);
     95     for(i=0;i<n;i++)
     96     {
     97         scanf("%d%d",&l[i],&r[i]);
     98         a[k++]=l[i]-1;
     99         a[k++]=l[i];
    100         a[k++]=l[i]+1;
    101         a[k++]=r[i]-1;
    102         a[k++]=r[i];
    103         a[k++]=r[i]+1;
    104     }
    105     ans=0;
    106     sort(a,a+k);
    107     k=unique(a,a+k)-a;
    108     for(i=0;i<k;i++)
    109         {
    110             hash1[a[i]]=i;
    111           //printf("hash=%lld i=%lld
    ",a[i],i);
    112         }
    113     build(1,0,k-1);
    114     for(i=n-1;i>=0;i--)
    115     {
    116         if(!query(1,hash1[l[i]],hash1[r[i]]))
    117             update(1,hash1[l[i]],hash1[r[i]]),ans++;
    118          //   printf("ans=%lld
    ",ans);
    119     }
    120     printf("%d
    ",ans);
    121     }
    122 return 0;
    123 }
    View Code

    2. 线段树+dfs序(HDU3974)

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stack>
      6 #define ls (u<<1)
      7 #define rs (u<<1|1)
      8 #define INF 0x3f3f3f3f
      9 using namespace std;
     10 typedef int ll;
     11 struct node
     12 {
     13     ll l,r;
     14     ll lazy;
     15     ll data;
     16 } tree[400005];
     17 struct edge
     18 {
     19     ll k;
     20     ll next;
     21 } a[50005];
     22 inline void pushdown(ll u)
     23 {
     24     tree[ls].lazy=tree[rs].lazy=tree[u].lazy;
     25     tree[ls].data=tree[rs].data=tree[u].lazy;
     26     tree[u].lazy=0;
     27 }
     28 void build(ll u, ll l, ll r)
     29 {
     30     tree[u].l = l;
     31     tree[u].r = r;
     32     tree[u].lazy=0;
     33     tree[u].data=-1;
     34     if(l==r)
     35     {
     36         return ;
     37     }
     38     ll mid = (l+r) >> 1;
     39     build(ls,l,mid);
     40     build(rs,mid+1,r);
     41 }
     42 void update(ll u, ll l,ll r,ll c)
     43 {
     44 
     45     ll mid=(tree[u].l+tree[u].r)>>1;
     46     if(tree[u].l>=l&&tree[u].r<=r)
     47     {
     48         tree[u].data=c;
     49         tree[u].lazy=c;
     50         return ;
     51     }
     52     if(tree[u].lazy)
     53         pushdown(u);
     54     if(l<=mid)
     55         update(ls,l,r,c);
     56     if(r>mid)
     57         update(rs,l,r,c);
     58 }
     59 ll query(ll u, ll x)
     60 {
     61     if(tree[u].l==x&&tree[u].r==x)
     62     {
     63         return tree[u].data;
     64     }
     65     if(tree[u].lazy)
     66         pushdown(u);
     67     ll mid=(tree[u].l+tree[u].r)>>1;
     68     if(x<=mid)
     69         return query(ls,x);
     70     if(x>mid)
     71         return  query(rs,x);
     72 }
     73 ll p,tol;
     74 ll in[50005];
     75 ll out[50005];
     76 ll head[50005];
     77 inline void add(ll x,ll y)
     78 {
     79     a[tol].next=head[x];
     80     a[tol].k=y;
     81     head[x]=tol++;
     82 }
     83 void dfs(ll u)
     84 {
     85     in[u]=++p;
     86     for(ll i=head[u]; i!=-1; i=a[i].next)
     87         dfs(a[i].k);
     88     out[u]=p;
     89 }
     90 bool vis[50005];
     91 int main()
     92 {
     93     ll t=1,w;
     94     ll l,r,q,k,m,i;
     95     ll n;
     96     ll tol;
     97     char c;
     98     scanf("%d",&w);
     99     while(w--)
    100     {
    101         tol=0;
    102         scanf("%d",&n);
    103         memset(head,-1,sizeof(head));
    104         memset(vis,false,sizeof(vis));
    105         for(i=0; i<n-1; i++)
    106         {
    107             scanf("%d%d",&l,&r);
    108             add(r,l);
    109             vis[l]=true;
    110         }
    111         p=0;
    112        for(i=1; i<=n; i++)
    113             if(!vis[i])
    114             {
    115                 dfs(i);
    116                 break;
    117             }
    118             build(1,1,n);
    119         printf("Case #%d:
    ",t++);
    120         scanf("%d",&m);
    121         while(m--)
    122         {
    123             cin>>c;
    124             scanf("%d",&k);
    125             getchar();
    126             if(c=='T')
    127             {
    128                 scanf("%d",&q);
    129                 getchar();
    130                 update(1,in[k],out[k],q);
    131             }
    132             else
    133             {
    134                 printf("%d
    ",query(1,in[k]));
    135             }
    136         }
    137     }
    138     return 0;
    139 } 
    View Code

     3.线段树+扫描线(HDU1255)

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stack>
      6 #define ls (u<<1)
      7 #define rs (u<<1|1)
      8 #define INF 0x3f3f3f3f
      9 using namespace std;
     10 struct node
     11 {
     12     int l,r;
     13     int cover;
     14 } tree[400005];
     15 struct edge
     16 {
     17     double l,r;
     18     double y;
     19     int t;
     20 } e[5005];
     21 bool cmp(edge x1,edge x2)
     22 {
     23     return x1.y<x2.y;
     24 }
     25 double s[2005];
     26 void build(int u, int l, int r)
     27 {
     28     tree[u].l = l;
     29     tree[u].r = r;
     30     tree[u].cover=0;
     31     if(l==r)
     32     {
     33         return ;
     34     }
     35     int mid = (l+r) >> 1;
     36     build(ls,l,mid);
     37     build(rs,mid+1,r);
     38 }
     39 inline void pushup(int u)
     40 {
     41     int k=min(tree[ls].cover,tree[rs].cover);
     42     tree[u].cover+=k;
     43     tree[ls].cover-=k;
     44     tree[rs].cover-=k;
     45 }
     46 inline pushdown(int u)
     47 {
     48     tree[ls].cover+=tree[u].cover;
     49     tree[rs].cover+=tree[u].cover;
     50     tree[u].cover=0;
     51 }
     52 void update(int u, int l,int r,int t)
     53 {
     54     int mid=(tree[u].l+tree[u].r)>>1;
     55     if(tree[u].l>=l&&tree[u].r<=r)
     56     {
     57         tree[u].cover+=t;
     58         return;
     59     }
     60  if(tree[u].cover&&tree[u].l!=tree[u].r)
     61       pushdown(u);
     62     if(l<=mid)
     63         update(ls,l,r,t);
     64     if(r>mid)
     65         update(rs,l,r,t);
     66     pushup(u);
     67 }
     68 double query(int u,int l,int r)
     69 {
     70     int mid=(tree[u].l+tree[u].r)>>1;
     71     if(tree[u].l>=l&&tree[u].r<=r&&tree[u].cover>=2)
     72     {
     73         return s[tree[u].r+1]-s[tree[u].l];
     74     }
     75     if(tree[u].l==tree[u].r)
     76         return 0;
     77     if(tree[u].cover&&tree[u].l!=tree[u].r)
     78         pushdown(u);
     79     double asb=0;
     80     if(l<=mid)
     81         asb+=query(ls,l,r);
     82     if(r>mid)
     83         asb+=query(rs,l,r);
     84     return asb;
     85 }
     86 int main()
     87 {
     88     int n;
     89     int t=0;
     90     int tol,i,k,j;
     91     int pos1,pos2;
     92     double x1,x2,y1,y2;
     93     double ans;
     94     scanf("%d",&t);
     95     while(t--)
     96     {
     97         scanf("%d",&n);
     98         tol=0;
     99         ans=0;
    100         for(i=0; i<n; i++)
    101         {
    102             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
    103             s[tol]=x1;
    104             s[tol+1]=x2;
    105             e[tol].r=x2;
    106             e[tol].l=x1;
    107             e[tol].y=y1;
    108             e[tol].t=1;
    109             e[tol+1].r=x2;
    110             e[tol+1].l=x1;
    111             e[tol+1].y=y2;
    112             e[tol+1].t=-1;
    113             tol+=2;
    114         }
    115         sort(e,e+tol,cmp);
    116         sort(s,s+tol);
    117         k=unique(s,s+tol)-s;
    118         build(1,0,k-1);
    119         for(i=0; i<tol-1; i++)
    120         {
    121             pos1=lower_bound(s,s+k,e[i].l)-s;
    122             pos2=lower_bound(s,s+k,e[i].r)-s-1;
    123             update(1,pos1,pos2,e[i].t);
    124             double sb=query(1,0,k-1);
    125             ans+=sb*(e[i+1].y-e[i].y);
    126         printf("%.2f
    ",ans);
    127     }
    128     return 0;
    129 }
    View Code

     主席树(POJ2104)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 typedef int ll;
     7 struct node
     8 {
     9     ll l,r;
    10     ll ls,rs;
    11     ll sum;
    12 } tree[2000005];
    13 ll rt[100005];
    14 ll tol;
    15 ll a[100005];
    16 ll b[100005];
    17 void build(ll &u,ll l,ll r)
    18 {
    19     u=tol++;
    20     tree[u].l=l;
    21     tree[u].r=r;
    22     tree[u].sum=0;
    23     ll mid=(tree[u].l+tree[u].r)>>1;
    24     if(tree[u].r==tree[u].l)
    25         return;
    26     build(tree[u].ls,l,mid);
    27     build(tree[u].rs,mid+1,r);
    28 }
    29 void update(ll p,ll &u,ll x)
    30 {
    31     u=tol++;
    32     tree[u].l=tree[p].l;
    33     tree[u].r=tree[p].r;
    34     tree[u].ls=tree[p].ls;
    35     tree[u].rs=tree[p].rs;
    36     ll mid=(tree[u].l+tree[u].r)>>1;
    37     tree[u].sum=tree[p].sum;
    38     tree[u].sum++;
    39     if(tree[u].l==tree[u].r)
    40         return;
    41     if(x>mid)
    42         update(tree[p].rs,tree[u].rs,x);
    43     else
    44         update(tree[p].ls,tree[u].ls,x);
    45 }
    46 ll query(ll u,ll v,ll k)
    47 {
    48     ll mid=(tree[u].l+tree[u].r)>>1;
    49     ll sum=tree[tree[v].ls].sum-tree[tree[u].ls].sum;
    50     ll ans;
    51     if(tree[u].l==tree[u].r)
    52     {
    53         return tree[u].l;
    54     }
    55     if(sum>=k)
    56     {
    57         ans=query(tree[u].ls,tree[v].ls,k);
    58     }
    59     else
    60     {
    61         ans=query(tree[u].rs,tree[v].rs,k-sum);
    62     }
    63     return ans;
    64 }
    65 int main()
    66 {
    67     tol=0;
    68     ll n,m,s,i,j,l,r,k;
    69     while(scanf("%d %d",&n,&m)!=EOF)
    70     {
    71         for(i=1; i<=n; i++)
    72             scanf("%d",&a[i]),b[i]=a[i];
    73         sort(b+1,b+n+1);
    74         s=unique(b+1,b+n+1)-(b+1);
    75         tol=0;
    76         build(rt[0],1,s);
    77         for(i=1; i<=n; i++)
    78         {
    79             ll pos=lower_bound(b+1,b+s+1,a[i])-(b);
    80             update(rt[i-1],rt[i],pos);
    81         }
    82         for(i=1;i<=m;i++)
    83         {
    84             scanf("%d %d %d",&l,&r,&k);
    85             s=query(rt[l-1],rt[r],k);
    86            printf("%d
    ",b[s]);
    87         }
    88     }
    89     return 0;
    90 }
    View Code

    树链剖分+经典线段树(HDU2586)

      1 #include<iostream>
      2 #include<vector>
      3 #include<algorithm>
      4 #include<string>
      5 #include<map>
      6 #include<cstring>
      7 #include<cstdio>
      8 using namespace std;
      9 struct node
     10 {
     11     int k;
     12     int w;
     13     int next;
     14 } ed[80005];
     15 int head[40005];
     16 int tol,n;
     17 int maxi[40005<<2];
     18 inline void pushup(int u)
     19 {
     20     maxi[u]=maxi[u<<1]+maxi[u<<1|1];
     21 }
     22 void update(int u,int x,int l,int r,int num)
     23 {
     24     int mid=(l+r)>>1;
     25     if(l==r)
     26     {
     27         maxi[u]=num;
     28         return;
     29     }
     30     if(x<=mid)
     31         update(u<<1,x,l,mid,num);
     32     else
     33         update(u<<1|1,x,mid+1,r,num);
     34     pushup(u);
     35 }
     36 int query(int u,int l,int r,int L,int R)
     37 {
     38     if(L<=l&&r<=R)
     39     {
     40         return maxi[u];
     41     }
     42     int mid=(l+r)>>1;
     43     int ans=0;
     44     if(L<=mid)
     45     {
     46         ans+=query(u<<1,l,mid,L,R) ;
     47     }
     48     if(R>mid)
     49     {
     50         ans+=query(u<<1|1,mid+1,r,L,R) ;
     51     }
     52     return  ans;
     53 }
     54 inline void add(int x,int y,int w)
     55 {
     56     ed[tol].k=y;
     57     ed[tol].next=head[x];
     58     ed[tol].w=w;
     59     head[x]=tol++;
     60     ed[tol].k=x;
     61     ed[tol].next=head[y];
     62     ed[tol].w=w;
     63     head[y]=tol++;
     64 }
     65 int fa[40005];
     66 int son[40005];
     67 int size[40005];
     68 int depth[40005];
     69 int id[40005];
     70 int cnt;
     71 int top[40005];
     72 int pre[40005];
     73 void dfs1(int x,int d,int f)
     74 {
     75     depth[x]=d;
     76     fa[x]=f;
     77     son[x]=0;
     78     size[x]=1;
     79     int i;
     80     for(i=head[x]; i!=-1; i=ed[i].next)
     81     {
     82         if(ed[i].k!=f)
     83         {
     84             pre[ed[i].k]=ed[i].w;
     85             dfs1(ed[i].k,d+1,x);
     86             size[x]+=size[ed[i].k];
     87         }
     88         if(ed[i].k!=f&&(!son[x]||size[ed[i].k]>size[son[x]]))
     89             son[x]=ed[i].k;
     90     }
     91 }
     92 void dfs2(int x,int topf)
     93 {
     94     top[x]=topf;
     95     id[x]=++cnt;
     96     update(1,cnt,1,n,pre[x]);
     97     if(!son[x])
     98         return;
     99     int k;
    100     dfs2(son[x],topf);
    101     for(int i=head[x]; i!=-1; i=ed[i].next)
    102     {
    103         if(ed[i].k!=son[x]&&ed[i].k!=fa[x])
    104         {
    105             dfs2(ed[i].k,ed[i].k);
    106         }
    107         if(ed[i].k=son[x])
    108             k=ed[i].w;
    109     }
    110 }
    111 int main()
    112 {
    113     int m,x,y,w,i,s,f1,f2,t;
    114     scanf("%d",&t);
    115     while(t--)
    116     {
    117         tol=0;
    118         scanf("%d %d",&n,&m);
    119         memset(head,-1,sizeof(head));
    120         memset(size,0,sizeof(size));
    121         memset(maxi,0,sizeof(maxi));
    122         for(i=0; i<n-1; i++)
    123             scanf("%d%d%d",&x,&y,&w),add(x,y,w);
    124         cnt=0;
    125         pre[1]=0;
    126         dfs1(1,1,1);
    127         dfs2(1,1);
    128         for(i=0; i<m; i++)
    129         {
    130             scanf("%d%d",&x,&y);
    131             s=0;
    132             while(top[x]!=top[y])
    133             {
    134                 if(depth[top[x]]>depth[top[y]])
    135                 {
    136                     s+=query(1,1,n,id[top[x]],id[x]);
    137                     x=fa[top[x]];
    138                 }
    139                 else
    140                 {
    141                     s+=query(1,1,n,id[top[y]],id[y]);
    142                     y=fa[top[y]];
    143                 }
    144             }
    145             if(depth[x]>depth[y])
    146             {
    147                 s+=query(1,1,n,id[y]+1,id[x]);
    148             }
    149             else if(depth[x]<depth[y])
    150             {
    151                 s+=(query(1,1,n,id[x]+1,id[y]));
    152             }
    153             printf("%d
    ",s);
    154         }
    155     }
    156     return 0;
    157 }
    View Code

    莫队+dfs序(18年东北赛E HDU6504)

      1 #include<iostream>
      2 #include<string>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<cstdio>
      7 using namespace std;
      8 int head[100005];
      9 struct node
     10 {
     11     int k;
     12     int next;
     13 }a[200005];
     14 struct node1
     15 {
     16     int index;
     17     int l,r;
     18     int w;
     19 } ss[200005];
     20 int tol=0;
     21 inline void add(int x,int y)
     22 {
     23     a[tol].next=head[x];
     24     a[tol].k=y;
     25     head[x]=tol++;
     26     a[tol].next=head[y];
     27     a[tol].k=x;
     28     head[y]=tol++;
     29 }
     30 int in[200005];
     31 int out[200005];
     32 bool vis[100005];
     33 int aa[200005];
     34 int b[200005];
     35 int p;
     36 void dfs(int x)
     37 {
     38     in[x]=++p;
     39     b[p]=aa[x];
     40     for(int i=head[x]; i!=-1; i=a[i].next)
     41     {
     42         if(!vis[a[i].k])
     43         {
     44             vis[a[i].k]=true;
     45             dfs(a[i].k);
     46         }
     47     }
     48     out[x]=p;
     49 }
     50 int block;
     51 bool cmp(node1 s1,node1 s2)
     52 {
     53     if((s1.l/block)==(s2.l/block))
     54     {
     55         return s1.r<s2.r;
     56     }
     57     return s1.l<s2.l;
     58 }
     59 bool cmp1(node1 s1,node1 s2)
     60 {
     61     return s1.index<s2.index;
     62 }
     63 int cnt=0;
     64 int num[100005];
     65 inline void add(int x)
     66 {
     67     cnt+=num[x]==0;//if判断可能会tle
     68     num[x]++;
     69 }
     70 inline void del(int x)
     71 {
     72     cnt-=num[x]==1;//if判断可能会tle
     73     num[x]--;
     74 }
     75 int main()
     76 {
     77     int n,i,l,r,maxi;
     78     while(scanf("%d",&n)!=EOF)
     79     {
     80         tol=0;
     81         for(i=1; i<=n; i++)
     82             head[i]=-1,vis[i]=false;
     83             memset(num,0,sizeof(num));
     84         for(i=2; i<=n; i++)
     85             scanf("%d",&p),add(p,i);
     86         for(i=1; i<=n; i++)
     87             scanf("%d",&aa[i]);
     88         p=0;
     89         cnt=0;
     90         block=sqrt(n);
     91         vis[1]=true;
     92         dfs(1);
     93         for(i=1;i<=n;i++)
     94         {
     95             b[i+n]=b[i];
     96         }
     97         for(i=1; i<=n; i++)
     98             ss[i].l=in[i],ss[i].r=out[i],ss[i].index=i,ss[i+n].l=out[i]+1,ss[i+n].r=n+in[i]-1,ss[i+n].index=i+n;
     99             sort(ss+1,ss+2*n+1,cmp);
    100             r=2*n;
    101             for(i=1;i<=2*n;i++)
    102                 add(b[i]);
    103             l=1;
    104             for(i=1;i<=2*n;i++)
    105             {
    106                 while(l<ss[i].l)
    107                     del(b[l++]);
    108                 while(r>ss[i].r)
    109                     del(b[r--]);
    110                 while(l>ss[i].l)
    111                     add(b[--l]);
    112                 while(r<ss[i].r)
    113                     add(b[++r]);
    114                 ss[i].w=cnt;
    115             }
    116             sort(ss+1,ss+2*n+1,cmp1);
    117             maxi=0;
    118             for(i=2;i<=n;i++)
    119                 maxi=max(maxi,ss[i].w+ss[i+n].w);
    120                 printf("%d
    ",maxi);
    121     }
    122     return 0;
    123 }
    View Code

    st表

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 int a[1010];//原始输入数组
     5 int st[1010][20];//st表
     6 void init(int n)
     7 {
     8     for (int i = 0; i < n; i++)
     9         st[i][0] = a[i];
    10 
    11     for (int i = 1; (1 << i) <= n; i++)
    12     {
    13         for (int j = 0; j + (1 << i) - 1 < n; j++)
    14             st[j][i] = min(st[j][i - 1],st[j + (1 << (i - 1))][i - 1]);
    15     }
    16 }
    17 int search(int l, int r)
    18 {
    19     int k = (int)(log((double)(r - l + 1)) / log(2.0));
    20     return min(st[l][k],st[r - (1 << k) + 1][k]);
    21 }
    22 int main()
    23 {
    24     int n,m;
    25     while (cin >> n >> m)
    26     {
    27         for (int i = 0; i < n; i++)
    28             cin >> a[i];
    29         init(n);
    30         while (m--)
    31         {
    32             int l, r;
    33             cin >> l >> r;
    34             cout << search(l,r) << endl;;
    35         }
    36     }
    37     return 0;
    38 }
    View Code

    multiset的应用(19牛客多校第六场D)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<set>
     6 using namespace std;
     7 typedef long long ll;
     8 multiset<int>st;
     9 int a[1005];
    10 int b[1005];
    11 multiset<int> init(int n)
    12 {
    13     multiset<int>p;
    14     for(int i=1; i<=n; i++)
    15         p.insert(a[i]);
    16     return p;
    17 }
    18 bool check(int x,int k)
    19 {
    20     multiset<int>p=st;
    21     multiset<int>::iterator it;
    22     for(int i=1; i<=k; i++)
    23     {
    24         int t=x;
    25         it=p.upper_bound(t);
    26         while(p.size()!=0&&(it!=(p.begin())))
    27         {
    28             it--;
    29             t-=*it;
    30             p.erase(it);
    31             it=p.upper_bound(t);
    32         }
    33     }
    34     if(p.size()==0)
    35         return true;
    36     else
    37         return false;
    38 }
    39 int main()
    40 {
    41     int t;
    42     int n,k,i,l,r,mid,kk=0,sum=0;
    43     scanf("%d",&t);
    44     while(t--)
    45     {
    46         scanf("%d%d",&n,&k);
    47         st.clear();
    48         mid=0;
    49         sum=0;
    50         for(i=1; i<=n; i++)
    51             scanf("%d",&a[i]),mid=max(mid,a[i]),sum+=a[i];
    52         st=init(n);
    53         mid=max(mid,sum/k);
    54             while(!check(mid,k))
    55                 mid++;
    56         printf("Case #%d: %d
    ",++kk,mid);
    57     }
    58     return 0;
    59 }
    View Code

    kmp

    注意这里是int平常应该是char(HDU1711)

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<string>
     5 #include<algorithm>
     6 using namespace std;
     7 int s1[1000005];
     8 int s2[1000005];
     9 int next1[10005];
    10 int kmp(int a[],int len1,int b[],int len2)
    11 {
    12    // int next[105];
    13     next1[0]=-1;
    14     next1[1]=0;
    15     int i=2,j=0;
    16     while(i<len2)
    17     {
    18         if(b[i-1]==b[j])
    19         {
    20             next1[i++]=++j;
    21         }
    22         else if(next1[j]==-1)
    23         {
    24             next1[i++]=0;
    25         }
    26         else
    27             j=next1[j];
    28     }
    29     i=0;
    30     j=0;
    31     while(i<len1&&j<len2)
    32     {
    33         if(a[i]==b[j])
    34             i++,j++;
    35         else if(next1[j]==-1)
    36         {
    37             i++;
    38         }
    39         else
    40             j=next1[j];
    41     }
    42     return j==len2?i-j+1:-1;
    43 }
    44 int main()
    45 {
    46     int n,m,i,t;
    47     scanf("%d",&t);
    48     while(t--)
    49     {
    50         scanf("%d%d",&n,&m);
    51         for(i=0; i<n; i++)
    52             scanf("%d",&s1[i]);
    53         for(i=0; i<m; i++)
    54             scanf("%d",&s2[i]);
    55         printf("%d
    ",kmp(s1,n,s2,m));
    56     }
    57     return 0;
    58 }
    View Code

    字典树(HDU1251)

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<string.h>
     4 using namespace std;
     5 struct node
     6 {
     7     int next[27];
     8     int v;
     9     int init()
    10     {
    11         v=0;
    12         memset(next,-1,sizeof(next));
    13     }
    14 }a[1000005];
    15 int tol=0;
    16 int ans=0;
    17 void add(char s[],int len)
    18 {
    19     int now=0;
    20     for(int i=0;i<len;i++)
    21     {
    22         int tmp=s[i]-'a';
    23         if(a[now].next[tmp]==-1)
    24         {
    25             a[now].next[tmp]=++tol;
    26             a[tol].init();
    27         }
    28         now=a[now].next[tmp];
    29         a[now].v++;
    30     };
    31 }
    32 int query(char s[],int len)
    33 {
    34     int now=0;
    35 
    36     for(int i=0;i<len;i++)
    37     {
    38         int tmp=s[i]-'a';
    39         if(a[now].next[tmp]==-1)
    40             return 0;
    41             now=a[now].next[tmp];
    42     }
    43     return a[now].v;
    44 }
    45 char s[100];
    46 int main()
    47 {
    48     int k;
    49     a[0].init();
    50     while(gets(s))
    51     {
    52         k=strlen(s);
    53         if(k==0)
    54             break;
    55          add(s,k);
    56     }
    57     while(gets(s))
    58     {
    59         k=strlen(s);
    60         printf("%d
    ",query(s,k));
    61     }
    62     return 0;
    63 }
    View Code

    manacher算法(洛谷3805)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #define maxn 11000005
     7 using namespace std;
     8 int len[maxn<<1];
     9 char s[maxn],tmp[maxn<<1];
    10 
    11 inline int init(char *p){
    12     int n=strlen(p);
    13     tmp[0]='@';
    14     for(int i=1;i<=2*n;i+=2){
    15         tmp[i]='#',tmp[i+1]=p[i/2];
    16     }
    17     tmp[2*n+1]='#'; tmp[2*n+2]='$';
    18     return 2*n+1;
    19 }
    20 
    21 inline int Manacher(char *p,int n){
    22     int mx=0,pos=0,ans=0;
    23     for(int i=1;i<=n;i++){
    24         if(mx>i) len[i]=min(mx-i,len[2*pos-i]);//i被mx覆盖了 
    25         else len[i]=1;
    26         while(p[i-len[i]]==p[i+len[i]]) len[i]++;//左右扩展 
    27         if(len[i]+i>mx) mx=len[i]+i,pos=i;//更新 
    28         ans=max(ans,len[i]-1);
    29     }
    30     return ans;
    31 }
    32 
    33 int main(){
    34     scanf("%s",s); int m=init(s);
    35     printf("%d
    ",Manacher(tmp,m));
    36     return 0;
    37 }
    View Code

    并查集

     1 int findroot(int x)
     2 {
     3     if(x!=parent[x])
     4     {
     5         parent[x]=findroot(parent[x]);
     6     }
     7     return parent[x];
     8 }
     9 void mergeroot(int a,int b)
    10 {
    11     int p1=findroot(a);
    12     int p2=findroot(b);
    13     parent[p1]=p2;
    14 }
    View Code

    快速乘

    1 inline ll ksc(ll x,ll y,ll p){//计算x乘y的积
    2     ll res=0;//加法初始化
    3     while(y){
    4         if(y&1)res=(res+x)%p;//模仿二进制
    5         x=(x<<1)%p; y>>=1;//将x不断乘2达到二进制
    6     }return res;
    7 }
    8 // ll 表示 long long
    View Code
    1 inline ll ksc(ll x,ll y,ll p){
    2     ll z=(ld)x/p*y;
    3     ll res=(ull)x*y-(ull)z*p;
    4     return (res+p)%p;
    5 }
    6 // ll 表示 long long
    7 // ld 表示 long double
    8 // ull 表示 usigned long long
    9 // 一种自动溢出的数据类型(存满了就会自动变为0)
    View Code

    单调队列(19牛客多校第三场F)

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 using namespace std;
     6 typedef long long ll;
     7 #define INF 100000000
     8 int mx[505],mi[505];
     9 int q1[505];
    10 int q2[505];
    11 int a[505][505];
    12 int main()
    13 {
    14     int n,m,i,j,ans,q11,q21,q12,q22,k,last1,last2;
    15     int t;
    16     scanf("%d",&t);
    17     while(t--)
    18     {
    19         scanf("%d%d",&n,&m);
    20         ans=0;
    21         for(i=1; i<=n; i++)
    22         {
    23             for(j=1; j<=n; j++)
    24                 scanf("%d",&a[i][j]);
    25         }
    26         for(i=1; i<=n; i++)
    27         {
    28             for(j=1; j<=n; j++)
    29                 mi[j]=mx[j]=a[i][j];
    30             for(j=i; j<=n; j++)
    31             {
    32                 q11=q21=q12=q22=0;
    33                 last1=1;
    34                 last2=1;
    35                 for(k=1; k<=n; k++)
    36                 {
    37                     mi[k]=min(mi[k],a[j][k]);
    38                     mx[k]=max(mx[k],a[j][k]);
    39                     while(q11!=q12&&mx[q1[q12]]<=mx[k])
    40                         q12--;
    41                     while(q21!=q22&&mi[q2[q22]]>=mi[k])
    42                         q22--;
    43                     q1[++q12]=k;
    44                     q2[++q22]=k;
    45                     while(q11!=q12&&q22!=q21&&mx[q1[q11+1]]-mi[q2[q21+1]]>m)
    46                     {
    47                         if(q1[q11+1]<q2[q21+1])
    48                         {
    49                             last1=q1[q11+1]+1;
    50                             q11++;
    51                         }
    52                         else
    53                         {
    54                             last2=q2[q21+1]+1;
    55                             q21++;
    56                         }
    57                     }
    58                     if(q11!=q12&&q22!=q21)
    59                     {
    60                         ans=max((k-max(last1,last2)+1)*(j-i+1),ans);
    61                     }
    62                 }
    63             }
    64         }
    65         printf("%d
    ",ans);
    66     }
    67     return 0;
    68 }
    View Code

    三分

     1 #include<cstdio>
     2 #include<cmath>
     3 using namespace std;
     4 const double eps=1e-5;
     5 double a,b,c,xx,yy;
     6 double f(double x){
     7     return sqrt((x-xx)*(x-xx)+(a*x*x+b*x+c-yy)*(a*x*x+b*x+c-yy));
     8 }
     9 int main(){
    10     scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&xx,&yy);
    11     double l=-200,r=200;
    12     while(r-l>eps){
    13         double lm=l+(r-l)/3,rm=r-(r-l)/3;
    14         if(f(lm)<f(rm)) r=rm;
    15         else l=lm;
    16     }
    17     printf("%.3lf
    ",f(l));
    18     return 0;
    19 } 
    View Code
  • 相关阅读:
    网络安全笔记1-局域网、DOS、用户与组、远程、NTFS、文件共享、DHCP、DNS、WEB、FTP、域、PKI、扫描与爆破
    ASM入网小助手卸载
    列表拖拽排序 ----vue.js
    如何让谷歌索引你的页面
    命令导入大数据库

    大数据-快读
    微服务参考文章
    Java-BigDecimal踩坑记录
    CF1285F Classical?
  • 原文地址:https://www.cnblogs.com/Carits/p/11385529.html
Copyright © 2011-2022 走看看