差分
POJ3263_Tallest Cow
描述
Farmer John 有N头牛排列成一排,当两头牛i,j之间的牛身高都小于它们时,这两头牛可以看到对方。
现在,知道最高的牛的编号是I,身高为H,以及R对可以相互看到对方的牛的编号。
在让每头牛都尽可能高的情况下,求出所有牛的身高。
数据范围
1 ≤ N ≤ 10,000
1 ≤ H ≤ 1,000,000
0 ≤ R ≤ 10,000
思路
一开始,我们不妨让所有牛的身高都相等。
每当我们得知,牛i可以看到牛j时,我们知道区间[i+1,j-1]
之内的所有牛的身高都小于牛i,牛j的身高,为了让每头牛的身高都尽可能地大,我们不妨给这个区间内的所有牛的身高减1。
先建立一个数组来存储身高的差分,这样每次知道i,j相互看见时,只需要执行两次就可以了。
这道题的坑在于:相互看到的信息有可能是重复的。比如1能看到2,这条信息可能会被输入多次,而我们只需要减去一次1就可以了。由于数据规模较大,我们不能使用二维数组来存储某条信息是否已经处理过,而是使用map。
解决
1 |
|
前缀和
CH2101_可达性统计
描述
给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。N,M≤30000。
思路
拓扑排序,然后按逆序走,记录每一个点能到达的节点。
为了使那么多点可以存得下,使用bitset
拓扑排序
有向图的拓扑排序实在是太经典的算法了,而且似乎还挺常见。记得我最后一次CSP的C题就是拓扑排序,点亮数字人生。
做法是,统计每个点的入度di并维护一个栈,如果di是0,进栈。
栈不空时,取出栈顶进入队列,栈顶的所有后继点j,进行dj-1,如果dj变成了0,进栈,同理。
最后得到的队列就是拓扑排序的结果。
bitset
bitset真是神奇的数据结构,它可以存储一堆1位的比特,常用的函数有:
reset(x)将每一位都设为x
count()统计1的个数
然后,bitset可以支持按位与,或,异或,非等操作,也支持下标访问。
解决
1 |
|
备注
这题没有用bitset的时候,用的是整形变量来存储可达性,可能for循环开销太大了吧,不如内置的count和位运算好用,总之一直超时。
结果后面数独的搜索题,我用bitset又反倒不如整形好了,可能抽象类型建立和析构开销太大了吧,内置的东西,咱也不知道。
总之挺离谱的,有时候好用有时候就不行。