Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
23905 fyq & jbh's LCA 【BJ】T3 C++ 运行超时 25 4000 MS 65100 KB 3026 2023-12-03 21:34:29

Tests(5/20):


//25pts #include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e5+10; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,k,q,a[maxn][10];ll dp[2][10][maxn]; ll A[maxn],RES[maxn]; struct RG { int l,r;ll ret; RG(int _l,int _r,ll _ret){ l=_l,r=_r,ret=_ret; }RG(){} }; RG operator+(RG a,RG b){ RG c; c.l=a.l,c.r=b.r,c.ret=a.ret+b.ret; return c; } RG MX(RG a,RG b){ if(a.ret>b.ret)return a; return b; } struct nd { RG mx,lmx,rmx,sm; void init(int l,ll x){ mx=lmx=rmx=sm=RG(l,l,x); }nd(){ mx.ret=-1e18,lmx.ret=rmx.ret=sm.ret=0; } }; nd mg(nd a,nd b){ nd c; c.sm=a.sm+b.sm; c.lmx=MX(a.lmx,a.sm+b.lmx); c.rmx=MX(b.rmx,a.rmx+b.sm); c.mx=MX(MX(a.mx,b.mx),a.rmx+b.lmx); return c; } struct SegTree { struct node { nd S[2]; int lz; node(){ lz=0; } }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define lz(p) d[p].lz #define S(p,op) d[p].S[op] void pu(int p){S(p,0)=mg(S(ls(p),0),S(rs(p),0)),S(p,1)=mg(S(ls(p),1),S(rs(p),1));} void cl(int p,int x){ if(x)swap(S(p,0),S(p,1)),lz(p)^=x; }void pd(int p){cl(ls(p),lz(p)),cl(rs(p),lz(p)),lz(p)=0;} void bd(int l,int r,int p){ if(l==r){ S(p,0).init(l,A[l]),S(p,1).init(l,-A[l]); return; }int mid=l+r>>1; bd(l,mid,ls(p)),bd(mid+1,r,rs(p));pu(p); }void upd(int l,int r,int s,int t,int p){ if(l<=s&&t<=r){cl(p,1);return;}pd(p); int mid=s+t>>1; if(l<=mid)upd(l,r,s,mid,ls(p));if(r>=mid+1)upd(l,r,mid+1,t,rs(p));pu(p); } }T; void slv1(){ up(i,1,k)up(j,0,n)dp[1][i][j]=-1e18;dp[1][1][1]=a[1][1]; up(t,2,n){ int op=t&1; up(i,1,k)dp[op][i][0]=-1e18; up(i,1,k)up(j,1,n){ dp[op][i][j]=max(dp[!op][((i==1)?k:(i-1))][j-1],dp[!op][i][j])+a[t][i]; } }while(q--){ int x=read();ll res=0; up(i,1,k)res=max(res,dp[n&1][i][x]); cout<<res<<'\n'; } } void slv2(){ up(i,1,n)A[i]=a[i][2]-a[i][1]; T.bd(1,n,1); ll res=0;up(i,1,n)res+=a[i][1]; up(i,1,n){ RES[i]=res; auto it=T.S(1,0).mx; res+=it.ret; T.upd(it.l,it.r,1,n,1); }while(q--){ int x=read(); cout<<RES[x]<<'\n'; } } void slv(){ n=read(),k=read(),q=read(); up(i,1,k)up(j,1,n)a[j][i]=read(); if(k==2&&n>500)slv2(); else slv1(); }int main(){ // freopen("division.in","r",stdin); // freopen("division.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }


测评信息: