UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#214929#3856. 排序x_add_b10596ms29516kbC++112.2kb2024-11-24 09:32:552024-11-24 13:14:46

answer

#include<bits/stdc++.h>

namespace IO
{
	template<typename Type>
	void read(Type &x){
		char ch=getchar();
		x=0;bool f=0;
		while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
		while(ch>='0'&&ch<='9') x=((x<<1)+(x<<3)+(ch^48)),ch=getchar();
		x=f?-x:x;
	}
}

using namespace std;

#define N 500005
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define Judge(x) (tree[x].l<=r&&tree[x].r>=l)

int n,pos,ans;
int a[N],head[N],rdeg[N],dp[N],ret[N];

struct Edge
{
	int u,v,nxt;
}e[N];

void addEdge(int u,int v)
{
	e[++pos]={u,v,head[u]};
	head[u]=pos;
}

struct SegTree
{
	int l,r,maxval;
}tree[N<<2];

inline void pushup(int t)
{
	tree[t].maxval=max(tree[lson(t)].maxval,tree[rson(t)].maxval);
}

inline void Build(int t,int l,int r)
{
	tree[t]={l,r,1e9};
	if(l==r) return ;
	int mid=l+r>>1;
	Build(lson(t),l,mid);
	Build(rson(t),mid+1,r);
	pushup(t);
}

inline void update(int t,int idx,int val)
{
	if(idx==tree[t].l&&idx==tree[t].r){
		tree[t].maxval=val;
		return ;
	}
	if(tree[lson(t)].l<=idx&&tree[lson(t)].r>=idx) update(lson(t),idx,val);
	else update(rson(t),idx,val);
	pushup(t);
}

inline int query(int t,int l,int r)
{
	if(l>r) return 1e9;
	if(tree[t].l>=l&&tree[t].r<=r) return tree[t].maxval;
	int res=0;
	if(Judge(lson(t))) res=max(res,query(lson(t),l,r));
	if(Judge(rson(t))) res=max(res,query(rson(t),l,r));
	return res;
}

void toposort()
{
	queue<int> q1;
	q1.push(0);
	while(q1.size()){
		int u=q1.front();
		q1.pop();
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].v;
			dp[v]=max(dp[v],dp[u]+1);
			rdeg[v]--;
			if(!rdeg[v]) q1.push(v);
		}
	}
}

int main()
{
	memset(ret,0x3f,sizeof ret);
	IO::read(n);
	for(int i=1;i<=n;i++) IO::read(a[i]);
	Build(1,1,n);
	for(int i=1;i<=n;i++){
		int pre=query(1,1,a[i]-1);
		if(pre>=1e9){
			addEdge(0,a[i]);
			update(1,a[i],1);
			ret[1]=min(ret[1],a[i]);
			rdeg[a[i]]++;
//			printf("%d->%d\n",0,a[i]);
			continue ;
		}
		int u=ret[pre];
//		printf("%d->%d\n",u,a[i]);
		addEdge(u,a[i]);
		update(1,a[i],pre+1);
		ret[pre+1]=min(ret[pre+1],a[i]);
		rdeg[a[i]]++;
	}
	toposort();
	for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
	printf("%d",ans);
}

Details

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 3204kb

input:

475
319 474 473 472 471 183 108 346 43 466 465 464 168 462 461 309 459 458 457 456 455 38 372 312 94...

output:

1

result:

wrong answer 1st numbers differ - expected: '11', found: '1'

Subtask #2:

score: 0
Skipped

Subtask #3:

score: 10
Accepted

Test #9:

score: 10
Accepted
time: 162ms
memory: 29516kb

input:

499758
77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 ...

output:

55744

result:

ok 1 number(s): "55744"

Test #10:

score: 0
Accepted
time: 166ms
memory: 29504kb

input:

498773
255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 239 238 237 236 235 234 233 2...

output:

55362

result:

ok 1 number(s): "55362"

Subtask #4:

score: 0
Wrong Answer

Test #11:

score: 0
Wrong Answer
time: 266ms
memory: 28268kb

input:

466818
447360 121353 327541 289718 71942 242279 307652 438765 78054 253024 190170 21720 292462 72832...

output:

12

result:

wrong answer 1st numbers differ - expected: '32', found: '12'

Subtask #5:

score: 0
Skipped