1 条题解
-
0
C++ :
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=50000; struct node{int id,k,a;}t[N+1]; int f[N+1],l[N+1],r[N+1],d[N+1]; int i,n; bool cmp(node x,node y){return x.k<y.k;} void build() { int k,top=-1; for(i=1;i<=n;i++) { k=top; while(k>=0&&t[d[k]].a>t[i].a) k--; if(k!=-1) { f[t[i].id]=t[d[k]].id; r[t[d[k]].id]=t[i].id; } if(k<top) { f[t[d[k+1]].id]=t[i].id; l[t[i].id]=t[d[k+1]].id; } d[++k]=i; top=k; } } int main() { while(~scanf("%d",&n)) { memset(f,0,sizeof(f)); memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); for(i=1;i<=n;i++) scanf("%d%d",&t[i].k,&t[i].a),t[i].id=i; sort(t+1,t+n+1,cmp); build(); printf("yes\n"); for(i=1;i<=n;i++) printf("%d %d %d\n",f[i],l[i],r[i]); } return 0; }
Pascal :
program p26935; var k:array[0..50000]of longint; w:array[0..50000]of longint; a:array[0..50000]of longint; ans:array[0..50000,1..3]of longint; i,j,t,n,now,total:longint; procedure qsort(l,r:longint); var i,j,x,y:longint; begin x:=k[(l+r)div 2]; i:=l;j:=r; repeat while k[i]<x do inc(i); while k[j]>x do dec(j); if i<=j then begin t:=k[i];k[i]:=k[j];k[j]:=t; t:=w[i];w[i]:=w[j];w[j]:=t; t:=a[i];a[i]:=a[j];a[j]:=t; inc(i);dec(j); end; until i>j; if i<r then qsort(i,r); if j>l then qsort(l,j); end;{qsort} begin{main} readln(n); for i:=1 to n do begin readln(k[i],a[i]); w[i]:=i; end; qsort(1,n); ans[1,1]:=0; ans[1,2]:=0; ans[1,3]:=0; now:=1; for i:=2 to n do begin while (a[i]<a[now])and(ans[now,1]<>0) do now:=ans[now,1]; if a[i]<a[now] then begin ans[now,1]:=i; ans[i,2]:=now; end else begin if ans[now,3]<>0 then begin ans[i,2]:=ans[now,3]; ans[ans[now,3],1]:=i; end; ans[now,3]:=i; ans[i,1]:=now; end; now:=i; end; total:=1; for i:=1 to n do if ans[i,1]<>0 then inc(total); if total=n then begin writeln('yes'); for i:=1 to n do for j:=1 to n do begin if w[j]=i then writeln(w[ans[j,1]],' ',w[ans[j,2]],' ',w[ans[j,3]]); end; end else writeln('no'); end.
- 1
信息
- ID
- 3583
- 时间
- 3000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者