摘要:
http://codeforces.com/problemset/problem/200/A 好题,虽然我又没独立想出来=。=。。给一个n*m的点矩阵,询问K次,每个输入一个坐标x,y,寻找一个于该坐标曼哈顿距离最小且未被占有的点,并占有它。 做法是每次询问从x开始往左右暴力枚举横坐标,直到横坐标绝对值差已经大于当前答案。可以保证第i个询问,最多只需要向两边枚举sqrt(i)次。同时可以利用并查集,对于每个横坐标O(1)求出最接近的点。。最后当n比m大很多时候算法会退化,此时可以通过交换横竖坐标来解决。View Code 1 //By Lin 2 #include<cstdio> 阅读全文
摘要:
http://codeforces.com/problemset/problem/19/E 再次倒在WJMZBMR面前=。=,看了他的题解才懂这个题。。 题意很简单,给你一个图,问你有哪些边删去之后(只删除一条)图将变成2部图。。。做法是构造出一棵生成树,树必定是2部图,将所有节点染色,之后根据染色结果将剩下的所有非树边分成两个集合,集合A中边连着两个不同颜色的点,集合B中边连着两个相同颜色的点。。 先考虑非树边很容易根据集合B大小,分成等于0 , 等于1, 大于1三种情况, 再考虑树边,我们将非树边的边的两个节点在树中的路径定义为该边的路径,则如果集合B中的某一条边的路径没有经过树边e,则删 阅读全文
摘要:
http://codeforces.com/problemset/problem/76/F 一个很奇怪的问题,某个人在X坐标上左右移动,方向任意随时可以改变,也随时可以停下,其最大速度为V。在坐标上某些点某些时刻(xi,ti)有特别的事情发生,如果那一瞬间停留在那个点上就将经历可以神奇的事情,问在这个人0时刻可以选择任意位置,以及0时刻在x=0位置上分别可以经历最多特别的事情是多少。。 作为一个暴力的acmer,我只想到用树套树n(logn)^2 近乎模拟的解决这个问题。。后来看了题解发现问题可以非常神奇的转移成简单的单调队列问题,证明如下: 设Pi = xi+ti*V Qi = xj+tj* 阅读全文
摘要:
http://codeforces.com/problemset/problem/91/E 很简单的题意,给出n条直线编号分别为1~n,再给去m个询问,要求出第L条~第R条直线,在x=xi时最高的是那一条。 作为一个弱菜我只想到了,O(n*n½ log(n½))的暴力方法,=。=,就是分块sqrt(n)个区域,将询问离线按x坐标递增,每个块内用堆维护求出当前x坐标下最高的直线编号。后来问了我队友,他告诉我用线段树可以处理,相当于线段树每个节点(li,ri),上维护一个下凸曲线,每个节点的曲线可以由其两个子结点线性合并出来,故每层复杂度是O(n) ,总复杂度O(n log(n 阅读全文
摘要:
http://codeforces.com/contest/251/problem/D 很有意思的一个数学题,给你n个数字要你将其分成A,B两组,使得两组所有数字分别xor起来,得到A‘,B’时,A+B最大。多解时候使得A最小。 先贴程序。。。。吃饭先View Code 1 //By Lin 2 #include<cstdio> 3 #include<cstring> 4 #define maxn 100050 5 using namespace std; 6 typedef long long LL; 7 int n; 8 LL data[maxn],input... 阅读全文
摘要:
http://codeforces.com/problemset/problem/17/C 题目中给出一个仅含有a,b,c的字符串,已经两种操作每次选出任意两个相邻的字符,用第一个覆盖掉第二个或者反之,最后询问不考虑操作次数,最终有多少种不同的序列其中a,b,c三种字符两两间相差不超过1个。 很有趣的动态规划,一开始一直在考虑边构造目标串边dp,考虑前i个含有多少a,b,c之类都找不到可以在时限内通过的办法,后来重新审题发现可以重定义其两种操作,可以这样等价的描述原串通过这两种操作可以到达的目标串,将目标串相邻的重复元素去掉,剩下的元素所组成的序列,一定是原串的子序列!重定义之后很容易想到一种 阅读全文
摘要:
http://codeforces.com/problemset/problem/86/C 自动机好题,给你m个DNA片段,询问有多少个长度为n的DNA,被这m个片段中的若干个可重复的完全覆盖。 太久没写关于AC自动机的题目,有点生疏想了一会才知道怎么做=。=~,对于AC自动机,有这样一个特性,停留在深度较大的节点时候可以继续拥有当前串所有更短后缀的信息,因为可以沿着fail指针寻找其后缀,故我们dp的时候需要贪心地尽量停留在高深度的节点。但是同时会丢失一部分信息,如果当前串前面一部分已经匹配成功,但是由于我们的贪心选择,我们没记录这个信息,因此额外添加dp的一维,当前串还有几位没被成功覆盖。 阅读全文
摘要:
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4156 比赛当时,我们队就一直坑在这个题上了,没有人看到最后一小段,一直用可以离线的splay企图AC,结果当然很惨烈=。=,耗费了半场比赛在这么一个不存再的题目上面。。。 题目本质是一个普通的平衡树,但是限定了只能在线,所以写一个普通的函数式treap即可通过,参考了范浩强神牛的讲义,突然发现这个东西可以特别好写比普通的还短,具体看代码吧。。思路啥的仔细看代码不难 阅读全文
摘要:
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4157 非常遗憾的一道题,比赛时候很早想出来,但是由于某些原因最后拖到绝杀时刻,且被催的绝杀TLE,没有通过。 题意:给出n(<=100)个数字,大小在1~500内,每次取任意数字,一共有2^n种方案,对每种方案中被取出数字的最小公倍数求和。结果MOD 10007. 这个问题可以得到一个非常暴力的dp, 对于一个最小公倍数显然可以表示成这种形式:p1^i1* 阅读全文
摘要:
http://codeforces.com/problemset/problem/111/D 中等偏难的计数题目,题意很奇葩,用K种颜色染一个n*m的矩形使得从竖直方向任意位置切成两个矩阵时两个子矩阵包含颜色种类数目一样多,当然要沿着网格线切。非常奇葩的题意,后来仔细一想发现这个要求可以证明等同于这个条件,最左最右列包含颜色种类数目一样多同时中间列出现的颜色只能是最左最右同时出线过的颜色。证明略,知道结论后反证异常简单,推出结论比较难。 综上,做法很easy,枚举左右都出现的颜色数目i,已经单独出现的颜色(对方没用的)颜色数j , ans = sum(dp[i+j]*dp[i+j]*C(k,i 阅读全文