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]);
}
它们之间有什么区别??