Page 1 of 212

NOIP2008 传纸条 费用流建模

競賽題解 12 Comments »993 views

把问题抽象成图论问题,数学模型是求从S到T的两条不相交的路径,使得路径上点的权值之和最大。

费用流建模,首先拆点,把顶点i拆成i.a和i.b,i.a 与i.b之间连接一条费用为“好心值”,容量为1的有向边,特殊地,左上角和右下角两个节点拆分后点内边容量设为2,因为我们要找两条不相交路径。i右边和下边的节点j,连接一条(i.b,j.a)费用为0,容量为1的有向边。

求最大费用最大流即可,费用流值就是要求的结果。比动态规划运行得快,空间占用少。
Read the rest of this entry »

标签:, , ,

新年之交-2009

生活點滴 5 Comments »134 views

现在我正处在2008年和2009年的交界处,在这个时刻,回望2008,展望2009,是最合适不过的了。

想一想2008年,我的大事都是围绕OI展开的,一月 冬令营,二月 新年,三月 COGS,四月 省选,五月 APIO和CTSC,六月 省选加试,七月 省队培训,八月 NOI,九月 参悟动态规划,十月 NOIP模拟,十一月 NOIP2008,十二月 POI。

也许在今后的日子中,没有一年会像今年一样,我在整个一年中把很大部分的精力投入到信息学竞赛中,不妨就称2008年为“OI年”吧。

2008年就匆匆地过去了,这一年来我变化了很多。我变得关心这个世界了,现在我十分关注从前很少的阅读新闻时评。我变得稳重了,很少再会因为一些小事而心情大起大落。我变得务实了,做事前我会充分地考虑实际情况。我变得大胆了,敢于为“天下先”,哪怕会遭到被人排斥。

2009年已经向我走来。2009年,将是我走向成熟的一年。到了2009年底,我就18岁了,我将成为一般意义上的一个成人。我要学会独立生存,学会为自己负责,学会承受压力。2009年,将会是我告别OI的一年,相信我一定会在NOI2009中以辉煌的成绩结束我的OI生涯。

2009,我已经准备好了。

标签:, , , , , , , ,

NOIP2008 双栈排序 twostack 题解

競賽題解 5 Comments »1,300 views

这道题的错误做法很多,但是实际在考场上,大多数人拿到了30分。错误做法却能得满分的也很多,正确的算法是基于二分图的算法。注意,不是二分图匹配!

分析条件,我们把问题抽象为数学模型。设输入序列为S,考虑S[i],S[j]两个元素不能进入同一个栈的条件.注意,这里所说的"S[i],S[j]两个元素不能进入同一个栈",不是说仅仅不能同时在一个栈中,而是自始至终不能进入一个栈,即如果有解,那么S[i],S[j]一定进入过的栈不同.

结论P: S[i],S[j]两个元素不能进入同一个栈 <=> 存在k,满足i<j<k,使得S[k]<S[i]<S[j].
证明略过,请参考sqybi.尝试后可以发现结论P是正确的.

把每个元素按照输入序列中的顺序编号,看作一个图中的每个顶点.这时,我们对所有的(i,j)满足i<j,判断是否满足结论P,即S[i],S[j]两个元素能否进入同一个栈.如果满足P,则在i,j之间连接一条边.

我们对图染色,由于只有两个栈,我们得到的图必须是二分图才能满足条件.由于要求字典序最小,即尽量要进入栈1,我们按编号递增的顺序从每个未染色的顶点开始染色,相邻的顶点染上不同的色,如果发生冲突,则是无解的.否则我们可以得到每个顶点颜色,即应该进入的栈.

接下来就是输出序列了,知道了每个元素的决策,直接模拟了.

在判断数对(i,j)是否满足P时,枚举检查是否存在k的时间复杂度是O(n),则总的时间复杂度是O(n^3),对于n=1000是太大了.这原因在于过多得枚举了k,我们可以用动态规划把枚举k变为O(1)的算法.

设F[i]为Min{S[i],S[i+1],S[i+2]..S[n-1],S[n]},状态转移方程为F[i]=Min{ S[i] , F[i+1] }.边界为F[N+1]=极大的值.

判断数对(i,j)是否满足P,只需判断(S[i]<S[j] 并且 F[j+1]<S[i])即可.时间复杂度为O(n^2).

参考资料:sqybi的题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* 
 * Problem: NOIP2008 twostack
 * Author: Guo Jiabao
 * Time: 2008.12.9 21:22:52
 * State: Solved 
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
 
using namespace std;
 
const int MAXN=1002;
const int INF=0x7FFFFFFF;
 
class tStack
{
	private:
		int top;
		int S[MAXN];
	public:
		tStack() : top(0) {}
		void ins(int k)
		{
			S[++top]=k;
		}
		int tp()
		{
			return S[top];
		}
		void pop()
		{
			top--;
		}
};
 
int S[MAXN],F[MAXN],bel[MAXN];
bool adjm[MAXN][MAXN];
int N,top1,top2;
tStack T[3];
 
void init()
{
	int i;
	freopen("twostack.in","r",stdin);
	freopen("twostack.out","w",stdout);
	scanf("%d",&N);
	for (i=1;i<=N;i++)
	{
		scanf("%d",&S[i]);
	}
}
 
void noanswer()
{
	printf("0");
	exit(0);
}
 
void color(int i,int c)
{
	bel[i]=c;
	int j;
	for (j=1;j<=N;j++)
	{
		if (adjm[i][j])
		{
			if (bel[j]==c) //conflict : not a bipartite graph
			{
				noanswer();
			}
			if (!bel[j])
			{
				color(j,3-c); // color the opposite color 1<->2
			}
		}
	}
}
 
void dye()
{
	int i,j;
	F[N+1]=INF;
	for (i=N;i>=1;i--)
	{
		F[i]=S[i];
		if (F[i+1]<F[i])
			F[i]=F[i+1];
	}
	for (i=1;i<=N-1;i++)
	{
		for (j=i+1;j<=N;j++)
		{
			if (S[i]<S[j] && F[j+1]<S[i])
			{
				adjm[i][j]=adjm[j][i]=true;
			}
		}
	}
	for (i=1;i<=N;i++)
	{
		if (!bel[i])
		{
			color(i,1);
		}
	}
}
 
void solve()
{
	int i,should=1,s;
	for (i=1;i<=N;i++)
	{
		s=bel[i];
		if (s==1)
		{
			T[1].ins(S[i]);
			printf("a ");
		}
		else
		{
			T[2].ins(S[i]);
			printf("c ");
		}
		while (T[1].tp()==should || T[2].tp()==should)
		{
			if (T[1].tp()==should)
			{
				T[1].pop();
				printf("b");
				if (should!=N)
					printf(" ");
				should++;
			}
			else
			{
				T[2].pop();
				printf("d");
				if (should!=N)
					printf(" ");
				should++;
			}
		}
	}
}
 
int main()
{
	init();
	dye();
	solve();
	return 0;
}
标签:, , , ,

NOIP2008归来

競賽歷程 5 Comments »332 views

省评结果 AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA WAAAWWWWWW 330

今年题居然比去年还简单(前三题)。第四题郁闷了。

标签:, ,

NOIP2008集训

競賽歷程 No Comments »233 views

今天是正式开始集训的第一天,15号就是NOIP2008了。今天全体做了一套模拟题,感觉并不乐观。

总是觉得自己不在做题的状态上,要尽快调整!做Ural上动态规划有些日子了,感觉收益不小,要坚持下去!

标签:, ,
26 queries. 0.497 seconds. Designed by NattyWP .
Images by desEXign.