【算法总结】根号算法相关

【莫队算法】

〖相关资料〗

《【莫队算法】》

〖相关题目〗

1.【bzoj2038】[2009国家集训队]小Z的袜子(hose)

题意:给出n个数与m个区间,在每个区间内选出两个数,求选出的两个数相等的概率。

分析:hzwerの博客

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define LL long long
 6 using namespace std;
 7 const int N=5e4+5;
 8 int n,m,s[N],c[N],pos[N];
 9 LL ans;
10 struct node{int id,l,r;LL a,b;}a[N];
11 int read()
12 {
13     int x=0,f=1;char c=getchar();
14     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
15     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
16     return x*f;
17 }
18 bool cmp(node a,node b)
19 {
20     if(pos[a.l]==pos[b.l])return a.r<b.r;
21     return a.l<b.l;
22 }
23 bool cmp2(node a,node b){return a.id<b.id;}
24 LL sqr(int x){return 1ll*x*x;}
25 LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
26 void update(int p,int val)
27 {
28     ans-=sqr(s[c[p]]);
29     s[c[p]]+=val;
30     ans+=sqr(s[c[p]]);
31 }
32 int main()
33 {
34     n=read();m=read();
35     for(int i=1;i<=n;i++)c[i]=read();
36     int block=(int)sqrt(n);
37     for(int i=1;i<=n;i++)pos[i]=(i-1)/block+1;
38     for(int i=1;i<=m;i++)
39         a[i].l=read(),a[i].r=read(),a[i].id=i;
40     sort(a+1,a+m+1,cmp);
41     for(int i=1,l=1,r=0;i<=m;i++)
42     {
43         for(;r<a[i].r;r++)update(r+1,1);
44         for(;r>a[i].r;r--)update(r,-1);
45         for(;l<a[i].l;l++)update(l,-1);
46         for(;l>a[i].l;l--)update(l-1,1);
47         if(a[i].l==a[i].r){a[i].a=0;a[i].b=1;continue;}
48         a[i].a=ans-(a[i].r-a[i].l+1);
49         a[i].b=1ll*(a[i].r-a[i].l+1)*(a[i].r-a[i].l);
50         LL k=gcd(a[i].a,a[i].b);
51         a[i].a/=k;a[i].b/=k;
52     }
53     sort(a+1,a+m+1,cmp2);
54     for(int i=1;i<=m;i++)printf("%lld/%lld\n",a[i].a,a[i].b);
55     return 0;
56 }

2.【bzoj3052】[wc2013]糖果公园

题意:见原题。

分析:vfleakingの博客

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 #define LL long long
  6 using namespace std;
  7 const int N=1e5+5;
  8 int n,m,Q,cnt,op,x,y,B,ind;
  9 int v[N],w[N],c[N],pre[N],num[N];
 10 int first[N],dfn[N],deep[N],fa[N][17];
 11 int tot,top,st[N],be[N];
 12 LL ans,sum[N];
 13 bool vis[N];
 14 struct edge{int to,next;}e[N<<1];
 15 struct change{int x,y,pre;}a[N];
 16 struct query{int x,y,t,id;}b[N];
 17 const int M=1e5;
 18 char ib[M+7],*ip=ib+M;
 19 int G()
 20 {
 21     if(ip==ib+M)fread(ip=ib,1,M,stdin)[ib]=0;
 22     return *ip++;
 23 }
 24 int read()
 25 {
 26     int x=0,f=1;
 27     if(ip<ib+M-100)
 28     {
 29         while(*ip<48)*ip++==‘-‘?f=-1:0;
 30         while(*ip>47)x=x*10+*ip++-48;
 31     }
 32     else
 33     {
 34         int c=G();
 35         while(c<48)c==‘-‘?f=-1:0,c=G();
 36         while(c>47)x=x*10+c-48,c=G();
 37     }
 38     return x*f;
 39 }
 40 bool cmp(query a,query b)
 41 {
 42     if(be[a.x]==be[b.x]&&be[a.y]==be[b.y])return a.t<b.t;
 43     if(be[a.x]==be[b.x])return be[a.y]<be[b.y];
 44     return be[a.x]<be[b.x];
 45 }
 46 void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;}
 47 void dfs(int x)
 48 {
 49     dfn[x]=++ind;
 50     for(int i=1;(1<<i)<=deep[x];i++)
 51         fa[x][i]=fa[fa[x][i-1]][i-1];
 52     int bottom=top;
 53     for(int i=first[x];i;i=e[i].next)
 54     {
 55         int to=e[i].to;
 56         if(to==fa[x][0])continue;
 57         deep[to]=deep[x]+1;
 58         fa[to][0]=x;dfs(to);
 59         if(top-bottom>=B)
 60         {
 61             tot++;
 62             while(top!=bottom)be[st[top--]]=tot;
 63         }
 64     }
 65     st[++top]=x;
 66 }
 67 int lca(int x,int y)
 68 {
 69     if(deep[x]<deep[y])swap(x,y);
 70     int d=deep[x]-deep[y];
 71     for(int i=0;(1<<i)<=d;i++)
 72         if((1<<i)&d)x=fa[x][i];
 73     if(x==y)return x;
 74     for(int i=16;i>=0;i--)
 75         if(fa[x][i]!=fa[y][i])
 76             x=fa[x][i],y=fa[y][i];
 77     return fa[x][0];
 78 }
 79 void rev(int x)
 80 {
 81     if(vis[x])ans-=1ll*w[num[c[x]]]*v[c[x]],num[c[x]]--;
 82     else num[c[x]]++,ans+=1ll*w[num[c[x]]]*v[c[x]];
 83     vis[x]^=1;
 84 }
 85 void modify(int x,int y)
 86 {
 87     if(!vis[x])c[x]=y;
 88     else {rev(x);c[x]=y;rev(x);}
 89 }
 90 void solve(int x,int y)
 91 {
 92     while(x!=y)
 93     {
 94         if(deep[x]>deep[y])rev(x),x=fa[x][0];
 95         else rev(y),y=fa[y][0];
 96     }
 97 }
 98 int main()
 99 {
100     n=read();m=read();Q=read();
101     for(int i=1;i<=m;i++)v[i]=read();
102     for(int i=1;i<=n;i++)w[i]=read();
103     for(int i=1;i<n;i++)
104     {
105         x=read();y=read();
106         ins(x,y);ins(y,x);
107     }
108     for(int i=1;i<=n;i++)pre[i]=c[i]=read();
109     B=pow(n,2.0/3)*0.5;dfs(1);
110     while(top)be[st[top--]]=tot;
111     int c0=0,c1=0;
112     for(int i=1;i<=Q;i++)
113     {
114         op=read();x=read();y=read();
115         if(!op)a[++c0]=(change){x,y,pre[x]},pre[x]=y;
116         else
117         {
118             if(dfn[x]>dfn[y])swap(x,y);
119             b[++c1]=(query){x,y,c0,c1};
120         }
121     }
122     sort(b+1,b+c1+1,cmp);
123     for(int i=1;i<=b[1].t;i++)modify(a[i].x,a[i].y);
124     solve(b[1].x,b[1].y);
125     int t=lca(b[1].x,b[1].y);
126     rev(t);sum[b[1].id]=ans;rev(t);
127     for(int i=2;i<=c1;i++)
128     {
129         for(int j=b[i-1].t+1;j<=b[i].t;j++)modify(a[j].x,a[j].y);
130         for(int j=b[i-1].t;j>b[i].t;j--)modify(a[j].x,a[j].pre);
131         solve(b[i-1].x,b[i].x);
132         solve(b[i-1].y,b[i].y);
133         t=lca(b[i].x,b[i].y);
134         rev(t);sum[b[i].id]=ans;rev(t);
135     }
136     for(int i=1;i<=c1;i++)printf("%lld\n",sum[i]);
137     return 0;
138 }

3.【bzoj4129】Haruna’s Breakfast

题意:见原题。

分析:无。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 #define LL long long
  6 using namespace std;
  7 const int N=5e4+5;
  8 int n,m,cnt,op,x,y,B,S,ind;
  9 int top,tot,be[N],st[N];
 10 int first[N],c[N],pre[N],ans[N];
 11 int dfn[N],deep[N],fa[N][17];
 12 int blo,numb[N],sz[N],num[N],fir[N];
 13 bool vis[N];
 14 struct edge{int to,next;}e[N<<1];
 15 struct change{int x,y,pre;}a[N];
 16 struct query{int x,y,t,id;}b[N];
 17 int read()
 18 {
 19     int x=0,f=1;char c=getchar();
 20     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
 21     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
 22     return x*f;
 23 }
 24 bool cmp(query a,query b)
 25 {
 26     if(be[a.x]==be[b.x]&&be[a.y]==be[b.y])return a.t<b.t;
 27     if(be[a.x]==be[b.x])return be[a.y]<be[b.y];
 28     return be[a.x]<be[b.x];
 29 }
 30 void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;}
 31 void dfs(int x)
 32 {
 33     dfn[x]=++ind;
 34     for(int i=1;(1<<i)<=deep[x];i++)
 35         fa[x][i]=fa[fa[x][i-1]][i-1];
 36     int bottom=top;
 37     for(int i=first[x];i;i=e[i].next)
 38     {
 39         int to=e[i].to;
 40         if(to==fa[x][0])continue;
 41         deep[to]=deep[x]+1;
 42         fa[to][0]=x;dfs(to);
 43         if(top-bottom>=B)
 44         {
 45             tot++;
 46             while(top!=bottom)be[st[top--]]=tot;
 47         }
 48     }
 49     st[++top]=x;
 50 }
 51 int lca(int x,int y)
 52 {
 53     if(deep[x]<deep[y])swap(x,y);
 54     int d=deep[x]-deep[y];
 55     for(int i=0;(1<<i)<=d;i++)
 56         if((1<<i)&d)x=fa[x][i];
 57     if(x==y)return x;
 58     for(int i=16;i>=0;i--)
 59         if(fa[x][i]!=fa[y][i])
 60             x=fa[x][i],y=fa[y][i];
 61     return fa[x][0];
 62 }
 63 void rev(int x)
 64 {
 65     if(c[x]>n){vis[x]^=1;return;}
 66     int id=numb[c[x]];
 67     if(vis[x])num[c[x]]--,sz[id]+=(num[c[x]]==0);
 68     else sz[id]-=(num[c[x]]==0),num[c[x]]++;
 69     vis[x]^=1;
 70 }
 71 void modify(int x,int y)
 72 {
 73     if(!vis[x])c[x]=y;
 74     else {rev(x);c[x]=y;rev(x);}
 75 }
 76 void solve(int x,int y)
 77 {
 78     while(x!=y)
 79     {
 80         if(deep[x]>deep[y])rev(x),x=fa[x][0];
 81         else rev(y),y=fa[y][0];
 82     }
 83 }
 84 int calc()
 85 {
 86     int id=0;
 87     for(int i=1;i<=blo;i++)
 88         if(sz[i]){id=i;break;}
 89     for(int i=fir[id];i<=n&&numb[i]==id;i++)
 90         if(!num[i])return i;
 91     return 0;
 92 }
 93 int main()
 94 {
 95     n=read();m=read();
 96     for(int i=1;i<=n;i++)pre[i]=c[i]=read();
 97     for(int i=1;i<n;i++)
 98     {
 99         x=read();y=read();
100         ins(x,y);ins(y,x);
101     }
102     S=sqrt(n);blo=1;
103     numb[0]=1;sz[1]++;fir[1]=0;
104     for(int i=1;i<=n;i++)
105     {
106         numb[i]=(i-1)/S+1;
107         if(!sz[numb[i]])fir[numb[i]]=i;
108         sz[numb[i]]++;
109         blo=max(blo,numb[i]);
110     }
111     B=pow(n,2.0/3)*0.5;dfs(1);
112     while(top)be[st[top--]]=tot;
113     int c0=0,c1=0;
114     for(int i=1;i<=m;i++)
115     {
116         op=read();x=read();y=read();
117         if(!op)a[++c0]=(change){x,y,pre[x]},pre[x]=y;
118         else
119         {
120             if(dfn[x]>dfn[y])swap(x,y);
121             b[++c1]=(query){x,y,c0,c1};
122         }
123     }
124     sort(b+1,b+c1+1,cmp);
125     for(int i=1;i<=b[1].t;i++)modify(a[i].x,a[i].y);
126     solve(b[1].x,b[1].y);
127     int t=lca(b[1].x,b[1].y);
128     rev(t);ans[b[1].id]=calc();rev(t);
129     for(int i=2;i<=c1;i++)
130     {
131         for(int j=b[i-1].t+1;j<=b[i].t;j++)modify(a[j].x,a[j].y);
132         for(int j=b[i-1].t;j>b[i].t;j--)modify(a[j].x,a[j].pre);
133         solve(b[i-1].x,b[i].x);
134         solve(b[i-1].y,b[i].y);
135         t=lca(b[i].x,b[i].y);
136         rev(t);ans[b[i].id]=calc();rev(t);
137     }
138     for(int i=1;i<=c1;i++)printf("%d\n",ans[i]);
139     return 0;
140 }

【树分块】

〖相关题目〗

1.【bzoj1086】[SCOI2005]王室联邦

题意:给定一棵树,要求将这棵树分成一些块,使每块大小在[B,3B]之间。

分析:PoPoQQQの博客

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define LL long long
 6 using namespace std;
 7 const int N=1e3+5;
 8 int n,B,x,y,cnt,tot,top;
 9 int first[N],st[N],be[N],root[N];
10 struct edge{int to,next;}e[N<<1];
11 int read()
12 {
13     int x=0,f=1;char c=getchar();
14     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
15     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
16     return x*f;
17 }
18 void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;}
19 void dfs(int x,int fa)
20 {
21     int bottom=top;
22     for(int i=first[x];i;i=e[i].next)
23     {
24         int to=e[i].to;
25         if(to==fa)continue;
26         dfs(to,x);
27         if(top-bottom>=B)
28         {
29             root[++tot]=x;
30             while(top!=bottom)be[st[top--]]=tot;
31         }
32     }
33     st[++top]=x;
34 }
35 int main()
36 {
37     n=read();B=read();
38     for(int i=1;i<n;i++)x=read(),y=read(),ins(x,y),ins(y,x);
39     dfs(1,-1);
40     while(top)be[st[top--]]=tot;
41     printf("%d\n",tot);
42     for(int i=1;i<=n;i++)printf("%d ",be[i]);
43     printf("\n");
44     for(int i=1;i<=tot;i++)printf("%d ",root[i]);
45     return 0;
46 }

【分块】

〖相关题目〗

1.【codevs5037】线段树练习4加强版

题意:维护一个序列,支持2种操作:add a b c:区间[a,b]中每个数加上c;count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数)。

分析:无

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define LL long long
 6 using namespace std;
 7 const int N=2e5+5;
 8 const int M=455;
 9 int n,m,k,s,id,l,r,c;
10 int a[N],add[M],f[M][N];
11 char op[6];
12 int read()
13 {
14     int x=0,f=1;char c=getchar();
15     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
16     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
17     return x*f;
18 }
19 void modify()
20 {
21     c=read();id=(l-1)/s+1;
22     for(int i=l;i<=min(id*s,r);i++)
23     {
24         f[id][a[i]]--;
25         a[i]=(a[i]+c)%k;
26         f[id][a[i]]++;
27     }
28     l=id;id=(r-1)/s+1;
29     for(int i=max(l,id-1)*s+1;i<=r;i++)
30     {
31         f[id][a[i]]--;
32         a[i]=(a[i]+c)%k;
33         f[id][a[i]]++;
34     }
35     r=id;
36     for(int i=l+1;i<r;i++)add[i]=(add[i]+c)%k;
37 }
38 int query()
39 {
40     int ans=0;
41     id=(l-1)/s+1;
42     for(int i=l;i<=min(id*s,r);i++)
43         if((a[i]+add[id])%k==0)ans++;
44     l=id;id=(r-1)/s+1;
45     for(int i=max(l,id-1)*s+1;i<=r;i++)
46         if((a[i]+add[id])%k==0)ans++;
47     r=id;
48     for(int i=l+1;i<r;i++)ans+=f[i][(k-add[i])%k];
49     return ans;
50 }
51 int main()
52 {
53     n=read();s=sqrt(n);
54     m=read();k=read();
55     for(int i=1;i<=n;i++)
56     {
57         a[i]=read()%k;
58         id=(i-1)/s+1;
59         f[id][a[i]]++;
60     }
61     while(m--)
62     {
63         scanf("%s",op);
64         l=read();r=read();
65         if(op[0]==‘a‘)modify();
66         else printf("%d\n",query());
67     }
68     return 0;
69 }

2.【bzoj2724】[Violet 6]蒲公英

题意:求区间众数。

分析:hzwer的博客

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<vector>
 6 #define LL long long
 7 using namespace std;
 8 const int N=4e4+5;
 9 const int M=205;
10 int n,m,s,tot,l,r,ans;
11 int a[N],b[N],be[N],cnt[N],f[M][M];
12 vector<int> p[N];
13 int read()
14 {
15     int x=0,f=1;char c=getchar();
16     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
17     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
18     return x*f;
19 }
20 void pre(int x)
21 {
22     memset(cnt,0,sizeof(cnt));
23     int mx=0,ans=0,t;
24     for(int i=(x-1)*s+1;i<=n;i++)
25     {
26         cnt[a[i]]++;t=be[i];
27         if(cnt[a[i]]>mx||(cnt[a[i]]==mx&&a[i]<ans))
28             mx=cnt[a[i]],ans=a[i];
29         f[x][t]=ans;
30     }
31 }
32 int query(int l,int r,int x)
33 {
34     l=lower_bound(p[x].begin(),p[x].end(),l)-p[x].begin();
35     r=upper_bound(p[x].begin(),p[x].end(),r)-p[x].begin();
36     return r-l;
37 }
38 int work()
39 {
40     int ans=f[be[l]+1][be[r]-1],mx=query(l,r,ans),t;
41     for(int i=l;i<=min(be[l]*s,r);i++)
42     {
43          t=query(l,r,a[i]);
44          if(t>mx||(t==mx&&a[i]<ans))mx=t,ans=a[i];
45     }
46     if(be[l]==be[r])return ans;
47     for(int i=(be[r]-1)*s+1;i<=r;i++)
48     {
49         t=query(l,r,a[i]);
50         if(t>mx||(t==mx&&a[i]<ans))mx=t,ans=a[i];
51     }
52     return ans;
53 }
54 int main()
55 {
56     n=read();m=read();s=sqrt(n);
57     for(int i=1;i<=n;i++)a[i]=b[i]=read();
58     sort(b+1,b+n+1);
59     tot=unique(b+1,b+n+1)-b-1;
60     for(int i=1;i<=n;i++)
61     {
62         a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
63         p[a[i]].push_back(i);
64         be[i]=(i-1)/s+1;
65     }
66     for(int i=1;i<=be[n];i++)pre(i);
67     for(int i=1;i<=m;i++)
68     {
69         l=read();r=read();
70         l=(l+ans-1)%n+1;r=(r+ans-1)%n+1;
71         if(l>r)swap(l,r);
72         ans=b[work()];
73         printf("%d\n",ans);
74     }
75     return 0;
76 }

3.【bzoj2388】旅行规划

题意:见原题。

分析:hzwerの博客

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 #define LL long long
  6 using namespace std;
  7 const int N=1e5+5;
  8 const int M=325;
  9 const LL inf=1e16;
 10 int n,m,s,cnt,op,l,r,x,y;
 11 int be[N],st[M],ed[M],num[M];
 12 int top,sta[N],t[M][M];
 13 LL tmp,k,a[N],fir[N],dif[N],add[N];
 14 int read()
 15 {
 16     int x=0,f=1;char c=getchar();
 17     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
 18     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
 19     return x*f;
 20 }
 21 double sl(int x,int y){return 1.0*(a[x]-a[y])/(y-x);}
 22 LL get(int x)
 23 {
 24     if(x==0||x==n+1)return -inf;
 25     int t=be[x];
 26     return a[x]+fir[t]+dif[t]*(x-st[t])+add[t];
 27 }
 28 void build(int x)
 29 {
 30     top=0;sta[++top]=st[x];
 31     for(int i=st[x]+1;i<=ed[x];i++)
 32     {
 33         while(top>1&&sl(sta[top-1],sta[top])>sl(sta[top],i))top--;
 34         sta[++top]=i;
 35     }
 36     sta[0]=0;sta[top+1]=n+1;num[x]=top;
 37     for(int i=0;i<=top+1;i++)t[x][i]=sta[i];
 38 }
 39 void pushdown(int x)
 40 {
 41     LL tmp=fir[x];
 42     for(int i=st[x];i<=ed[x];i++)
 43         a[i]+=tmp+add[x],tmp+=dif[x];
 44     fir[x]=dif[x]=add[x]=0;
 45 }
 46 void modify()
 47 {
 48     k=read();l=be[x];r=be[y];
 49     tmp=k*(st[l+1]-x+1);
 50     for(int i=l+1;i<r;i++)
 51         fir[i]+=tmp,dif[i]+=k,tmp+=s*k;
 52     pushdown(l);tmp=k;
 53     for(int i=x;i<=min(ed[l],y);i++)a[i]+=tmp,tmp+=k;
 54     build(l);pushdown(r);
 55     tmp=k*(st[r]-x+1);
 56     for(int i=max(ed[l]+1,st[r]);i<=y;i++)a[i]+=tmp,tmp+=k;
 57     tmp=k*(y-x+1);
 58     for(int i=y+1;i<=ed[r];i++)a[i]+=tmp;
 59     build(r);
 60     for(int i=r+1;i<=cnt;i++)add[i]+=tmp;
 61 }
 62 LL ask(int x)
 63 {
 64     int l=1,r=num[x],ans=0,mid;
 65     while(l<=r)
 66     {
 67         mid=(l+r)>>1;
 68         if(sl(t[x][mid-1],t[x][mid])<dif[x])ans=t[x][mid],l=mid+1;
 69         else r=mid-1;
 70     }
 71     return get(ans);
 72 }
 73 LL query()
 74 {
 75     l=be[x];r=be[y];LL ans=-inf;
 76     for(int i=l+1;i<r;i++)ans=max(ans,ask(i));
 77     for(int i=x;i<=min(ed[l],y);i++)ans=max(ans,get(i));
 78     for(int i=max(ed[l]+1,st[r]);i<=y;i++)ans=max(ans,get(i));
 79     return ans;
 80 }
 81 int main()
 82 {
 83     n=read();s=sqrt(n);
 84     for(int i=1;i<=n;i++)
 85     {
 86         x=read();a[i]=a[i-1]+x;
 87         be[i]=(i-1)/s+1;
 88     }
 89     cnt=be[n];
 90     a[0]=a[n+1]=-inf;
 91     for(int i=1;i<=cnt;i++)
 92     {
 93         st[i]=(i-1)*s+1;
 94         ed[i]=min(i*s,n);
 95         build(i);
 96     }
 97     m=read();
 98     while(m--)
 99     {
100         op=read();x=read();y=read();
101         if(!op)modify();
102         else printf("%lld\n",query());
103     }
104     return 0;
105 }

原文地址:https://www.cnblogs.com/zsnuo/p/8553477.html

时间: 2024-10-31 22:32:23

【算法总结】根号算法相关的相关文章

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

P3396 哈希冲突 (根号算法)

题目链接:https://www.luogu.org/problemnew/show/P3396 题目描述 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣.他会给出一个正整数序列value[]. 自然,B君会把这些数据存进hash池.第value[k]会被存进(k%p)这个池.这样就能造成很多冲突. B君会给定许多个p和x,询问在模p时,x这个池内数的总和. 另外,B君会随时更改value[k].每次更改立即生效. 保证1<=p<

《算法导论》图相关算法小结

最近又抽空读了一遍<算法导论>,关于图的内容贯穿了多个章节(比如在动态规划一章埋了无权最短路径的伏笔,后面才专门讲),适用条件各异,而且都有证明过程. 如果不打算熟记证明,仅仅是应用,遇到具体场景再去回忆适用于哪种算法不太方便. 以下内容以手头的机械工业出版社基于原书第2版的译本整理了一下,便于速查. 不包含思考题.标注为"*"的章节和习题内容. 符号定义 一般地, 图G=(V, E),其中V代表顶点集合,E代表边集合.ω(u, v)代表从顶点u到顶点v的边的权值. 如果ω

MP算法、OMP算法及其在人脸识别的应用

主要内容: 1.MP算法 2.OMP算法 3.OMP算法的matlab实现 4.OMP在压缩感知和人脸识别的应用 一.MP(Matching Pursuits)与OMP(Orthogonal Matching Pursuit)算法 内容:稀疏信号的表示(字典.稀疏系数).MP算法.MP算法的缺点.OMP.OMP的实现 参考文章:http://blog.csdn.net/scucj/article/details/7467955 二.OMP的matlab实现 %A-稀疏系数矩阵%D-字典/测量矩阵

【机器学习】粗糙集属性约简算法与mRMR算法的本质区别

1. 粗糙集属性约简算法仅仅选出属性重要度大的条件加入约减中,没有考虑约简中条件属性相互之间的冗余性,得到的约简往往不是都必要的,即含有冗余属性. 2. mRMR算法则除了考虑特征与类别之间的相关性,还考虑特征与特征之间的冗余度,约束特征与类别最大相关,特征与特征最小冗余. 3. 根据mRMR算法,将粗糙集约简算法改进为最小相关最大依赖度属性约简的算法如下

转载:算法杂货铺——分类算法之决策树(Decision tree)

作者:张洋 算法杂货铺——分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 44346 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法.这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断.在这一篇文章中,将讨论另一种被广泛使用的分类算法——决策树(decision tree).相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际

“Chaos”的算法之Floyd算法

倘若我们要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络.其实现最基本的功能,求出任意两点间的最短路径, 求最短路径的经典方法有很多种,最常用的便是迪杰斯特拉算法和佛洛依德(Floyd)算法,这篇文章就着重介绍Floyd算法. 求两点之间的最短路径无外乎有两种情况,一种就是从一点直接到另一点,另一种就是从一点经过n个节点后再到另一个节点,比如说要从A到B,则有两种情况就是A直接到B,或者是从A经过N个节点后再到B,所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离

分布式一致性算法:Raft 算法

Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的思想.如果对 Paxos 算法感兴趣,可以看我的另一篇文章:分布式系列文章--Paxos算法原理与推导 摘要Raft 是用来管理复制日志(replicated log)的一致性协议.它跟 multi-Paxos 作用相同,效率也相当,但是它的组织结构跟 Paxos 不同.这使得 Raft 比 Pax

深度学习算法实践8---BP算法详解

BP算法是关于误差的反向传播算法,就是从输出层开始,将结果与预期结果相比较,求出误差,然后按照梯度最大下降方向,调整神经元的联接权值,然后依次逐层调整各层之间的连接权值,对于批量学习方式而言,不断重复上述过程,直到误差达到足够小时为止. 对于输出层而言,我们可以直接使用在上一篇博文中关于感知器模型的算法,BP算法的难点在于,如何处理隐藏层,因为隐藏层没有正确的输出信息用来计算误差. 下面我们将从输出层开始,推导出BP算法.在rwy推导算法之前,我们先来定义一下表示方法,和原来一样,我们用i来表示