求问
查看原帖
求问
500031
FJ_OIer楼主2025/7/14 19:28

WA 4# 90pts:

#include <bits/stdc++.h>
#define N 100001
using namespace std;
int n,tot,ans;
int a[N],b[N],c[N],dis[N*3];
int dp[5][N],seg[5][N<<2];
void change(int id,int l,int r,int k,int x,int y){
    if (l>x||r<x){
        return;
    }
	if (l==r){
		seg[id][k]=max(seg[id][k],y);
		return;
	}
	int mid=(l+r)>>1;
	change(id,l,mid,k<<1,x,y);
	change(id,mid+1,r,(k<<1)|1,x,y);
	seg[id][k]=max(seg[id][k<<1],seg[id][(k<<1)|1]);
}
int query(int id,int l,int r,int k,int x,int y){
    if (l>y||r<x) return 0;
	if (x<=l&&r<=y){
		return seg[id][k];
	}
	int mid=(l+r)>>1;
	return max(query(id,l,mid,k<<1,x,y),query(id,mid+1,r,(k<<1)|1,x,y));
}
int main(){
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		dis[++tot]=a[i];
	}
	for (int i=1;i<=n;i++){
		cin>>b[i];
		dis[++tot]=a[i];
	}
	for (int i=1;i<=n;i++){
		cin>>c[i];
		dis[++tot]=a[i];
	}
	sort(dis+1,dis+tot+1);
	for (int i=1;i<=n;i++){
		a[i]=lower_bound(dis+1,dis+tot+1,a[i])-dis;
		b[i]=lower_bound(dis+1,dis+tot+1,b[i])-dis;
		c[i]=lower_bound(dis+1,dis+tot+1,c[i])-dis;
	}
	for (int i=1;i<=n;i++){
		for (int j=1;j<=4;j++){
			dp[1][i]=max(dp[1][i],query(j,1,tot,1,1,a[i]));
			dp[2][i]=max(dp[2][i],query(j,1,tot,1,b[i],tot));
		}
		dp[1][i]++,dp[2][i]++;
		dp[3][i]=max(dp[3][i],query(1,1,tot,1,1,c[i]));
		dp[3][i]=max(dp[3][i],query(2,1,tot,1,1,c[i]));
		dp[3][i]=max(dp[3][i],query(3,1,tot,1,1,c[i]));
		dp[3][i]++;
		dp[4][i]=max(dp[4][i],query(1,1,tot,1,c[i],tot));
		dp[4][i]=max(dp[4][i],query(2,1,tot,1,c[i],tot));
		dp[4][i]=max(dp[4][i],query(4,1,tot,1,c[i],tot));
		dp[4][i]++;
		change(1,1,tot,1,a[i],dp[1][i]);
		change(2,1,tot,1,b[i],dp[2][i]);
		change(3,1,tot,1,c[i],dp[3][i]);
		change(4,1,tot,1,c[i],dp[4][i]);
	}
    for (int k=1;k<=4;k++)
	for (int i=1;i<=n;i++){
		ans=max(ans,dp[k][i]);
	}
	cout<<ans;
	return 0;
}

但是如果将change函数改成这样就过了:

void change(int id,int l,int r,int k,int x,int y){
	if (l==r){
		seg[id][k]=max(seg[id][k],y);
		return;
	}
	int mid=(l+r)>>1;
	if (mid>=x)change(id,l,mid,k<<1,x,y);
	else change(id,mid+1,r,(k<<1)|1,x,y);
	seg[id][k]=max(seg[id][k<<1],seg[id][(k<<1)|1]);
}

它们之间有什么区别??

2025/7/14 19:28
加载中...