ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#214926 | #3856. 排序 | x_add_b | 0 | 625ms | 29524kb | C++11 | 2.2kb | 2024-11-24 09:31:55 | 2024-11-24 13:14:34 |
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: 0ms
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:
0->319 0->474 0->473 0->472 0->471 0->183 0->108 0->346 0->43 0->466 0->465 0->464 0->168 0->462 0->...
result:
wrong output format Expected integer, but "0->319" found
Subtask #2:
score: 0
Skipped
Subtask #3:
score: 0
Wrong Answer
Test #9:
score: 0
Wrong Answer
time: 219ms
memory: 29524kb
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:
0->77 0->76 0->75 0->74 0->73 0->72 0->71 0->70 0->69 0->68 0->67 0->66 0->65 0->64 0->63 0->62 0->6...
result:
wrong output format Expected integer, but "0->77" found
Subtask #4:
score: 0
Wrong Answer
Test #11:
score: 0
Wrong Answer
time: 406ms
memory: 28268kb
input:
466818 447360 121353 327541 289718 71942 242279 307652 438765 78054 253024 190170 21720 292462 72832...
output:
0->447360 0->121353 0->327541 0->289718 0->71942 0->242279 0->307652 0->438765 0->78054 0->253024 0-...
result:
wrong output format Expected integer, but "0->447360" found
Subtask #5:
score: 0
Skipped