12.16
超级钢琴写了三个小时。
然后光顾着调题啥也没干。
唐了,交了几遍都只拿了十分,把每个部分检查完后发现原来是DP数组开小了😓 😓 😓
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=500010;
inline int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
struct node
{
int i,l,r,v,w;
bool operator< (const node & a) const
{
return v<a.v;
}
};
int n,m,l,r,sa[N],a[N];
int ans;
inline int Max(int x, int y)
{
return sa[x]>sa[y] ? x:y;
}
int log1[N],dp[N][20];
void st()
{
log1[0]=-1;
for (int i=1; i<=n; i++)
if (i&(i-1)) log1[i]=log1[i-1];
else log1[i]=log1[i-1]+1;
for (int i=1; i<=n; i++) dp[i][0]=i;
for (int j=1; (1<<j)<=n; j++)
for (int i=1;i+(1<<j)-1<=n;i++)
dp[i][j]=Max(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}
inline int rmq(int l,int r)
{
int tmp=log1[r-l+1];
return Max(dp[l][tmp],dp[r-(1<<tmp)+1][tmp]);
}
priority_queue <node> q;
signed main()
{
n=read(),m=read(),l=read(),r=read();
for(int i=1;i<=n;++i)
a[i]=read(),sa[i]=sa[i-1]+a[i];
st();
for(int i=1;i<=n;++i)
if(i+l-1<=n)
{
int ls=i+l-1,rs=min(i+r-1,n),pos=rmq(ls,rs),val=sa[pos]-sa[i-1];
q.push((node){i,ls,rs,val,pos});
}
else break;
while (!q.empty() && m)
{
node now=q.top(); q.pop();
ans+=now.v; m--;
node ls=now,rs=now;
ls.r=now.w-1;
if (ls.r>=ls.l)
ls.w=rmq(ls.l,ls.r),ls.v=sa[ls.w]-sa[ls.i-1],q.push(ls);
rs.l=now.w+1;
if (rs.r>=rs.l)
rs.w=rmq(rs.l,rs.r),rs.v=sa[rs.w]-sa[rs.i-1],q.push(rs);
}
cout<<ans<<endl;
}
哦我草有第二道了
一人一狗闯公园。
看题面给我刊例了,线段树维护区间最值,瞎几把改 push_up 就行了
因为几个弱智错误又调了有1小时
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ls p<<1
#define rs p<<1|1
const int N=6*1e5;
int n,m,a[N];
struct tree
{
int l,r;
int maxl,maxr,sum,ans;
inline int mid()
{
return (l+r)>>1;
}
}t[4*N];
inline void push_up(int p)
{
t[p].sum=t[ls].sum+t[rs].sum;
t[p].maxl=max(t[ls].maxl,t[ls].sum+t[rs].maxl);
t[p].maxr=max(t[rs].maxr,t[rs].sum+t[ls].maxr);
t[p].ans=max(max(t[ls].ans,t[rs].ans),t[ls].maxr+t[rs].maxl);
return;
}
inline void bulid(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].sum=a[l];
t[p].maxr=t[p].maxl=t[p].ans=a[l];
return;
}
int mid=t[p].mid();
bulid(ls,l,mid);
bulid(rs,mid+1,r);
push_up(p);
}
inline void change(int p,int x,int y)
{
int l=t[p].l,r=t[p].r;
if(l==r)
{
t[p].sum=y;
t[p].maxr=t[p].maxl=t[p].ans=y;
return;
}
int mid=t[p].mid();
if(x<=mid) change(ls,x,y);
else change(rs,x,y);
push_up(p);
}
inline tree find(int p,int x,int y)
{
int l=t[p].l,r=t[p].r;
if(x<=l && y>=r) return t[p];
else
{
int mid=t[p].mid();
if(y<=mid) return find(ls,x,y);
else if(x>mid) return find(rs,x,y);
else
{
tree t1=find(ls,x,y),t2=find(rs,x,y);
tree now;
now.maxl=max(t1.maxl,t2.maxl+t1.sum);
now.maxr=max(t2.maxr,t1.maxr+t2.sum);
now.ans=max(max(t2.ans,t1.ans),t1.maxr+t2.maxl);
return now;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
bulid(1,1,n);
for(int i=1;i<=m;++i)
{
int q,x,y;
cin>>q>>x>>y;
if(q==2)
change(1,x,y);
if(q==1)
{
if(x>y) swap(x,y);
cout<<find(1,x,y).ans<<endl;
}
}
}
有人看过寒蝉吗,在学校有点冷门😓😓😓


浙公网安备 33010602011771号