spoj gss

Posted xyleo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spoj gss相关的知识,希望对你有一定的参考价值。

gss1

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct st{int s,ls,rs,ms;}t[400050];
 4 int n,m,a[100050];
 5 st merge(st l,st r){return (st){l.s+r.s,max(l.ls,l.s+r.ls),max(l.rs+r.s,r.rs),max(max(l.ms,r.ms),l.rs+r.ls)};}
 6 void build(int x,int l,int r)
 7 {
 8     if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=a[l];return;}
 9     int md=(l+r)>>1;
10     build(x<<1,l,md);build(x<<1|1,md+1,r);
11     t[x]=merge(t[x<<1],t[x<<1|1]);
12 }
13 st qry(int x,int l,int r,int ll,int rr)
14 {
15     if(ll<=l&&r<=rr)return t[x];
16     int md=(l+r)>>1;
17     st lst,rst;
18     if(ll<=md)lst=qry(x<<1,l,md,ll,rr);
19     if(rr>md)rst=qry(x<<1|1,md+1,r,ll,rr);
20     return rr<=md?lst:(ll>md?rst:merge(lst,rst));
21 }
22 int main()
23 {
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
26     build(1,1,n);
27     scanf("%d",&m);
28     while(m--)
29     {
30         int l,r;scanf("%d%d",&l,&r);
31         printf("%d\n",qry(1,1,n,l,r).ms);
32     }
33     return 0;
34 }
View Code

gss3

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct st{int s,ls,rs,ms;}t[400050];
 4 int n,m,a[100050];
 5 st merge(st l,st r){return (st){l.s+r.s,max(l.ls,l.s+r.ls),max(l.rs+r.s,r.rs),max(max(l.ms,r.ms),l.rs+r.ls)};}
 6 void build(int x,int l,int r)
 7 {
 8     if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=a[l];return;}
 9     int md=(l+r)>>1;
10     build(x<<1,l,md);build(x<<1|1,md+1,r);
11     t[x]=merge(t[x<<1],t[x<<1|1]);
12 }
13 st qry(int x,int l,int r,int ll,int rr)
14 {
15     if(ll<=l&&r<=rr)return t[x];
16     int md=(l+r)>>1;
17     st lst,rst;
18     if(ll<=md)lst=qry(x<<1,l,md,ll,rr);
19     if(rr>md)rst=qry(x<<1|1,md+1,r,ll,rr);
20     return rr<=md?lst:(ll>md?rst:merge(lst,rst));
21 }
22 void chg(int x,int l,int r,int p,int v)
23 {
24     if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=v;return;}
25     int md=(l+r)>>1;
26     if(p<=md)chg(x<<1,l,md,p,v);else chg(x<<1|1,md+1,r,p,v);
27     t[x]=merge(t[x<<1],t[x<<1|1]);
28 }
29 int main()
30 {
31     scanf("%d",&n);
32     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
33     build(1,1,n);
34     scanf("%d",&m);
35     while(m--)
36     {
37         int kd,x,y;scanf("%d%d%d",&kd,&x,&y);
38         if(kd)printf("%d\n",qry(1,1,n,x,y).ms);else chg(1,1,n,x,y);
39     }
40     return 0;
41 }
View Code

gss4

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long a[100010],bit[100010];
 4 int tt,n,m,fa[100010];
 5 int fnd(int x){if(!fa[x]||fa[x]==x)return fa[x]=x;return fa[x]=fnd(fa[x]);}
 6 void add(int x,long long v){while(x<=n){bit[x]+=v;x+=x&(-x);}}
 7 long long sum(int x)
 8 {
 9     long long ans=0;
10     while(x){ans+=bit[x];x-=x&(-x);}
11     return ans;
12 }
13 int main()
14 {
15     while(scanf("%d",&n)==1)
16     {
17         memset(bit,0,sizeof(bit));
18         memset(fa,0,sizeof(fa));
19         printf("Case #%d:\n",++tt);
20         for(int i=1;i<=n;i++)
21         {
22             scanf("%lld",&a[i]);
23             add(i,a[i]);
24             if(a[i]<=1)fa[i]=i+1;
25         }
26         scanf("%d",&m);
27         for(int i=1;i<=m;i++)
28         {
29             int kd,l,r;
30             scanf("%d%d%d",&kd,&l,&r);
31             if(l>r)swap(l,r);
32             if(kd==1)printf("%lld\n",sum(r)-sum(l-1));
33             else
34             {
35                 for(int j=l;j<=r;j=fnd(j+1))
36                 {
37                     add(j,(long long)sqrt(a[j])-a[j]);
38                     a[j]=(long long)sqrt(a[j]);
39                     if(a[j]<=1)fa[j]=fnd(j+1);
40                 }
41             }
42         }
43         puts("");
44     }
45     return 0;
46 }
View Code

gss5

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct st{int s,ls,rs,ms;}t[400050];
 4 int n,m,a[100050],s[100050];
 5 st merge(st l,st r){return (st){l.s+r.s,max(l.ls,l.s+r.ls),max(l.rs+r.s,r.rs),max(max(l.ms,r.ms),l.rs+r.ls)};}
 6 void build(int x,int l,int r)
 7 {
 8     if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=a[l];return;}
 9     int md=(l+r)>>1;
10     build(x<<1,l,md);build(x<<1|1,md+1,r);
11     t[x]=merge(t[x<<1],t[x<<1|1]);
12 }
13 st qry(int x,int l,int r,int ll,int rr)
14 {
15     if(ll<=l&&r<=rr)return t[x];
16     int md=(l+r)>>1;
17     st lst,rst;
18     if(ll<=md)lst=qry(x<<1,l,md,ll,rr);
19     if(rr>md)rst=qry(x<<1|1,md+1,r,ll,rr);
20     return rr<=md?lst:(ll>md?rst:merge(lst,rst));
21 }
22 int main()
23 {
24     int tt;scanf("%d",&tt);
25     while(tt--)
26     {
27         scanf("%d",&n);
28         for(int i=1;i<=n;i++)scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
29         build(1,1,n);
30         scanf("%d",&m);
31         while(m--)
32         {
33             int x1,y1,x2,y2,ans;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
34             if(y1<x2)ans=qry(1,1,n,x1,y1).rs+qry(1,1,n,x2,y2).ls+s[x2-1]-s[y1];
35             else
36             {
37                 ans=-1e9-7;
38                 int l=0,m=0,mr=0,r=0;
39                 if(x2>x1)
40                 {
41                     st q=qry(1,1,n,x1,x2-1);
42                     l=max(l,q.rs);
43                 }
44                 st q=qry(1,1,n,x2,y1);
45                 ans=max(l+q.ls,q.ms);
46                 mr=q.rs;m=q.s;
47                 if(y1<y2)
48                 {
49                     st q=qry(1,1,n,y1+1,y2);
50                     r=max(r,q.ls);
51                 }
52                 ans=max(ans,max(l+m+r,mr+r));
53             }
54             printf("%d\n",ans);
55         }
56     }
57     return 0;
58 }
View Code

 

以上是关于spoj gss的主要内容,如果未能解决你的问题,请参考以下文章

SPOJ GSS

SPOJ GSS系列解题报告

SPOJ GSS3 Can you answer these queries III ——线段树

SPOJ GSS5 Can you answer these queries V ——线段树

spoj gss

spoj GSS4 - Can you answer these queries IV