BestCoder Round #90

有生以来第一场在COGS以外的地方打的比赛。挂成dog了。

主要是没有经验,加之代码能力过弱。还有最后的瞎hack三次,Too Young Too Simple......

言归正传。

(抄一发题解先)

T1 Kblack loves flag

用两个布尔数组分别维护每个行/列是否被插过旗帜,最后枚举每一行、列统计答案即可。空间复杂度O(n+m),时间复杂度O(n+m+k)。

T2 dingyeye loves stone

设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0。 证明同阶梯博弈。对于偶深度的点上的石子,若对手移动它们,则可模仿操作;对于奇深度上的石子,移动一次即进入偶深度的点。 时空复杂O(n)。

T3 rausen loves cakes

考虑用树状数组维护每一个位置是否为一段颜色的起点(下简称“起点”)。 询问时,只需要查询区间内起点个数,再特判左端点是否为起点,即可求得答案。 针对合并操作,如果暴力合并,复杂度显然是O(n^2)的,尝试用启发式合并优化它。 用数组维护每种颜色的位置个数,合并时,将个数少的颜色全部修改成个数多的颜色。 由于具体实现仍与暴力合并类似,因此可以轻易地维护前面提到的树状数组。 需要注意的是,由于合并时可能交换颜色,因此还需要维护每个数代表的真实颜色。 由于采用了启发式合并,因此时间复杂度为O(nlogn+Qlog?2??n)或O(nlogn+Qlogn)。 本题也可以用线段树或其他很多数据结构解决。

T4 jvjhfhg loves Magic Tower

题目的寻路决策看似复杂,因此考虑转化。 我们发现,如果从起点走到一个目标格子,再从原路返回起点,即可仅改变目标格子被访问次数的奇偶性。 因此,所有的${2}^{灯数}$种情况都是可以“走”出来的,也就是说,我们可以任意地决定每个位置是否“按下”。 题目转化为经典的高斯消元问题。但是暴力求解复杂度为O((nm)^3)O((nm)?3??)太高,不能通过全部数据。 找到一个jj,使得∣x?j??∣最大的前提下∣y?j??∣最大,不妨假设我们找到的x?j??=dx,y?j??=dy。适当地翻转棋盘后,如果前∣dy∣行∣dx∣列的“按下”情况已经确定,那么其他所有位置的“按下”方案也就确定(由于目标为使棋盘全亮,因此可以递推求出)。于是只需要枚举前∣dy∣行∣dx∣列即可。 然后就是经典的求异或方程组不同解个数的问题了。可以用高斯消元求出自由元个数,并求得答案。 当n,m同阶时,时间复杂度约为O(\frac{(5n)^3}{32})。 *本题最大的叉点是翻转棋盘。*

然后说说自己的比赛历程吧。

由于放假,这次比赛是在家打的。

头比赛的时候正好要吃晚饭,于是乎10min rush完了晚饭,速速赶去看题。

(我才不想说我看题的时候没看见右边那个中文,结果傻乎乎的去读英文题……)

一看T1,好像很水的样子,于是乎跳过去了(卧槽感觉这是SB行为……都怪我习惯了打OI赛制了= =)……

看了看T2,好不容易读懂了,发现是个博弈论,应该是SG定理什么的,然而并没有用过,跳。

一看T3,卧槽这不是梦幻布丁的原题么……

T4表示没太看懂,反正看样子不太可能会写(赛前听说ACM赛制是A了才会有分),跳。

然后开始码T3的线段树+set启发式合并,然后写挂了……废了废了……

然后开始调T3,然而我是边聊QQ边打的比赛,怎么可能调的出来……到了还剩不到1h的时候果断放弃,去水掉了T1(QAQ感觉自己真zz)。

回过头来继续调T3,然而还是调不出来,还剩10min的时候放弃去想T2,然而太紧张了并没有想出来。

倒计时到00:00:00之后突然又续上了15min,好久才反应过来这好像是hack时间……之前看楼天城的回忆录写道他造了一组随机大数据成功hack掉了同屋的rank1,于是乎造了一个T3的大数据,粘贴之后Chrome死掉了……于是乎放弃大数据,手造了一个数据来卡那些没考虑颜色相同和没有的,然而测试数据都过了的代码怎么可能被我hack掉……成功get-3……

总结一下得到的经验和教训:

1.有空了解了解ACM赛制= =

2.比赛的时候要专心……不要聊QQ……

下一站,51nod算法马拉松。加油。

时间: 2024-12-29 06:45:00

BestCoder Round #90的相关文章

BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元

BestCoder Round #90 本次至少暴露出三个知识点爆炸.... A. zz题 按题意copy  Init函数 然后统计就ok B. 博弈 题  不懂  推了半天的SG.....  结果这个题.... C 数据结构题   我写了半个小时分块   然后发现     改的是颜色.... 我的天  炸炸炸 D. 没看懂题目要干啥.....  官方题解要搞死小圆

HDU 5995 Kblack loves flag ---BestCoder Round #90

题目链接 用两个布尔数组分别维护每个行/列是否被插过旗帜,最后枚举每一行.列统计答案即可.空间复杂度O(n+m),时间复杂度O(n+m+k). #include <cstdio> #include <iostream> #include <cstring> using namespace std; int t,ansx[1000005],ansy[1000005],ax,ay; const int _K=50268147,_B=6082187,_P=100000007;

HDU 5996 dingyeye loves stone ---BestCoder Round #90

题目链接 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0. 证明同阶梯博弈.对于偶深度的点上的石子,若对手移动它们,则可模仿操作:对于奇深度上的石子,移动一次即进入偶深度的点. 时空复杂度O(n). 用vector存搜一下就行. #include <cstdio> #include <iostream> #include <vector> #include <cstring> using namespac

BestCoder Round #4 之 Miaomiao&#39;s Geometry(2014/8/10)

Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 10    Accepted Submission(s): 3 Problem Description There are N point on X-axis . Miaomiao would like to cover them ALL by usi

从lca到树链剖分 bestcoder round#45 1003

bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或),高手就不这么做了,直接树链剖分.为什么不能用lca,因为如果有树退化成链,那么每次询问的复杂度是O(n), 那么q次询问的时间复杂度是O(qn) 什么是树链剖分呢? 就是把树的边分成轻链和重链 http://blogsina.com.cn/s/blog_6974c8b20100zc61.htmlh

hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]

传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 221    Accepted Submission(s): 52 Problem Description A topological sort or topological ordering of a directed

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

BestCoder Round #1 1001 &amp;&amp; 1002 hdu 4857 4858

hdu 4857 逃生 第一题是拓扑排序,不是按照字典序最小输出,而是要使较小的数排在最前面..赛后弄了好久,才比较明白,我一直以为 反向建图,i从1到n,开始深搜dfs( i ),对i点的边,由小到大继续搜一下,同时标记搜过的数,搜过之后就不再搜,搜到底之后ans[cnt++] = u;这样顺序输出就是答案,后来经过超哥指点,才明白深搜贪心是错的.只有 反向建图,用优先队列把较大的数尽量排在前面,然后反序输出才是正解.. 1 #include<iostream> 2 #include<

BestCoder Round #91

传送门:http://acm.hdu.edu.cn/search.php?field=problem&key=BestCoder+Round+%2391&source=1&searchmode=source A题:给你n种字母,每种字母有个权值vali,共cnti个,现在让你在里面挑出任意数量的字符,组合成一个字符串,该字符串的权值的计算方式为val1*1+val2*2+--+valn*n,让你输出字符串最大的权值是多少.这题很容易会有一个错误的贪心,就是把val为负的舍去,然后v