双栈排序 noip2008
2016-09-07 14:23
330 查看
首先可以看出第一个栈和第二个栈是没什么交集的,那么第一步是对这些元素分别归到两个栈里,
当存在k使i<j<k,a[k]<a[i]<a[j]时,i,j是不能放在一个栈里的,需要一种数据结构表示这种关系,建成图,用二分图的方法判断一下,尽量放到第一个栈里面;
然后就是模拟一下;
自己写无从下手,只好看别人题解后发上来;
View Code
因为看别人代码写的,所以比较类似。
当存在k使i<j<k,a[k]<a[i]<a[j]时,i,j是不能放在一个栈里的,需要一种数据结构表示这种关系,建成图,用二分图的方法判断一下,尽量放到第一个栈里面;
然后就是模拟一下;
自己写无从下手,只好看别人题解后发上来;
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<iomanip> #include<cstdlib> #include<stack> using namespace std; const int maxn=1000+5,inf=2000000000; int n,a[maxn],ma[maxn][maxn],f[maxn],color[maxn]; void NO_ANSWER(){ printf("0"); exit(0); } int x[maxn],y[maxn],topx=0,topy=0; void dfs(int x,int c){ color[x]=c; for(int i=1;i<=n;i++){ if(ma[x][i]){ if(!color[i])dfs(i,3-c); else if(color[i]==c)NO_ANSWER(); } } } void init(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); f[n+1]=inf; for(int i=n;i>=1;i--)f[i]=min(f[i+1],a[i]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(a[i]<a[j]&&f[j+1]<a[i]) ma[i][j]=ma[j][i]=1; for(int i=1;i<=n;i++)if(!color[i])dfs(i,1); } void work(){ int now=1; for(int i=1;i<=n;i++){ if(color[i]==1){ x[++topx]=a[i]; printf("a "); } else { y[++topy]=a[i]; printf("c "); } while((topx&&x[topx]==now)||(topy&&y[topy]==now)){ if(topx&&x[topx]==now){ topx--;printf("b "); } else {topy--;printf("d ");} now++; } } } int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); init(); work(); return 0; }
View Code
因为看别人代码写的,所以比较类似。
相关文章推荐
- NOIP 2008 双栈排序 二分图
- [栈 二分图染色] NOIP2008 双栈排序
- 【提高组NOIP2008】双栈排序 (twostack.pas/c/cpp)
- NOIP2008第四题 双栈排序 分析
- [NOIP2008] 提高组 洛谷P1155 双栈排序
- 1812. 【提高组NOIP2008】双栈排序 (twostack.pas/c/cpp)
- 【NOIP2008】洛谷1155 双栈排序
- [NOIP2008]双栈排序
- NOIP 2008 双栈排序
- NOIP 2008 双栈排序 (COGS 221) 二分图
- 洛谷 1155 [NOIP2008] 双栈排序 二分图染色+模拟
- NOIP2008 双栈排序 染色+模拟
- noip2008 双栈排序 (二分图染色)
- 洛谷 P1155 [NOIP2008 T4] 双栈排序
- 【NOIP2008提高组T4】双栈排序-二分图染色
- 【NOIP2008】【二分图染色】T4 双栈排序 题解
- NOIP2008【双栈排序】
- NOIP 2008 双栈排序 解体报告
- Noip2008传纸条题解
- 传纸条 NOIP2008 洛谷1006 二维dp