标签:

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