[noip2008]双栈排序
2015-07-17 13:42
316 查看
题解。。。网上都有
注意:
①为了找到i<j<k 且a[k]<a[i]<a[j]这样的k,只需用DP求出某个数后面最小的数即可
②染色的是点的下标,所以在栈中存数的时候存a[i]
③因为每次都是给原序列中的数先染1后染2,所以答案是字典序最小的
注意:
①为了找到i<j<k 且a[k]<a[i]<a[j]这样的k,只需用DP求出某个数后面最小的数即可
②染色的是点的下标,所以在栈中存数的时候存a[i]
③因为每次都是给原序列中的数先染1后染2,所以答案是字典序最小的
program tt; type point=record y,next:longint; end; var aim,l,i,n,la,lb,j:longint; f,sa,sb,a,head,color:array[1..1000]of longint; edge:array[1..2000]of point; function min(a,b:longint):longint; begin if a<b then min:=a else min:=b; end; procedure add(x,y:longint); begin l:=l+1; edge[l].y:=y; edge[l].next:=head[x]; head[x]:=l; l:=l+1; edge[l].y:=x; edge[l].next:=head[y]; head[y]:=l; end; procedure dfs(x,c:longint); var p:longint; begin color[x]:=c; p:=head[x]; while p<>-1 do begin if color[edge[p].y]=c then //冲突 begin writeln(0); halt; end; if color[edge[p].y]=0 then dfs(edge[p].y,3-c);//1,2两染色 p:=edge[p].next; end; end; begin read(n); for i:=1 to n do head[i]:=-1; for i:=1 to n do read(a[i]); f[n+1]:=maxlongint; for i:=n downto 1 do //DP,只要找它后面的最小的数就可以了 f[i]:=min(f[i+1],a[i]); for i:=1 to n-1 do for j:=i+1 to n do if (a[i]<a[j])and(f[j+1]<a[i]) then add(i,j); //染色 for i:=1 to n do if color[i]=0 then dfs(i,1); la:=0;lb:=0; aim:=1; //还要判断当前是否为要输出的那个数,不是就还要入栈 for i:=1 to n do begin if color[i]=1 then begin write('a',' '); la:=la+1; sa[la]:=a[i]; end else begin write('c',' '); lb:=lb+1; sb[lb]:=a[i]; end; while (la>0)and(sa[la]=aim)or(lb>0)and(sb[lb]=aim) do begin if (la>0)and(sa[la]=aim) then begin write('b',' '); la:=la-1; end else begin write('d',' '); lb:=lb-1; end; aim:=aim+1; end; end; end.
相关文章推荐
- Andorid 加固逆向分析
- shell 常用命令
- 取消进程释放资源
- 挨踢(IT)脱口秀--全角度精彩电视剧大搜罗
- 挨踢(IT)脱口秀--全角度精彩电视剧大搜罗
- HTTP与HTTPS的区别
- poj解题报告——1350
- 骑士cms最新全局SQL注入(官方奇葩修复案例)
- Centos 6 克隆导致网卡eth0变成eth1、及修改网卡名的方法
- 黑马程序员——正则表达式、反射
- BZOJ3711 : [PA2014]Druzyny
- 文件同步(rsync + inotify ) , sersync 镜像文件
- Unity json
- 网上商城之购物车的3种实现方式
- 动态绑定
- hdu 1007 Quoit Design
- 【转载】OmniGraffle (五)对象的控制
- LeetCode#204 Count Prime
- 常用正则表达式
- ViewDragHelper让你处理View拖动时,代码减半!