1 条题解

  • 0
    @ 2026-7-4 11:11:28

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int M = 300005;
    const int MOD = 998244353;
    #define int long long
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,rt,a[M],b[M],c[M],d[M],s[M],w[M],ch[M][2],dp[M];
    int cmp1(int x,int y)
    {
    	return a[x]<a[y]; 
    }
    int cmp2(int x,int y)
    {
    	return b[x]>b[y];
    }
    void dfs(int u)
    {
    	if(!u) return ;
    	int vl=((c[u]^c[rt])+c[u]*c[rt])%MOD;
    	if(u!=rt) dp[rt]=max(dp[rt],dp[u]+vl);
    	dfs(ch[u][0]);
    	dfs(ch[u][1]);
    }
    signed main()
    {
    	n=read();
    	for(int i=1;i<=n;i++) a[i]=read();
    	for(int i=1;i<=n;i++) b[i]=read();
    	for(int i=1;i<=n;i++) c[i]=read(),d[i]=i;
    	//left
    	sort(d+1,d+1+n,cmp1);
    	for(int i=1;i<=n;i++) w[i]=a[i]+b[i];
    	for(int i=1;i<=n;i++)
    	{
    		int x=d[i],l=1,r=m,t=0;
    		while(l<=r)
    		{
    			int mid=(l+r)>>1;
    			if(w[s[mid]]>=a[x])
    				l=mid+1,t=s[mid];
    			else r=mid-1;
    		}
    		ch[x][0]=t;
    		while(m && w[s[m]]<=w[x]) m--;
    		s[++m]=x;
    	}
    	m=0;
    	for(int i=1;i<=n;i++) w[i]=a[i]-b[i];
    	for(int i=n;i>=1;i--)
    	{
    		int x=d[i],l=1,r=m,t=0;
    		while(l<=r)
    		{
    			int mid=(l+r)>>1;
    			if(w[s[mid]]<=a[x])
    				l=mid+1,t=s[mid];
    			else r=mid-1;
    		}
    		ch[x][1]=t;
    		while(m && w[s[m]]>=w[x]) m--;
    		s[++m]=x;
    	}
    	sort(d+1,d+1+n,cmp2);
    	for(int i=1;i<=n;i++)
    		rt=d[i],dfs(rt);
    	for(int i=1;i<=n;i++)
    		printf("%lld\n",dp[i]);
    }
    
    
    • 1

    「LibreOJ β Round #3」绯色 IOI(危机)

    信息

    ID
    9836
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者