由于SGU上神题遍地,特列此表,便于训练时分类训练。
101 Domino 欧拉路
102 Coprime 枚举/数学方法
103 Traffic Lights 最短路
104 Little Shop of Flowers 动态规划
105 Div 3 找规律
106 The Equation 扩展欧几里德
107 987654321 Problem 找规律
108 Self-numbers II 枚举+筛法递推
109 Magic of David Copperfield II 构造
110 Dungeon 计算几何+模拟
111 Very Simple Problem 模拟笔算开方
112 a^b-b^a 高精度
113 Nearly Prime Numbers 判质数
114 Telecasting Station 找中位数
115 Calendar 模拟
116 Index of Super-prime 动态规划
117 Counting 快速幂
118 Digital Root 模拟
119 Magic Pairs 枚举
120 Archipelago 计算几何
121 Bridges Painting 构造
122 The Book 构造哈密顿回路
123 The Sum 递推
124 Broken line 计算几何
125 Shtirlits 搜索
126 Boxes 数学方法
127 Telephone directory 统计
128 Snake 并查集 + 树状数组
129 Inheritance 计算几何
130 Circle 卡特兰数
131 Hardwood floor 状态压缩动规
132 Another Chocolate Maniac 状态压缩动规
133 Border 贪心
134 Centroid 树型DP
135 Drawing Lines 找规律
136 Erasing Edges 数学方法
137 Funny Strings 构造
138 Games of Chess 构造
139 Help Needed! 数学方法
140 Integer Sequences 扩展欧几里德
141 Jumping Joe 扩展欧几里德
142 Keyword 枚举
143 Long Live the Queen 树型DP
144 Meeting 数学方法
145 Strange People 二分答案+搜索
146 The Runner 数学方法
147 Black-white King 枚举
148 B-Station 枚举+快排/二分/堆
149 Computer Network 树型DP
150 Mr. Beetle II 枚举
151 Construct a triangle 计算几何构造
152 Making round 构造
153 Playing With Matches 动态规划+找循环节
154 Factorial 二分 数学方法
155 Cartesian Tree 建笛卡尔树
156 Strange Graph 缩团+欧拉回路
157 Patience 搜索+开表
158 Commuter Train 枚举
159 Self-replicating Numbers 扩展队列+高精度
160 Magic Multiplying Machine 动态规划
161 Intuitionistic Logic 搜索*
162 Pyramids 数学方法
163 Wise King 模拟
164 Airlines 贪心
165 Basketball 构造
166 Editor 模拟
167 I-country 动态规划
168 Matrix 动态规划
169 Numbers 数学方法
170 Particles 贪心
171 Sarov zones 贪心
172 eXam 判断二分图
173 Coins 高斯消元
174 Wall 并查集+Hash
175 Encoding 搜索/动态规划
176 Flow construction 上下界网络流
177 Sqare 倒序染色
178 Chain 数学方法
179 Brackets light 找规律
180 Inversions 归并排序/高级数据结构
181 X-Sequence 找循环节
182 Open the Brackets 搜索
183 Painting the balls 动态规划优化
184 Patties 直接计算
185 Two shortest 网络流
186 The chain 贪心
187 Twist and whirl -- want to cheat 块状链表
188 Factory guard 数学方法
189 Perl-like Substr 模拟
190 Dominoes 二分图匹配
191 Exhibition 贪心
192 RGB 离散化 + 统计
193 Chinese Girls' Amusement 数学方法 + 高精度
194 Reactor Cooling 网络流
195 New Year Bonus Grant 贪心
196 Matrix Multiplication 数学方法
197 Nice Patterns Strike Back 动态规划+矩阵
198 Get Out! 计算几何
199 Beautiful People 最长非降子序列
200 Cracking RSA 高斯消元
201 Non Absorbing DFA 动态规划
202 The Towers of Hanoi Revisited 动态规划构造
203 Hyperhuffman 贪心
204 Little Jumper 二分+数学方法*
205 Quantization Problem 动态规划
以下分类收集于网络:
动态规划
sgu104
sgu168
sgu116(结合筛法的背包)
sgu132(状态压缩dp)
数学
sgu117(分解质因数)
sgu118(高精度)
sgu181(循环数列)
sgu154(递推)
sgu130(递推)
sgu107(找规律)
sgu108(筛法)
sgu144(数形结合)
sgu124(射线法)
sgu136(线性方程组求解)
sgu120(复数与向量旋转)
sgu139(15数码有解的充要条件)
sgu119(二元同余方程)
sgu109(染色和构造)
sgu355(找规律)
sgu126
sgu197(矩阵乘法)
sgu153(博弈数列与周期)
贪心构造
sgu165
搜索
sgu140(广搜)
sgu179(dfs树与字典序)
sgu125(优化)
分治
sgu175
sgu180(逆序对统计)
sgu133(排序)
sgu114(带权中位数)
图论
sgu172(二分图判定)
sgu143(树形动规)
sgu134(树形动规)
sgu190(匹配)
sgu122(哈密顿圈构造)
sgu149(树形动规)
sgu195(树形动规)
sgu185(可行流和建模)
数据结构
sgu177(矩形切割)
sgu174(并查集和哈希)
sgu128(树状数组和并查集)
sgu187(伸展树运用)
sgu143(哈希)
经历了若干打击之后。。。。。我发现自己的题量实在太小了。。。。加上我认识的神犇几乎都是怒切sgu的,开学之后就去sgu水水好了。。。
这一篇长期更新。。。。说不定很久以后就会成一个sgu分类了囧。。。。。当然前提是NOI的时候RP大爆发?。。。。
101: 欧拉路,USACO上有类似题目,从一个点开始搜然后删掉所选边出栈的时候扔到Ans里就可以了
102: 筛法求欧拉函数
105: 显然模3的结果是1,0,0,1,0,0。。。。。于是答案就是n/3*2+(n%3==2)
106: WA*inf。。。首先注意a,b可能为0的情况。。。然后为了方便起见把a,b搞成正数,然后exgcd算出一组解,把x调成x范围内最小的,这时候如果y小于y1无解,否则如果y大于y2,把y调到不大于y2的第一组解,如果此时x大于x2无解。然后算个调整的最小值就行了
107: 8位数中平方以后末尾是那个的只有8种,没了
108: 这种打表题还卡内存什么的最讨厌了。。。。。注意到数位和不大于63然后把被排除的比当前数大的记录一下,然后扫一下判断。
109: 构造题。。。注意到你指定了一个K观众只能站在某些对角线上,于是稍微构造一个n+1步每次删对角线的方法即可
111: 首先我不会模拟开方,于是写了个二分,然后TLE,然后压位,压四位似乎会爆int,压3位AC。。。。写的时候无限怨恨为什么多开点语言比如python。。。。。Java不会然后一google大家纷纷表示Java无压力有一种扔键盘的冲动。。。。。。
112: 裸高精。。。可我还不会写模板T_T
113: 直接判就行了。。。为什么那么多人说要搞素数测试。。。。
114: 显然可以安置的地点是一段区间,倘若向右移x,则增加的代价为 左边人数和减去右边人数和 , 只要按坐标排序线性扫下就行了
115: 编程入门模拟题
116: 筛出super_prime然后BFS。。。。貌似直接背包空间不够
117: 还是筛质数,然后指数乘上m后和k的指数比较
118: 显然那一堆操作就是求对9的余数(余数为0就是9),然后这个式子可以O(n)边模边算
120: 这题把我搞毛了。。。首先算出中心到顶点的距离,很容易,然后由于我想偷个懒于是计算法向量,但是一个问题是觉得判断向量的方向的情况实在有点多(此处WA*10略过)。。。。。。干脆直接暴力选一个方向算一遍看对不对,不对的话就一定是另一个方向了
122: 由于任意两个点度数之和不小于N,于是哈密顿路一定存在,可以得到一个O(n^2)的构造:找一条链,如果链能头尾相连则变成环,若不能则拆为连续的两端8字相连成环,然后从环外的点里找一个插进去,变成链,如此反复即可
123: 编程入门题
124: 判断一个点是否在多边形内。。。经典做法是往无限远处引一条射线,然后O(n)判断与多边形的交点个数,奇数在多边形内,偶数在多边形外。当然其中涉及一些比较讨厌的讨论,然后我就偷懒把坐标系旋转了一下然后再判水平,然后就过了。
125: 裸搜,加个可行性剪枝就行了
126: 大家纷纷表示这是数学题,但是我不会推导。。。直接模拟100W次没了。。。。。
127: 编程入门题
128: 易知连接方式唯一,只要判无解就可以了。连通性在每个点维护一个并查集就行,显然每条扫描线偶数个点,最后判相交,用一个线段数维护一下(类似面积并和周长并)
130: Catalan数
131: 状压DP,DFS出每层连通情况有一种非常漂亮的写法,需要仔细研究参数变化,详见周伟论文《状态压缩》
133: 一维排序一维set
134: BFS,重心至多2个
135: 编程入门题
136: 由中点公式得到一堆方程,n为奇数解法显然,n为偶数重点就是判无解,因为若有解则有无穷多组,随意给一组即可。只要一正一负累加系数判断是否为0
138: 我一直想找到一个可以判无解的构造。。。。最后放弃了。。。。有解的构造比较简单,就是贪心,次数大于1的时候安排成胜,否则输个局数次大的那个继续安排
139: 15数码判无解。。。其实若有解的话写个(ID)A*之类的应该还是可以很快出解的,但遇到无解就卡死了。。。。判断方法是看每个数码出现在哪里然后计算逆序对数+光标步数,可以发现排列之后若计算结果为偶数则任意情况之间互相可达,故必有解
140: 扩展欧几里得。我们知道方程ax+by=gcd(a,b)必有解,根据这个思路我们只要判断gcd(gcd(a[i]),p)是否是b的约数即可判断是否有解,然后的工作就是根据每次exgcd过程更新b就行了
141: 还是数论题。首先exgcd计算出一组解,然后为了保证有解要找到abs(x)+abs(y)最小的一组,由于x1,x2,p都很小直接用循环就行了。这个时候考虑奇偶性,如果x+y与k的奇偶性不同,若x1-x2为偶数则无解,否则调整一下。然后找到一组解,然后把剩余的步数等大的累加上去
142: 先说对数级做法。显然我们知道答案长度是不超过logN+1的(一个不可达的下界是2^(logN)+logN-1 = N + logN - 1>N),然后枚举答案ans,枚举长度为ans的串看是不是所有的串都出现过,这样的话最坏枚举O(logN)次,每次O(N),复杂度是O(NlogN)的。但是这题是有线性做法的。因为我们做的事情不过是一个多串匹配罢了,由于特殊性AC自动机会变成一棵满二叉树(不算fail指针)。然后直接匹配,枚举那个最短的没被匹配到的串。
143: 基础树形DP f[i] = a[i] + sum(max(f[j] , 0))
144: 这题不会请出门右转自学高中有关概率的内容
145: 计算简单路径中的K短路。关于K短路有很多十分愉悦的算法,比如A*(常用),扩展版的dijkstra/SPFA,偏离搜索等等。不过如果使用A*的话,那么不能保证简单路径。由于N,K都比较小考虑搜索,虽然N<=100,但是路径数量事实上最多是O(2^N)级别的,因此我们加一个二分,这样的话搜索时就可以利用一个预处理出的最短路进行剪枝了。
146: 如果不知道怎么做。。。。。T_T。。。。主要是一个取模的问题,直接用实数会囧,由于L只保留4位于是把它放大10000倍做。至于网上说的那个要加一个极小的数才能过其实是因为实数读入有时会把4读成3.999999999之类的,加个1e-6再乘就行了
147: 这题恶心死我了。。。。。首先我们假设所有人都要在x方向靠拢(否则旋转),然后黑白王所到达的地方是一个正方形边框,接着去模拟就行了。。。因为x是确定的,只要注意y方向是否可达
148: 从底向上做,显然如果破坏一层的话向下的最优值是可以做出来的,然后用一个set乱记录一下就行了
149: 求树中每一点离他最远的点的距离。求最远点的方法有DP和两次DFS两种,显然这里每次都DFS是不现实的。我们这么分析,首先以1个点为根,然后可以计算出以i为根的子树中从i开始的最长路和次长路。然后我们需要计算减去以i为根的所有子树后,距i的最大值。那么显然要么是从到达父节点的这条最长路下来,要么是在以兄弟节点为根的子树中的最长路里找一条再到达父节点再下来。两次DFS。
151: 学过解析几何应该都能直接算出坐标公式以及无解条件。。。。。一开始没注意到输出的三个点有顺序要求狂WA TEST2。。。。样例不厚道。。。。
152: 先取个下整看还缺多少个1,然后根据舍掉的小数部分按从大到小分配1
153: 居然被我乱猜出来了。。。由于m , p都较小,而n非常大,猜想有循环节,然后就行了(必胜态必输态可以递推也可以记忆化)
154: 二分,这题就是求因子5的个数,利用二分加速。判无解的时候看二分出来的答案和要求的那个是不是一样的就行了
155: 构造笛卡尔树。这是有O(n)的方法(不考虑排序)的但是我不会。。。二叉排序树的中序遍历是递增的,因此按K排序,然后我们要高效回答最小值,可以用ST(反正都排序了再加个O(nlogn)的预处理也没什么) , 这样的话构造的过程就是O(n)了。
156: 显然关键点是那些度数为2的点,剩下的每一小块可以用并查集合并缩点,这样就变成了求欧拉回路了,不过细节有点多
157: 一看就是搜索打表题。。。。。。。虽然这个方法十分暴力但似乎找不到更好的了,集训队作业中大家纷纷打表。。。。
159: 这题需要有一些灵感(或者叫观察力),假设一个答案是t*b^(n-1)+x , 那么它的平方就是t*t*b^(2n-2) + 2*t*x*b^(n-1)+x*x ,这就表明了它的后n-1位实际上是由一个n-1位的数x的平方确定的,因此x就是n-1时的一个合法解,因此可以从低到高搜索
160: 那个65536看的我泪流满面啊!!!!! O(mn)的判定DP(或者叫搜索?),记录一下由什么状态转移
162: 搞一个空间直角坐标系推坐标
163: 编程入门题
165: 只要注意到减2后身高在[-0.05,0.05],而此题要求为任意一个子区间和在[-0,1,0.1]内,恰好就是0.05-(-0.05) 于是如果当前非负就排最矮的,当前为负就排最高的
187: 裸的splay。。。。。块链也行。。。。纯练手题
100 A+B
Author: Amber
Method: Add Directly
101 Domino
Author: Amber
Method: Euler Path
Complexity: O(N^2)
102 Coprimes
Author: Amber
Method: Calcuate Euler Function
104 Little Shop of Flowers
Author: Amber
Method: DP
Complexity: O(N^2)
105 Div 3
Author: Amber
Method: Maths
Detail:
Consider the head of the sequence.
Number: 1 12 123 1234 12345 123456 1234567 12345678 …
Mod 3: 1 0 0 1 0 0 1 0 …
The loop is (1 0 0).
106 The Equation
Author: Amber
Method: Math
Detail:
简单,但麻烦的题,考虑问题要周全。
1.先把A或B为0的情况排除。
2.用extended_gcd找到一组(x0,y0), s.t. A*x0+B*y0=D, D=GCD(A,B)
3.方程有解冲要于D|C
4.A=A/D,B=B/D,C=C/D
5.x0=x0*(-C),y0=y0*(-C)
6.把 x=x0+t*B, y=y0-t*A 带入 x1<=x<=x2, y1<=y<=y2
x1-x0<=t*B<=x2-x0
y0-y2<=t*A<=y0-y1
把A,B除过去时要注意是否变号
7.得到t的范围,输出
Notice:
1.做A,B不等式除法时要注意是否变号
2.不要吝惜Int64
107 987654321 problem
Author: Amber
Method: Maths
Detail:
When N = 9, there exists 8 solutions by maths method or search program.
When N = 10, the first digit is in range (1 – 9). So 8 * 9 = 72.
When N > 10, insert a digit in range (0 – 9) into the second digit of the solution with (N – 1) digits. So Ans = 72 * 10^(N – 10)
108 Self-numbers II
Author: Amber
Method: Filter
Version: 1 (Filter)
Detail:
Do filtering as filtering primes: N generates D(N) and filters D(N) from small to large.
1)Cuz D(N)-N<=9*lgN, use Loop queue O(9*lgMaxN) in memory.
2)Pre-calculate the digit sums from 0000 to 9999 to Sum.
So the time of D(N) is reduced from O(lgN) (digit by digit)
to O(2) (4 digits by 4 digits, and N is O(10^7))
3)sort the query
Complexity: O(Sqrt(MaxN)*lgSqrt(MaxN)) for pre-processing the sum
O(MlogM) for sorting the querys
O(N) for filtering
Real time: 1134 ms
Notice:
1)It's Read not Readln.
2)There may be two same querys!!
111 Very simple problem
Author: Amber
Method: Sqrt with HP
Detail:
Y=Sqrt(X), 设 |X| = N,则 |Y| <= N / 2
从高位到低位,枚举Y的每位数字Yi,直到Y^2恰好<=X (即这位取Yi + 1时,Y^2 > X)
State:
253102 19.12.04 13:14 hupo001 111 .PAS Accepted 197 ms 89 kb
112 a^b – b^a
Author: Amber
Method: Simulate by HP
113 Nearly prime numbers
Author: Amber
Method: Find prime divisors
Notice:
P = P1*P2 (P1 may be equal to P2)
114 Telecasting station
Author: Amber
Method: Enumerate
Detail:
It's easy to prove that the station must be in some city.
Notice:
WA too many times cuz of position may not a integer.
115 Calendar
Author: Amber
Method: Simulate
117 Counting
Author: Amber
Method: Prime Decompose
Detail:
K is decomposed to the formal of Product[Pi^Ai].
For each T, it will be decomposed to the same formal of Product[Pi^Ti].
if Ti * M >= Ai then count.
118 Digital root
Author: Amber
Method: Maths
Detail:
1.Digital Root is equivalent to "Specially Modulo 9" (replace 0 with 9).
2.A1*A2*…*AN + A1*A2*…*AN-1 + … + A1*A2 + A1
=A1*(A2*…*AN + A2*…*AN-1 + … + A2 + 1)
=A1*(A2*(A3…*AN + A3*…*AN-1 + … + A3 + 1) + 1)
=…
=A1*(A2*(A3(…*(AN + 1)… + 1) + 1) + 1)
So we can use O(N) to solve it.
Complexity: O(N)
119 Magic pairs
Author: Amber
Method: Math
Detail:
预处理:
令T=(A,B,N), A=A/T,B=B/T,N=N/T,
现在(A,B,N)=1,它的解原来原来的解可以一一对应: 解(A,B)->解(A*T, B*T)
以下都是在mod N意义下的,k为正整数
证明: 解(kA,kB) (0<=k<n) 就是问题的全部解<br=""> kA 能取 P=[A,N]/A 个值,同样 kB 能取 Q=/B 个值, 这样 解(kA,kB) 能取[P,Q]个值。
下证 若(A,B,N)=1 则[P,Q]=N
由AB=(A,B)[A,B] 得P=N/(A,N),Q=N/(B,N)
又得 (A,N)*P=(B,N)*Q=N
又由(A,B,N)=((A,N),(B,N))=1,得[P,Q]=N
123 The sum
Author: Amber
Method: Simulate
124 Broken line
Author: Amber
Method: Geometry Count
Detail:
It's a classical problem in geometry:
Query whether point R(x,y) is inside a simple polygon.
for each segment P(x1,y1)-Q(x2,y2) here x1<=x2
if x1<=x if det(PQ,PR)>0 then
count++
if odd(count) then "inside" else "outside"
Do something special for "border" case.
Complexity: O(N)
125 Shtirlits
Author: Amber
Method: Brute-force
Detail:
Range is too small, Brute-force!!!
My program is slow.
If providing search order, it can be more optimal.
126 Boxes
Author: Amber
Method: Maths + Simluate
Detail:
S = A + B
127 Telephone directory
Author: Amber
Method: Simulate
130 Circle
Author: Amber
Method: DP
Detail:
A diagonal can divide the graph into two parts.
These parts are still the same as the original problem.
Complexity: O(N^2)
131 Hardwood floor
Author: Amber
Method: Set-DP
Detail:
State (N,K) (0<=K<2^M) denotes that the current is in n-th lines and the plan of (n-1)-th lines is K.
Transfer: K->K' by DFS
There are 7 transfers in total.
1: 2: 3: 4: 5: 6: 7: do noting
** ** * * *
* * ** ** ** *
in my program,
"Pow and Prev" gets the depth-th value of the last line.
"Pow shl 1 and Prev" gets the (depth-1)-th value of the last line.
Complexity: O(N*2^M*R)
R is average transfer times.
Notice:
1)把转移事先都处理好
2)使用queue向后递推的方式,可以减少DP初期的冗余(初状态只有一个!)
3)由于有queue,DP数组球没有必要每次都filchar.用了一个状态后,清0即可.
133 Border
Author: Amber
Method: Sort and Count
Complexity:
O(nlogn) for sort
O(n) for scan
135 Drawing Lines
Author: Amber
Method: Simple Maths
137 Funny Strings
Author: Amber
Method: Construct (Maths)
Detail:
记N个和为M数组成的Funny string为F(N, M)
if N <= M then
F(N, M mod N) + M div N
if N > M then
问题就是由M个1与N-M个0组成的Funny String。
它的第i个0后有F(N – M, M)中的第i个数个1。
i.e.
对于Funny string 0101101011011,统计每个0后1的个数得:
1,2,1,2,2,依然是个Funny string.
138 Games of Chess
Author: Amber
Method: Construct
Detail:
把数据排序,由于保证有解,最多场的那个人不会超过总和的一半(不会自己和自己比).
所以按以下方法填掉第一列(第一列为win,第二列lose)
即按场次从大到小依次填入第一列,若只剩一场就填到第二列去.
win lose
x
x
x
y x
y
z y
z
…
最后把剩下的填到第二列没填的地方.
Complexity: O(N)
140 Integer Sequences
Author: Amber
Method: Maths (Number Theory)
Complexity: O(N)
Detail:
解n元线性模方程
1.先做整理
Sum[Ai*Xi | 1<=i<=N] = B (mod P)
=> Sum[Ai*Xi | 1<=i<=N] + P*X0 = B
将P用A0代换,即令A0=P
=> Sum[Ai*Xi | 0<=i<=N] = B
2.逆推,分步迭代
先把最后一项整理出来
=> Sum[Ai*Xi | 0<=i<=N-1] + AN*XN = B
将前面的项用他们系数的GCD代换 Sum[Ai*Xi | 0<=i<=N-1] = GCD[Ai | 0<=i<=N-1]
=> GCD[Ai | 0<=i<=N-1] * T + AN*XN = B
通过Extended_GCD(GCD[Ai | 0<=i<=N-1], AN, T, XN) = GCD[Ai | 0<=i<=N], 解得(T, XN)。
而Sum[Ai*Xi | 0<=i<=N-1] = GCD[Ai | 0<=i<=N-1] 又是一个N-1规模的子问题,
最后只要将这个子问题的解 * T 就可以了。
3.综上易知有解充要条件是:B被GCD[Ai | 0<=i<=N]整除
符号:
这里 GCD[A1, A2, ..., AN] = GCD[A1, GCD[A2, GCD[..., GCD[AN-1, AN]]]]
Extended_GCD(A, B, X, Y)的结果是(X, Y)使得AX+BY=GCD(A,B).
142 Keyword
Author: Amber
Method: Enumerate + Encode
Detail:
1.Enumerate the length of answer Len increasing.
2.Encode the substrings with length Len in string, label it in table.
3.Enumerate unlabeled substrings with length Len, if not exists, goto 1.
Complexity: O(N)*O(2^MaxCodeLen)
145 Strange People
Author: Amber
Method: Binary Search + DFS
Detail: K短路问题
利用二分答案转为判定性问题,这样由于K比较小,每次只要搜K条就可以了。复杂度为O(NK)的。
还可以利用最短路标号来剪枝。
Complexity: O(NKLogW)
148 B-Station
Author: Amber
Method: Enumerate+Optimize
Detail:
确定了减压的第一层,就可以模拟出来一个计划了.O(n)
枚举所有的减压的第一层,计算出计划的价格,取最优。
单调性优化:从下往上处理, 注意到所有层都只可能从付钱到不付钱。
Sum(i)=SUM(Water(i)|i=n to i)
j为当前枚举层, 对于i>j,若有 Limit(i)<sum(j)-sum(i+1),则扣掉第i层的钱。
这可以通过排序Sum(i+1)+Limit(i)实现。
Notice:
It will get MLE at 4 by QuickSort. (1349 kb)
It got AC by Heapsort. (449kb)
150 Mr. Beetle II
Author: Amber
Method: Enumerate + Maths
Detail:
Some useful testcase for me
Input: 8 1 1 9 4
Output: 6 3
151 Construct a triangle
Author: Amber
Method: Simple Geometry
Detail:
The median formula is 2a^2+2b^2-c^2=4m^2.
AC=BD, So 2*AM=AD<=AB+BD=AB+AC, 2*AM=AD=>AB-BD=AB-AC.
A
/|\
/ | \
/ | \
B—M—C
\ |
\ |
\|
D
Notice:
The area of the triangle can be equal to zero!
153 Playing with matches
Author: Amber
Method: DP and Find Loop
Detail:
1.Simple DP
F(n)=true if exists one di s.t. F(n-di) is false
false else
2.Find Loop
Let max be the maximum of the taken number.
Consider case n>max.
Let prev_state(n) store the binary code of F(n-max) to F(n-1) with length max.
If prev_state(i)=prev_state(j) (i<j), then="" we="" find="" the="" loop="" that="" is="" from="" f(i)="" to="" f(j-1).<br=""> Complexity: O(Min(2^M,N))
154 Factorial
Author: Amber
Method: Math
Detail:
Problem is
given Q and to find N s.t. …+[N/5^4]+[N/5^3]+[N/5^2]+[N/5]=Q -(*)
Let N=5X, write X in 5-base:
X=…+ 5^3*x3 + 5^2*x2 + 5*x1 + x0, xi=0..4
X into (*) => Q=… + (5^3+5^2+5+1)*x3 + (5^2+5+1)*x2 + (5+1)*x1 + x0
Let sum(i)=sum(pow(j)|j<=i)
Algorithm is known:
for each i from high to low digit
1.xi=Q div sum(i)
2.if xi>4 then no answer
3.Q=Q mod sum(i)
Notice
When Q=0,output 1 (not 0).
155 Cartesian Tree
Author: Amber
Method: Construct Cartesian Tree in Linear Time
Complexity:
Sort: O(nlogn) + Construct: O(n)
Detail:
Cartesian Tree(CT)
这里称Auxiliary为Proirity(优先级, Pro)
先将节点按key排序,得到CT的中序遍历。
下面是CT的线性时间构造:
设Ci是T[1...i]的笛卡尔树。
1.第i+1个结点一定属于Ci+1最右侧的路径。
(若不考虑优先级,第i+1个结点为最右侧的最右端点。)
2.自下而上检查最右路径,找到第一个优先级低于第i+1个结点的结点p.
p的右子树作为第i+1个结点的左子树.
使第i+1个结点成为p的右儿子.
可以证明每个节点最多被检查1次,因为只要在最右路径上的点被检查不是新节点的父亲,
就要转移到新节点的左子树中,不会再被检查到。
所以本算法是线性的。
Real Time: 246 ms
156 Strange Graph
Author: Amber
Method: Euler Path + Contraction
Detail:
先理解这个图: 它是由若干个子完全图组成, 子完全图中的每个点有且只有一条链与其他的某个点(本子图或其他子图)相连.
求其hamilton圈,可以先把每个子完全图压缩成一个点(称为团),在这样压缩后的新图上做euler圈,最后再把团展开(入团点->出团点),就是hamliton圈了.
因为只有团才能为奇点,所以当只有0或1个奇团时问题才有解.
我程序中Edge为前向星的原边,GrpEdge为团指出去的边(前向星).这样比较方便处理.
Complexity: O(M)
158 Commuter Train
Author: Amber
Method: Enumerate
Detail:
The maximum may occur in the case that one certain person stands at mid-point of two adjacent doors.
Complexity: O(NM(N+M))
159 Self-Replicating Numbers
Author: Amber
Method: HP
Detail:
性质P: n位数x的平方后n位仍为x.称有性质P的数为"P数".
一个显然的推论: n位P数必要条件是它的后n-1位是P数.
于是: 枚举第n位,把的n-1位P数转移到n位的P数.
这样维护一个扩展队列就可以了
剩下是高精度的问题了
162 Pyramids
Author: Amber
Method: Geometry
Detail: See readme.gsp
163 Wise King
Author: Amber
Method: Greedy
164 Airlines
Author: Amber
Method: Math + Floyd
Detail:
A hard-think proposition:
Divide M into two parts A,B such that |A|,|B|<=(M+1) div 2.
A or B must satisfy the condition.
Its proof is in Zhou Yuan's solution.
Complexity: O(N^3)
165 Basketball
Author: Amber
Method: Construct(Greedy)
Detail:
If the current summation is negative, we add a positive number if we can, otherwise add a negative.
After adding a number, if the summation exceeded the limit, there must exist no solution.
The graphics of the current summation is a asway sequence between -Limit to Limit.
167 I-country
Author: Amber
Method: Complex-DP
Detail:
State (Line, Left, Right, GoLeft, GoRight, Remain)
"Line" denotes the current line of process.
"Left" and "Right" denotes the segment from "Left" bound to "Right" bound of the current line which are chosen.
"GoLeft" denotes whether the Left bound of the previous lines is lefter than the current's.
"GoRight" denotes whether the Right bound of the previous lines is righter than the current's.
"Remain" denotes how many cells remain to be chosen.
169 Numbers
Author: Amber
Method: Math
Detail:
Let n=abc…x
s.t. a,b,c…<>0
last digit x s.t. 1<=x<=8, otherwise p(n)=0 or p(n+1)=0
Let r=p(n)/x
Let k,k' (k<=k') s.t. n=krx -(1),
n+1=k'r(x+1) -(2)
Let k'=k+d
(1)(2) => krx+1=krx+kr+dr(x+1) => kr+dr(x+1)=1 -(3)
Prove k=k':
Let d>0
Cuz x+1>1, dr(x+1)+kr>1.Conflict, so k=k', d=0
d=0 into (3) => kr=1 => k=1, r=1
So n=111111…x (k-1 ones)
Let condition P(x) is that x | 111111…x.
If P(x) and P(x+1), then 111111…x is perfect.
P(1),P(2),P(5) are always true.
P(3)=3|111111…3 = 3|1*(k-1)+3 = 3|k-1
P(6)=2|111111…6 && 3|111111…+6 = 3|k-1
P(9)=9|111111…9 = 9|1000..00+…+1000+100+10+9 = 9|k-1
P(4),P(8) are true iff k=1.
P(7)=7|111111…7
num: 1111110 111110 11110 1110 110 10
mod 7: 0 6 1 4 5 3
Loop length is 6
so P(7)=6|k-1
170 Particles
Author: Amber
Method: Simulate
Detail: Count the distance between the '-' in two strings.
171 Sarov zones
Author: Amber
Method: Greedy
Detail:
1.Sort zones by level to Z
2.Sort students by weight to S
3.For each student S whose weight is from heavy to light,
If a non-full zone Z[j] whose level is the highest lower than S can be found, then S->Z[j].
else S isn't processed at this moment.
4.For each unassigned S, find any non-full zone Z[j], S->Z[j].
Complexity:
O(M^2) for sort zones
+O(NlogN) for sort students
+O(NM) for greedy
+O(N) for output
174 Walls
Author: Amber
Method: Disjoint-Set
Detail:
有序地给出不相交(可相接)的线段,求线段i,使得放入1,2,..,i后产生第一个闭区域。
由于只有相接情况,可以把端点作为元素,线段为合并条件。
若线段两端的点在合并前已经在同一个集合内,则闭区域出现,退出。
则可利用并查集实现。
下面就剩下查找重合点的问题,有如下几种方法:
1)可以用有序化点集,二分查找。 (预处理)
2)Hash (动态处理)
3)动态查找的数据结构 (Treap等) (动态处理)
1)AC了,2)AC了,3)没做
Version: 1 (Binary search)
Complexiy: O(MlogM) 这里把并查集的复杂度视为常数
176 Flow construction
Author: Amber
Method: Preflow + Binary Search
Detail:
The minimum flow with lower bounds.
在有下界网络流模型中建立的无源汇网络,有一个重要的性质。边(N, 1)的流值,等于当前网络中的总流值。
所以枚举边(N, 1)的上限,找到一个上限恰好使得所有必要弧都满流。这个上限就是最小流值。
由于满足单调性,所以可以二分枚举上限。
Notice:
The edge (N, 1) may appear in input.
So the flow of (N, 1) doesn't denote the flow of the network.
It should be divided into two part to think, which are a part of flow for input edge (N, 1)
and the other part of flow for denoting the flow of the network.
177 Square
Author: Amber
Method: Count by Next Pointer
Detail:
A classical problem.
Count by a next pointer array.
Complexity: O(N*(N+M))
178 Chain
Author: Amber
Method: Maths
Detail:
179 Brackets light
Author: Amber
Method: Construct
Clariry:
寻找最右边的可以变为")"的"("(记为x)(也就是x的之前有"("可以与改变后的x匹配),把它改成")"后
,再将它后面的括号排成"((((…))))"+"))..))"的形式。
"+"前的"((((…))))"保证了字典序最小
"+"后的"))..))"是为了与x前的"((..(("匹配的。
181 X-Sequence
Author: Amber
Method: Simulate and Find Loop
Detail: Find the loop of the sequence.
Complexity: O(M^2)
183 Painting the balls
Author: Amber
Method: DP with Optimization
Detail:
State (i,j) (1<=i<=n-1,1<=j<=m-1,i+j<=n) denotes last two black balls i, i+j //O(NM) for states
Transfer (i,j)=min (i-k,k) (i-k+m>=i+j, i-k>=1, k>=1) //O(M) for transfer
If N-M+1<=i, (i,j) is a finish state.
Optimization: //O(1) for transfer
Enumerate j from m-1 to 1, the range of k gets larger cuz of 1<=k<=m-j.
Set a var CurMin for each i which records min (i-k,k) for the larger and larger range of k.
Complexity: O(NM)
Memory: O(M^2)
Notice:
PreMod(i) is i mod M.
It's for scroll array.
185 Two shortest
Author: Amber
Method: Dijsktra + Ford Fulkerson
Detail:
1.It's an undirect graph G.
Dijkstra it!
If an edge (u,v) in G s.t. d(v) = d(u) + w(u,v) then it will remain in new graph G'.
G' is a graph that is shortest-path directed from G.
Namely, Now we get a directed graph G'. Any path from 1 to N in G' is a shortest path.
2.Find two augment paths by flow, and augment them.
186 The chain
Author: Amber
Method: Greedy
Detail:
Each time choose the minimal item, unchain the item to links.
Check if it's enough to chain remain chains.
187 Twist and whirl — want to cheat
Author: Amber
Method: Simulate discretely
Detail:
不断的拆分线段, 每次分裂出2个线段, 模拟即可.
Complexity: O(M^2)
188 Factory guard
Author: Amber
Method: Simulate
Detail:
1.Enumerate any i,j
2.Find first meeting distance Delta of i,j, and then they will complete a circle together for each meeting
So solve (Delta+Len*k)/(|Vi|+|Vj|)<=T, k is integer, k+1 is the number of i,j meeting.
Complexity: O(N^2)
189 Perl-like Substr
Author: Amber
Method: Simulate + String Processing
Detail: 关键就是把复杂Substr函数参数,转为平常的Copy函数的参数。
191 Exhibition
Author: Amber
Method: Simulate
Detail:
The statement is so hard to understand.
Abstract it as following:
Consider a sequence which consists of 4 kinds of chars – abAB.
There are two principles to change the sequence:
1.replace a with B or Aba
2.replace b with A or Bab
Does there exist a way to change a single element a or b at the beginning to a given sequence which consists of AB?
Consider the leftest a or b called P of inital state and the leftest A or B called Q of terminal state.
If Up(P)=Q, only use A->Aba or B->Bab
else only use A->B or B->A.
Simulate in that way by stack.
Complexity: O(N)
193 Chinese Girls' Amusement
Author: Amber
Method: Math
Detail:
Discuss:
Odd(N)
Ans=N div 2 , cuz GCD(Ans,Ans*2+1)=1
Even(N)
Odd(N div 2)
Ans=N div 2-1, cuz GCD(Ans,2(Ans+1))=1
Even(N div 2)
Ans=N div 2-2, cuz GCD(Ans,2(Ans+2))=1
194 Reactor Cooling
Author: Amber
Method: Preflow push
Detail: The feasible flow with lower bounds.
1.先将原图连接上边(N, 1),容量无限,组成无源汇网络。
2.建立一个超级源S,超级汇T。连接上边(T,S),容量无限,再次组成无源汇网络。
对于边(x, y), 容量下界l,容量上界h,应分离出必要弧(即一定要满足的下界)。
边(x, y),等价的变换为三条边(x, T) -> (T, S) -> (S, y)。他们容量均为l。
而分离出必要弧的(x, y)的容量为h-l。
3.去掉(T,S)。从S到T做最大流,若S或T的邻边都满流,则所有必要弧被满足,问题有解,否则无解。
4.还原所有必要弧,则问题还原成1中的无源汇网络。网络中的流值必定是一个可行解。
因为无源汇网络满足流量平衡,且所有必要弧都满流。
Notice:
Why???
第1步中连接上边(N, 1),不能AC。没有连接上边(N, 1),就AC了。
但不能解释下面这个数据。
3 2
1 2 1 3
2 3 2 4
连接上边,则有解;否则无解。
195 New Year Bonus Grant
Author: Amber
Method: Tree-DP
Complexity: O(N)
Detail: 每个节点分发送礼物(可以不发送)(记为0),还是收到礼物(记为1)讨论。
F(x, 1) = 1 + Sum[F(x.child, 0)]
F(x, 0) = Sum[F(x.child, 0)] + Max[F(x.child, 1) - F(x.child, 0)]
197 Nice Patterns Strike Back
Author: Amber
Method: Set-DP
Clarity:
Complexity:
198 Get Out!
Author: Amber
Method: Find circle and judge point inside polygon
Detail:
先将物体本身的大小r,加到障碍物的大小中去: R' = R + r。这样就可以把物体看成是一个点,问这个点是否被圆障碍物围住。
若两个圆有没有相交,则可以认为,人可以从他们之间穿过去;相交则不行。
所以若两个圆相交,则在圆心之间连一条线段,表示这条线段不能通过。问题转化为是否存在一个圈,将物体点围住。
主算法:枚举所有圈,再判断点是否在圈对应的多边形内(上)。
有2个问题:
1.枚举所有圈是NP的。(如完全图的圈数是N!)
我们利用DFS Tree得到的圈是O(M)级别的,少了的那些圈是什么?
考虑DFS Tree:(u是v的祖先, v是w的祖先)
|—|
Root …-u-a-v-b-w
|_______|
存在两条后向边, (w, v), (w, u)。
我们可以找到两个圈,(v, b, w, v),(u, a, v, b, w, u)。
少了一个圈:(u, a, v, w, u),发现是上面两个圈的一个合成。
如图:DFS Tree只能找到A, B两个圈,A, B的合成(外围的轮廓)是找不到的。
但本题要求判断点是否在圈内,若点即不在A, 也不在B,必然就不在A, B的合成内。
所以枚举所有圈是没有必要的,只要枚举DFS Tree得到的圈。
/—\ /—\
| A | B |
\—/ \—/
2.如何快速判断点是否在多边形内(上)。
判断Q是否在多边形{Pi}内,这里使用一种优美的算法:
对于满足Min(Pi.x, P(i+1).x) <= Q.x < Max(Pi.x, P(i+1).x)的边(Pi, P(i + 1))。
若Det(Pi, P(i+1), Q) > 0,则Count++
若Det(Pi, P(i+1), Q) < 0,则Count--
若|Count| = 2,则Q在多边形内
若|Count| = 0,则Q在多边形外
即以Q做x轴垂线,考察它与多边形的所有交点所在的边,相临交点所对应的边的方向一定不同。
利用边方向交错的性质,就可以找到Q是否在多边形内了。
由于是统计型的判断,所以在DFS Tree中可以用部分和的方法,存下当前点到根的路径上的统计信息。
找到圈就可以O(1)判断了。
3.圈对应的多边形不是简单多边形
上面的判断方法,在不是简单多边形的情况下某些中心区域可能漏判。但是由于图是依据圆相交的情况建立。虽然不是平面图。
但是这些中心必然也是一个另外可以拓展到的一个圈的内部。
Complexity: O(N^2)
200 Cracking RSA
Author: Amber
Method: Gauss Elimination
Detail:
若干个数的积是平方,要求每种质因数的个数为偶数。
列出线形模方程,解出自由变量的数目x,答案为2^x-1。
Complexity: O(T*N^2)
Notice: None
201 Non Absorbing DFA
Author: Amber
Method: DP
Detail:
由于Xi=1的转移相当于多走几次字符j,可以转化为新的Phi。
若出现圈则令圈上的节点为死结点(自动机不能走到的)。
状态(l, i),表示到第l步第i个状态的合法字符串数。这样就可以DP了。
Notice:
Test 1, WA 10 times.
数据没有像题目中所说的那样一行一行读入。可能所有数据在同一行上。
Test 11, WA 3 times.
计算新转移的时候没有认真设计算法。
203 Hyperhuffman
Author: Amber
Method: Simulate by Queue
Detail:
Simulate according to the definition of Huffman tree which is to choose two smallest nodes and to merge them each time.
O(nlogn) by Heap
But the data are in order, so we can maintain two ordered queues to solve it in O(N).
A huffman property that the values of mergings are increasing one by one time.
One queue is the data queue.
The other queue is the new-node queue.
Each time choose two smallest node from the heads of two queues, merge them and push it to the tail of the second queue.
Complexity: O(N)
205 Quantization Problem
Author: Amber
Method: DP
Detail:
题目比较令人费解:给出一列数Si和一个m*s的矩阵A(m≤s且m,s都是2的整数次方)。求一列数Ki,使K0=0,且 Sum[|A[K(i-1) mod M, Ki], Si|]最小。
简单DP即可。
Complexity: O(NMS)
207 Robbers
Author: Amber
Method: Greedy
Detail:
ki = [xi/y*m] or [xi/y*m]+1 only.
Let ki=[xi/y*m] firstly, so it may remaining some coins.
diff=|ki/m-xi/y|
Sort robber by diff, and distribute remaining coins to robbers (a man gets a added coin) by diff desc order.
Complexity: O(nlogn)
208 Toral Tickets
Author: Amber
Method: Math – Polya
Detail:
1)enumerating permutations.
2)finding the amount of circle in permutation.
3)calculate answer by Inc,Div based on HP
Complexity:
O(n^2) for enumerating
*O(n^2) for finding
=O(n^4)
Notice:
It's Rotate not Mirror!!!!!
210 Beloved Sons
Author: Amber
Method: Hungary for Max Weighted Match
Complexity: O(N^3)
214 Weird Dissimilarity
Author: Amber
Method: DP (like LCS)
Clariry:
The problem is
A is subseq of P. B is subseq of Q. A,B is given. Minimize Dist(P,Q).
F= Min(
F+D[A,MinA[A]]
F+D[MinB],B[j]]
F+D[A,B]
)
Here
MinA s.t. D[x,MinA[x]]=Min(D[x,y]|for y=1..n)
MinB s.t. D[MinB[y],y]=Min(D[x,y]|for x=1..n)
Complexity: O(n^2)
217 Two Cylinders
Author: Amber
Method: Simpson
Detail:
Let r1<=r2. Cylinder r1 lies on x axis, and r2 lies on y axis.
(x,y,z) in intersection, s.t.
z^2+x^2<=r2^2
z^2+y^2<=r1^2
=>
f(z)=sqrt(r1^2-z^2)*sqrt(r2^2-z^2)
ans=8*integral[ f(z) from 0 to r1 ]
It's hard to find directly.
The trapezia approximation formula costs too many time to get a low precision.
So the parabola approximation formula (Simpson) is fit.
Given a(lower);b(upper);n(the number of dividings);f[x](integral function)
trapezia: Ans=((b-a)/n)*((f[a]+f)/2+Sum[f[a+i*(b-a)/n],(i,1,n-1)])
simpson: Ans=(b-a)/(3n)*(f[a]+f+2Sum[f[a+2i*(b-a)/n],(i,1,n/2-1)]+4Sum[f[a+(2i-1)*(b-a)/n],(i,1,n/2)])
see http://www2.gliet.edu.cn/cai/dept7/math/shuxueshiyan/shiyan5.htm
Complexity: O(N), N is the number of dividings.
Notice: None
218 Unstable Systems
Author: Amber
Method: Binary Search+Match
Detail: Max-Min Match Problem
Complexity: O(NMlogW), W denotes the Weight Range.
Notice:
1.It's important to match unmatch nodes firstly.
2.Weight may be negative.
220 Little Bishops
Author: Amber
Method: Normal-DP
Detail:
求n*n棋盘上放k个象的方案数
把棋盘相间的染成黑白格(用+,-表示),如:
+-+-+
-+-+-
+-+-+
-+-+-
+,-之间的格子不互相影响。把+,-分离出来(分别称为case A,case B),把棋盘45度旋转。
case A case B:
+ –
+++ —-
+++++ —-
+++ –
+
这样可以把象看成是车(走直线)。这个问题和原问题是等价的。问题还可以等价转换为:
+ –
+ –
+++ —-
+++ —-
+++++
令 n(i) 为 第i行的格子数
F(i,j)= //前i行要放j个象
F(i-1,j)+ //本行不放
F(i-1,j-1)*(n(i)-j+1) //本行放, 方法有 n(i)-(j-1) 种,因为j-1个象已经放好,占了恰好j-1列。
按上述方法分别处理case A,case B.
Complexity: O(n^2)
Notice:
1)
When N=1, case A and case B are overlap.So do special processing.
2)
Assign i bishops to case A, and K-i bishops to case B.
s.t. 0<=i<=NumA, 0<=K-i<=NumB
Let Left=Max(0,K-NumB) Right=Min(NumA,K)
So Left<=i<=Right
221 Big Bishops
Author: Amber
Method: Normal-DP
Detail:
求n*n棋盘上放k个象的方案数, 大数据版。
详见SGU 220
Complexity: O(n^2)
Notice: 详见SGU 220
222 Little Rooks
Author: Amber
Method: Math
Detail:
求n*n棋盘上放k个车的方案数
P(n,k)*C(n,k)
Complexity: O(k)
Notice: None
223 Little Kings
Author: Amber
Method: Set-DP
Detail:
求n*n棋盘上放k个王的方案数
基于状态压缩(编码)的DP. (参见noi2001 cannon)
Complexity: O(StateNum*N^3)*O(StateNum)
StateNum=O(2^n)
Notice: None
224 Little Queens
Author: Amber
Method: DFS
Detail:
求n*n棋盘上放k个后的方案数
Notice:
这里没有任何剪枝和优化,算法其实可以更快的(可以快10倍)
226 Colored graph
Author: Amber
Method: BFS
Detail:
Split a vertex (n) by three vertex (n,c) which means reaching n through last edge with color c.
then BFS.
Complexity: 3*O(N+M)
228 Archipelago
Auther: Amber
Method: Geometry
Detail:
已知正n边形的两个点与他们的编号,求正n边形.
主要就是找圆心.
注意方向的处理.
Complexity: O(N)
230 Weighings
Author: Amber
Method: Topological Sort
Detail:
The problem is to find any of solutions which can not conflict with the inequality.
Sort it by topological order by a queue.
Complexity: O(N+M)
231 Prime Sum
Author: Amber
Method: Filter Primes + Enumerate
Detail:
利用 奇素数+偶素数(2)=奇素数
实际上就是找孪生素数.
Complexity: O(N)
238 Uncle Vasya and Bags for Potatoes
Author: Amber
Method: Maths
Detail: 每次操作等于把一个根节点x的第二层结点与所有根结点(除了x)交换,记为Op(x)。
同一个操作Op(x)出现两次以上(含)是没有意义的,图没有变化。
所以一个操作序列(无重复项),唯一的确定一种图。
若操作序列最后一步是Op(x),则操作序列前一步一定是Op(y),y是x在原图的的父亲。
显然这是必要的,否则x决不会到根层。
进一步,可知若要执行操作序列最后一步是Op(x),则操作序列至少是x的祖先序列。
并且这是充分的。若在祖先序列中插入一项的话。则必然被插入的位置原来的操作Op(x)一定不能执行。
必须再调用一次x的父亲。这与操作序列无重复项矛盾。
239 Minesweeper
Author: Amber
Method: DFS
Detail: 给出扫雷游戏 N*2 的左列信息,求右列的可能的放置数
240 Runaway
Author: Amber
Method: Binary Search + Dijkstra
Detail:
易知容忍度是满足二分的性质的。
因为变化率为正,所以早到一条边,比迟到这条边时的温度低。
这个贪心,可以利用最短路标号的性质满足。
Complexity: O(N^2LogH)
242 Student's Morning
Author: Amber
Method: Preflow push
Detail: The feasible flow with lower bounds.
244 Height, Bisector and Median
Author: Amber
Method: Math Discuss + Binary Search
Detail:
Put one point of triangle in (0, H). And the base edge is on x axis.
One necessary condition of the existence of solutions is H <= D <= M.
If H = D = M, there exists a solution of the isoceles triangle.
If H = D < M, there exists no solution.
If H < D = M, there exists no solution because the 0-area triangle is not allowed
If H < D < M, there exists solution that the point D of the bisector is between point H and point M.
The bisector inference of Stewart theorem:
D' = 2 * Sqrt / (B + C), Here 2P = A + B + C.
We can search the two points at the base edge.
S = Sqrt[M^2 - H^2], B = Sqrt[H^2 + (S - X)^2], C = Sqrt[H^2 + (S + X)^2], Here X is the searching value.
D' is monotony. So we can binary search X.
246 Black & White
Author: Amber
Method: Find the principle
Detail: 对于这种一维数列的数学题,一般写暴力程序,观察猜想出规律即可。
Notice: 当N=MaxLongint, (N + 1) div 2 会溢出,要用N div 2 + 1
247 Difficult Choice
Author: Amber
Method: Maths + HP
Detail:
猜想得出 Floor[C(2P, P) / P] + 2。
Thanks to CX.
248 Integer Linear Programming
Author: Amber
Method: Math+Enumerate
Detail:
when n=1, if v mod c[1]=0 then ans=v div c[1] else no answer.
when n=2, solve (c[1],c[2],v)
Let gcd(c[1],c[2])=d
Find all solution of c[1]*x+c[2]*y=v :
x=x0+t*c[2]/d
y=y0-t*c[1]/d
Cuz x>=0, y>=0, the range of t can be got.
Discuss c[1]>c[2] and c[1]<=c[2], and minimize x+y=x0+y0+t*(c[2]-c[1])/d.
when n=3, enumerate x[1]. Solving (c[2],c[3],v-x[1]*c[1]) is the same as that when n=2.
Notice:
Number must be Int64.
e.g. X:=X*C; that 10^6*10^6=10^12!!!
249 Matrix
Author: Amber
Method: Construct
Detail:
考虑线形情况L[x],这里L[x],L[x+1]满足相邻定义。
N L
L1: 000 001
L2: 000 001 011 010
L3: 000 001 011 010 110 111 101 100
….
可以发现 Ln 由 L(n-1) 和 L(n-1)的反转(前面添一个1)组成
所以可以构造出L.
令Matrix为D[x,y]
模仿网格的编码P[x,y]=(x-1)*M+y
构造出D[x,y]=L[x]*2^m+L[y]
Complexity: O(2^(n+m))
254 Strange Random
Author: Amber
Method: Simulate Directly
Detail: 空间正好开得下,直接模拟,当模拟到一定次数后,就清理一遍。经试验, 大概清理10-20次最快。
255 Winsock 3 Beta
Author: Amber
Method: Math + (Precompute + BinarySearch)
Detail:
A means a sequence of the valid M.
A(0)=1, A(n)=A(n-1)+n
Seek for each query in A by binary search.
256 Balloons
Author: Amber
Method: Set-DP
Detail: 由于休息时间最多只有4分钟,且每分钟只有1个人工作,所以状态表示中只需要保存前4分钟工作的人即可。
即F[t, s]:s表示前4分钟工作的人的序列,t表示当前时间。
Complexity: O(Ans * C(N, 4)), 这里Ans <= M
259 Printed PR
Author: Amber
Method: Greedy
Detail:
由于打印的总时间是一定的
希望后面打印的送出的时间尽量短
贪心: 送出的时间越长的越早打印
Complexity: O(n^2) for sort
O(n) for greedy
260 Puzzle
Author: Amber
Method: Gauss Elimination
Detail:
i表示当前所在方程
j表示当前处理变量
若没有方程有j变量,则j++;
否则,交换方程i与有j变量的方程,用方程i,消去所有含有j变量的方程的j变量,j++,i++。
Notice:
写这题之前,我的高斯消元有2种错误的写法。
1. 化为对角矩阵,实际上只有可逆矩阵才可以这样。
2. 化为上三角矩阵,错误的认为第i个方程没有第i个变量就可以跳过。
261 Discrete Roots
Author: Amber
Method:
n的原根(primitive root modulo n) g 定义为:
对于所有与n互质的数与每次乘g模n的操作组成能组成循环群, 记为Zn*.
称g为n的原根.
n有原根 当且仅当 n 有形式 1, 2, 4, p^k, 2p^k,这里p >= 3的素数, k >= 1 的整数。
原根的快速判定:
若g ^ (Phi(n) / Pi) mod n都不等于1,则g为n的原根。
Phi(n)为n的欧拉函数,即1到n-1与n互质的数的个数。这里Pi为Phi(n)的质因数。
本题中n为质数, 则Phi(n) = n – 1, 找到原根g就可以将{1, 2, .. n-1}的数与{g^1, g^2, …, g^(n-1)}建立一一对应关系。
x^k = a (mod n)
令g^y = x, g^t = a,则有 g^yk = g^t (mod n)。
因为n是质数,所以方程左右都不可以为0。就可以将这n-1个取值与指数建立对应关系。
<=> ky = t (mod (n – 1)),关于y解模线性方程就可以了。
下面就是g^t = a怎么求解:令s = floor(sqrt(p)),则有 t = b * s + r(0 <= r < s), 即有 g^t = g^bs * g^r
将所有g^r放入有序表中,从小到大枚举b,g^bs * g^r = a 则把g^r看成未知数解模线性方程。
若解能在有序表中二分查找到,则停止枚举,t = bs + r。
Complexity: O(G(P) * H(P - 1)) + O(Sqrt(P) * (Log(P) + Log(Sqrt(P))) + O(LogP)
G(N)为N的原根,H(N)为N的质因数个数。
Notice:
程序中变量名N,表示不一定需要是质数;而变量名P,表示一定是质数。
262 Symbol Recognition
Author: Amber
Method: IDS
Detail:
首先可以排除所有K块都一样的格子,剩下L个格子。
答案A下界为Ceil[LogK],而A增加1,则重复的概率就大大减小(因为相同格子都去掉了)。
所以可以从小到大枚举A,再枚举所有的方案。
因为K只有6,就是说A的下界为3。
复杂度似乎是 O(C(100, 3) + C(100, 4) + …),估计最多迭代到6。
而实际上复杂度远没有那么高。
因为排除所有K块都一样的格子, 则若L越大, 在A很小的时候就越容易找到解; 反之, 若L比较小, A可能比较大, 但C(L, A)依然很小.
264 Travel
Author: Amber
Method: Adjusting (Stable marriage problem)
Detail:
问题是求完全二分图的稳定完备匹配。
对于每条边有两个权: 由x指向y: Wx(x, y); 由y指向x: Wy(y, x), 权值均不相同.
稳定:不存在x与y匹配, x'与y'匹配, 使得 Wx(x, y') > W(x, y) 且 Wy(y', x) > Wy(y', x).
完备婚姻的算法 — 延迟认可算法
每一位女士被标记落选记号开始。
找到一位落选女士u,在所有尚未拒绝她的男士中选择一位被她排名最优先的男士v。
若这位男士v, 原来没有配对女士;或有一个临时配对女士w, 但在v看来w不优于u。
则让男士v选择女士u,拒绝原来的临时配对女士w,将u标记未落选,将w标记落选。
这时实际上只是临时决定让v配对u。最终的决定是在算法结束时才确定,即标号修改法。
也是调整法思想的体现。
由于每次总有一个女士被一个男士拒绝。所以最多拒绝N * (N – 1)次。
算法复杂度为: O(N^2)。
267 Optimist vs. Pessimist
Author: Amber
Method: Geometry+Data processing
Detail:
Problem is hard to understand.
Given set R, N=|R|, K
Maximize and minimize GotArea(A) for all A s.t. Area(A)=max and |A|=K.
Area(A) is the area summary of each x in A.
GotArea(A) is the area summary of each x in A which can be cut.
Maintain a orderly ranklist for first K elements.
Let S is the last of ranklist.
Keeping Area(ranklist)=max, replace S by all x that x's area is S and find maximum and minimum of GotArea.
269 Rooks
Author: Amber
Method: DP+HP
Detail:
由于放上一个rook,就等价于删去其所在列和行。所以有序化的数据后,问题是等价的。
f(n,k)=f(n-1,k-1)*(r(n)-(k-1)) //选
+f(n-1,k) //不选
可用滚动数组优化。
Complexity: O(NK), Here HP operation is considered O(1).
Notice:
可以透过"沟"攻击, 比如下面p可以攻击q.
xxp
x
xxq
271 Book Pile
Author: Amber
Method: Data Processing(Loop Queue)
Detail:
维护一个长度为K的有一个是否反向的标志的数据块。
因为只关心最顶上的K个数据,所以只要有add操作,就可以输出掉(pop)一个最下面的数据,然后加入当前add的数据至顶(push)。
用一个双端循环队列(两端都可以加数据)来实现这个数据块,有两个指针head,tail。正向的话,tail为顶部。反向则head为顶部。
具体见程序。
Notice:
(1)
String operation in Pascal is slow!!! I got TLE n times.
TLE -> AC
String -> String[8]
(2)
Be careful that Boundary K=0!
272 Evacuation plan
Author: Amber
Method: BFS + DFS
Detail:
先求出最短路标号
再搜索所有最短路
因为题目要求是一个极大的方案,不是最大,所以搜索的时候,可以打访问标记。
因为找到的最短路可能会阻挡其他的最短路。
故复杂度是O(N + M)的。
273 Game Po
Author: Amber
Method: DP
Notice:
数组DP的速度很快。
记忆化搜索的速度特别慢, TLE n times
State:
DP
396257 13.07.06 20:05 hupo001 273 .PAS Accepted 300 ms 557 kb
记忆化搜索
396252 13.07.06 19:46 flower 273 .PAS Accepted 1976 ms 1029 kb
Complexity: O(4*N^3*L), 实际上远没有这么高
274 Spam-filter
Author: Amber
Method: Simulate
Notice: Some detail such as Word isn't empty etc.
275 To xor or not to xor
Author: Amber
Method: Recursion
Detail:
问题:二进制下L位的N个数Ai,选出一些,按xor运算,组成L位的最大的数X.
可以这样以递归思想处理:
0.重复1-4,直到L=1
1.找出一个第L位为1的数A(i),找到转2,否则转4
2.若X的第L位为0,则X=X xor A(i).
3.使所有第L位为1的数A(j), A(j)'=A(j) xor A(i)
4.这样问题的规模减小到: L-1位的N个数Ai',组成L-1位的最大数X'.
由于可能有A(i)'=A(i) xor A(j),
所以这样处理出的X,就有很多个相同项: X=(A1 xor A1 xor … xor A1) xor (A2 xor A2 xor … xor A2) xor …
但由于有P xor P=0,可以两两消掉相同项.这样的X就是题目所求的X,X=A(i1) xor A(i2) xor …,此法是可行的.
Complexity: O(64*N)
276 Andrew's Troubles
Author: Amber
Method: Simulate
278 Fuel
Author: Amber
Method: Find convex hull
State: Accepted
Detail:
See sgu_278_report.doc
285 What? Where? When?
Author: Amber
Method: Set-DP
Detail:
箭头转动:随机一个位子,若当前位子已取过,则转到下一个位子,直到箭头所指的位子未取过。
就是说,在已取过的位子形成的集合不同的情况下,每个位子取到的概率不同。所以这些概率都需要分别计算的。
所以采用集合型DP。
Complexity: O(6 * 6 * 2^13 * 6)
Notice:
题目中,对于如何箭头转动的描述,我一直搞错,拖了很久。
288 Best Tournament Schedule
Author: Amber
Method: Construct
Detail:
若N为奇数,那么增加一个人表示轮空的,使得N为偶数。
设第r轮X的对手为Xr。
若2*X = r (mod (N – 1)),则Xr = N
否则X + Xr = r (mod (N – 1)),(这里把编号0看成第N – 1个人)
命题1:同一轮中没有对手重复的,即若X <> X', 不存在Xr = X'r。
证:反设Xr = X'r,则 X + Xr = r, X' + X'r = r (mod (N – 1)) => X = X' 矛盾。
命题2:同一人中没有与重复对手比赛,即若r <> r', 不存在Xr = Xr'。
证:反设Xr = Xr',则 X + Xr = r, X + Xr' = r' (mod (N – 1)) => r = r' 矛盾。
综上构造成立。
Complexity: O(N^2)
289 Challenging Tic-Tac-Toe
Author: Amber
Method: Memorized Search
Detail: Search all the states by Max-Min Search
291 Evolution
Author: Amber
Method: BFS
Notice:
The test range in description may have some mistakes.
1 <= Q,C <= 1000, But I got WA.
When MaxSize = 1001, I got AC.
292 Field for the Cemetery
Author: Amber
Method: Maths + HP
Detail:
A = Q mod N
B = C mod N
情况1:如果A + B <= N就直接放,最后剩下一个A * B的空区域,Ans = (Q * C - A * B) / N
情况2:如果A + B > N 就先在外面交叠的放一圈,如:
AAAB
D B
D B
DCCC
把Q * C的问题转化为(Q – 2A) * (C – 2B)的问题。而(Q – 2A) mod N = N – A,(C – 2B) mod N = N – B。
因为A + B > N, 有N – A + N – B <= N,就是情况1。所以Ans = (Q * C - (N - A) * (N - B)) / N。
分析:
(N - A) * (N - B) = N ^ 2 - (A + B) * N + A * B --(1)
当A + B <= N时 (1)式 >= A * B
当A + B > N时 (1)式 < A * B
故这样分类摆放是最优的。
293 Game with Q an C
Author: Amber
Method: Construct
Detail:
由于我们要保证每次加入2个字符后,只能用2个交换维护,就是说只能有4处与上次回文串加2个字符不同。
什么样的子串有这个性质呢?
维护一种稳态: 就是以QCQC…QC这样交错开头, 多出的字符都放在中间, 正中间是含有奇数个字符的字符。
后一部分是前部分的翻转.
如: 5个C, 8个Q: QCQC|QQCQQ|CQCQ (第一竖线前为交错部分, 第一竖线后到正中间是多出的字符. 正中间是奇数个字符的C。
可以证明,最多只要2次交换维护就可从上一个稳态,到这个稳态。
算法就是每次构造稳态,找到那些地方的字符与上次的不同,交换即可。
Complexity: O(N^2)
295 Identifier Duplicated!
Author: Amber
Method: Maths (Combinations)
Detail: Ans = 2^[Duality Letter number]
* [Sum all space's number cases which will be inserted into the gaps between words.]
296 Sasha vs. Kate
Author: Amber
Method: Greedy
Detail:
For each K, delete the last digit of the non-increasing order from start point.
297 Fair-play
Author: Amber
Method: Maths
Detail: Mod Sum Directly
298 King Berl VI
Author: Amber
Method: Shrink strong connected block and Topological sort
Detail:
题目就是给出了m个不等式,可以抽象成有向图。
若图中有非0圈,则不等式中有矛盾,无解。
若图中有0圈,则圈中的点是等价的,可以收缩圈(强连通分支)。
这样就得到一个DAG。
在正向图中,拓扑排序时,可以更新到达每个节点的最小值。
同样在反向图中,求出到达每个节点的最大值。
若出现某个节点的最大值<最小值,则无解。
最后,由于minimize AN - A1,只要令A1为其最大值,AN为其最小值,再做一次拓扑排序的更新即可。
Complexity: O(N + M)
299 Triangle
Author: Amber
Method: Sort+HP
300 Train
Author: Amber
Method: Enumerate
Detail: Find the minimum circle length leaded by the intersection point.
301 Boring. Hot. Summer…
Author: Amber
Method: Dijkstra + Topological scan by distance order
Detail: 先求出X – Y的最短路图,最短路图是DAG。所以可以以离X的距离作为拓补序,进行统计。
Complexity: O(N^2)
302 BHTML 1.0
Author: Amber
Method: Stack Processing
304 Mars Stomatology
Author: Amber
Method: Greedy + DP
Detail:
If there is only 1 gum, then we can use greedy method
that after sorting the values of teeth, scan the values from small to large until exceed the money limit.
State (M, N) denotes minimum values of choosing M gum, N teeth.
F[M, N] = F[M - 1, N - K] + Cost[1..K]
Here Cost[1..K] means the summation of the first k sorted values from small to large.
K is the number of the teeth connecting to M.
Complexity: O(N^2M), but in fact it should be O(N^2).
305 Exhibition
Author: Amber
Method: Special Match
Complexity: O(N^3)
Detail:
We use hash to implement the large part Y. But the used node is O(N) at most.
2008年4月6日星期日