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;
        }
    }
}

有人看过寒蝉吗,在学校有点冷门😓😓😓

image

不会去水印
posted @ 2023-12-16 16:38  HS_xh  阅读(31)  评论(5)    收藏  举报
init();