标签:
1 1 1 1 0 1 1
1
/* 题意:在一个区间取数,取完的数按标号大小排序,如果标号为奇偶交替则为满足条件的序列,求满足条件序列的数的和的最大值 思路:线段树 ,a[0][0]代表这个偶开头,偶结尾,0,1,代表偶开头奇结尾 1 0 奇 偶 1 0 奇 偶 转化方程 在pushup 函数中,具体看该函数注释 非常可惜的地方是 比赛没有做出来,因为我的 query函数返回的是 ___int64 一直超时, 后来看别人博客,发现别人返回结构体, */ #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) typedef long long ll; #define bug printf("hi\n") #define INF -1000000005 #define N 100005 inline ll Max(ll x,ll y) { return x>y?x:y; } struct stud{ int le,ri; ll a[2][2]; stud operator =(stud b) { for(int i=0;i<2;i++) for(int j=0;j<2;j++) b.a[i][j]=a[i][j]; return *this; } }f[N*4]; ll a[N]; int n,m; void pushup(int pos) { f[pos].a[0][0]=Max(f[L(pos)].a[0][0],f[R(pos)].a[0][0]); //左端点,右端点取较大 f[pos].a[0][0]=Max(f[pos].a[0][0],f[L(pos)].a[0][0]+f[R(pos)].a[1][0]);//应该挺好理解 f[pos].a[0][0]=Max(f[pos].a[0][0],f[L(pos)].a[0][1]+f[R(pos)].a[0][0]); f[pos].a[0][1]=Max(f[L(pos)].a[0][1],f[R(pos)].a[0][1]); f[pos].a[0][1]=Max(f[pos].a[0][1],f[L(pos)].a[0][0]+f[R(pos)].a[1][1]); f[pos].a[0][1]=Max(f[pos].a[0][1],f[L(pos)].a[0][1]+f[R(pos)].a[0][1]); f[pos].a[1][0]=Max(f[L(pos)].a[1][0],f[R(pos)].a[1][0]); f[pos].a[1][0]=Max(f[pos].a[1][0],f[L(pos)].a[1][0]+f[R(pos)].a[1][0]); f[pos].a[1][0]=Max(f[pos].a[1][0],f[L(pos)].a[1][1]+f[R(pos)].a[0][0]); f[pos].a[1][1]=Max(f[L(pos)].a[1][1],f[R(pos)].a[1][1]); f[pos].a[1][1]=Max(f[pos].a[1][1],f[L(pos)].a[1][0]+f[R(pos)].a[1][1]); f[pos].a[1][1]=Max(f[pos].a[1][1],f[L(pos)].a[1][1]+f[R(pos)].a[0][1]); } void update(int pos,int le,int ri) { if(f[pos].le==le&&f[pos].ri==le) { if(le&1) { f[pos].a[1][1]=ri; f[pos].a[0][0]=INF; f[pos].a[0][1]=f[pos].a[1][0]=INF; } else { f[pos].a[0][0]=ri; f[pos].a[0][1]=f[pos].a[1][0]=f[pos].a[1][1]=INF; } return ; } int mid=MID(f[pos].le,f[pos].ri); if(mid>=le) update(L(pos),le,ri); else update(R(pos),le,ri); pushup(pos); } stud query(int pos,int le,int ri) { if(f[pos].le==le&&f[pos].ri==ri) { return f[pos]; } int mid=MID(f[pos].le,f[pos].ri); if(mid>=ri) return query(L(pos),le,ri); else if(mid<le) return query(R(pos),le,ri); else { stud te=query(L(pos),le,mid); stud he=query(R(pos),mid+1,ri); stud ans; ans.a[0][0]=Max(Max(Max(te.a[0][0],he.a[0][0]),te.a[0][1]+he.a[0][0]),te.a[0][0]+he.a[1][0]); ans.a[0][1]=Max(Max(Max(te.a[0][1],he.a[0][1]),te.a[0][1]+he.a[0][1]),te.a[0][0]+he.a[1][1]); ans.a[1][0]=Max(Max(Max(te.a[1][0],he.a[1][0]),te.a[1][1]+he.a[0][0]),te.a[1][0]+he.a[1][0]); ans.a[1][1]=Max(Max(Max(te.a[1][1],he.a[1][1]),te.a[1][1]+he.a[0][1]),te.a[1][0]+he.a[1][1]); return ans; } } void build(int pos,int le,int ri) { f[pos].le=le; f[pos].ri=ri; if(le==ri) { if(le&1) { f[pos].a[1][1]=a[le]; f[pos].a[0][0]=INF; f[pos].a[0][1]=f[pos].a[1][0]=INF; } else { f[pos].a[0][0]=a[le]; f[pos].a[0][1]=f[pos].a[1][0]=f[pos].a[1][1]=INF; } return ; } int mid=MID(le,ri); build(L(pos),le,mid); build(R(pos),mid+1,ri); pushup(pos); } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,1,n); int op,le,ri; while(m--) { scanf("%d%d%d",&op,&le,&ri); if(op==0) { stud temp=query(1,le,ri); ll ans=temp.a[0][0]; for(i=0;i<2;i++) for(j=0;j<2;j++) ans=Max(ans,temp.a[i][j]); printf("%lld\n",ans); } else { update(1,le,ri); } } } return 0; } /* 5 5 3 -6 -8 3 4 5 0 1 5 1 4 -2 0 1 5 */
/* 超时代码 */ #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) typedef long long ll; #define bug printf("hi\n") #define INF -1000000005 #define N 100005 inline ll Max(ll x,ll y) { return x>y?x:y; } struct stud{ int le,ri; ll a[2][2]; }f[N*4]; ll a[N]; int n,m; void pushup(int pos) { f[pos].a[0][0]=Max(f[L(pos)].a[0][0],f[R(pos)].a[0][0]); f[pos].a[0][0]=Max(f[pos].a[0][0],f[L(pos)].a[0][0]+f[R(pos)].a[1][0]); f[pos].a[0][0]=Max(f[pos].a[0][0],f[L(pos)].a[0][1]+f[R(pos)].a[0][0]); f[pos].a[0][1]=Max(f[L(pos)].a[0][1],f[R(pos)].a[0][1]); f[pos].a[0][1]=Max(f[pos].a[0][1],f[L(pos)].a[0][0]+f[R(pos)].a[1][1]); f[pos].a[0][1]=Max(f[pos].a[0][1],f[L(pos)].a[0][1]+f[R(pos)].a[0][1]); f[pos].a[1][0]=Max(f[L(pos)].a[1][0],f[R(pos)].a[1][0]); f[pos].a[1][0]=Max(f[pos].a[1][0],f[L(pos)].a[1][0]+f[R(pos)].a[1][0]); f[pos].a[1][0]=Max(f[pos].a[1][0],f[L(pos)].a[1][1]+f[R(pos)].a[0][0]); f[pos].a[1][1]=Max(f[L(pos)].a[1][1],f[R(pos)].a[1][1]); f[pos].a[1][1]=Max(f[pos].a[1][1],f[L(pos)].a[1][0]+f[R(pos)].a[1][1]); f[pos].a[1][1]=Max(f[pos].a[1][1],f[L(pos)].a[1][1]+f[R(pos)].a[0][1]); } void update(int pos,int le,int ri) { if(f[pos].le==le&&f[pos].ri==le) { if(le&1) { f[pos].a[1][1]=ri; f[pos].a[0][0]=INF; f[pos].a[0][1]=f[pos].a[1][0]=INF; } else { f[pos].a[0][0]=ri; f[pos].a[0][1]=f[pos].a[1][0]=f[pos].a[1][1]=INF; } return ; } int mid=MID(f[pos].le,f[pos].ri); if(mid>=le) update(L(pos),le,ri); else update(R(pos),le,ri); pushup(pos); } ll query(int pos,int le,int ri,int s,int e) { if(f[pos].le==le&&f[pos].ri==ri) { return f[pos].a[s][e]; } int mid=MID(f[pos].le,f[pos].ri); if(mid>=ri) return query(L(pos),le,ri,s,e); else if(mid<le) return query(R(pos),le,ri,s,e); else { ll temp=query(L(pos),le,mid,s,s)+query(R(pos),mid+1,ri,s^1,e); ll hh=query(L(pos),le,mid,s,s^1)+query(R(pos),mid+1,ri,s,e); return Max(temp,hh); } } void build(int pos,int le,int ri) { f[pos].le=le; f[pos].ri=ri; if(le==ri) { if(le&1) { f[pos].a[1][1]=a[le]; f[pos].a[0][0]=INF; f[pos].a[0][1]=f[pos].a[1][0]=INF; } else { f[pos].a[0][0]=a[le]; f[pos].a[0][1]=f[pos].a[1][0]=f[pos].a[1][1]=INF; } return ; } int mid=MID(le,ri); build(L(pos),le,mid); build(R(pos),mid+1,ri); pushup(pos); } ll dp[105][2]; ll solve(int le,int ri) { int i,j; for(i=0;i+le<=ri;i++) dp[i][0]=dp[i][1]=INF; if((le%2)==0) { dp[0][0]=a[le]; dp[0][1]=INF; } else { dp[0][0]=INF; dp[0][1]=a[le]; } for(i=le+1;i<=ri;i++) { if(i&1) { dp[i-le][0]=dp[i-1-le][0]; dp[i-le][1]=max(max(dp[i-le-1][0]+a[i],dp[i-le-1][1]),a[i]); } else { dp[i-le][1]=dp[i-le-1][1]; dp[i-le][0]=max(max(dp[i-le-1][1]+a[i],dp[i-le-1][0]),a[i]); } } return max(dp[ri-le][0],dp[ri-le][1]); } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,1,n); int op,le,ri; while(m--) { scanf("%d%d%d",&op,&le,&ri); ri=min(n,ri); if(op==0) { int len=ri-le+1; if(len<=100) { printf("%lld\n",solve(le,ri)); continue; } ll temp=Max(query(1,le,ri,0,0),query(1,le,ri,0,1)); ll hh=Max(query(1,le,ri,1,0),query(1,le,ri,1,1)); printf("%I64d\n",Max(temp,hh)); } else { update(1,le,ri); a[le]=ri; } } } return 0; } /* 5 5 3 -6 -8 3 4 5 0 1 5 1 4 -2 0 1 5 */
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u014737310/article/details/47109379