2014年4月24日
摘要: 题目大意 对一个初始矩阵进行置换操作,已知经K次置换后得到的矩阵为,求一组可能的。样例解释 这里只选取第二组样例进行解释。4234122341 初始矩阵为,根据SampleOutput得知置换操作为,第一次置换后得到矩阵,第二次置换后得到矩阵(和给出的一致),因此是一组可能的。解题思路 考察一个特定... 阅读全文
posted @ 2014-04-24 16:51 Staginner 阅读(835) 评论(1) 推荐(0) 编辑
  2013年10月14日
摘要: 今年的比赛最大的变化就是改用OJ判题了,相比于PC^2确实省事了不少,至少可以直接复制样例了。题目方面依旧是刘汝佳命题,这点还是相当好的,至少给人以足够的安全感。 开始比赛之后安叔瞬间就把前半部分题目抢过去了……想到可能前面的题目会比较简单我就让安叔分我一点,然后安叔就把A丢给我了,接着很快安叔就决定上去敲C了。于是我就开始默默地看题了……A是找个最长的近似回文子串,算了一下暴力没问题,然后又看了H,完成区间加和查询单点就可以了,但是又仔细想了一下其实排个序+二分+前缀和更好写一些,这时琦琦又给我拿来J,我看了一下虽然变量范围很大,但是因为前面是三次方,后面只有一次方,实际上可以将左边的变量. 阅读全文
posted @ 2013-10-14 14:27 Staginner 阅读(3628) 评论(5) 推荐(9) 编辑
  2013年10月12日
摘要: 首先我们观察加操作和乘操作会对区间产生那些影响。加操作只会平移区间,而乘操作既能移动区间还能放大区间。因此我们不难想到,如果m>1的话乘操作是log级别的,一方面是因为区间的大小不能超过s-r,另一方面区间的最大值不能超过r,这两方面都能决定乘操作的个数是log级别的,因此一种可行的思路就是枚举乘操作的次数,然后再看怎么安排加操作。 同时我们还能发现,这些操作不会改变区间内数的顺序,因此只要最小值和最大值都在s到r之间就可以,并且如果我们固定了乘操作的次数,相当于固定了最终区间的宽度,这样根据最小值就能推出最大值,因此我们可以只约束最小值在某个范围内,就能使得最小值和最大值都在s到r之间 阅读全文
posted @ 2013-10-12 20:32 Staginner 阅读(1183) 评论(0) 推荐(0) 编辑
  2013年10月11日
摘要: 首先,如果图本来就是一个点双联通的(即不存在割点),那么从这个图中选出任意两个点就OK了。 如果这个图存在割点,那么我们把割点拿掉后图就会变得支离破碎了。对于那种只和一个割点相连的块,这个块中至少要选一个点出来建逃生通道,而且可以任意选择,而对于那种和多个割点相连的块则没必要选点出来建逃生通道。#include#include#include#define MAXN 100010#define MAXM 100010#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;int df 阅读全文
posted @ 2013-10-11 19:40 Staginner 阅读(733) 评论(0) 推荐(1) 编辑
  2013年9月30日
摘要: 10457-Magic Car题意一开始看起来有点费解,其实最后就是要起点到终点的路径上最大边与最小边之差越小越好。这样我们可以先将边排个序,然后枚举路径上的最小边,之后依次将比它大的边按升序的顺序添加,直到起点和重点连通为止,这样就得到了一个可行解并尝试去更新记录的最优解。等所有可能的最小边都枚举完之后就可以得到最终的最优解了。#include#include#include#define MAXN 210#define MAXM 1010#define INF 0x7fffffffint N, M, SE, EE, p[MAXN];struct Edge{ int u, v, w; ... 阅读全文
posted @ 2013-09-30 00:52 Staginner 阅读(571) 评论(0) 推荐(0) 编辑
  2013年3月15日
摘要: 对于树上任意一点来讲,相距最远的点要么是从父节点走过来的,要么就是从儿子节点中走过来。因此可以先进行一次自下向上的dp,处理出从儿子节点过来的最远点的距离。然后再进行一次自上而下的dp,同时传入从父亲节点过来时最远点的距离,这样和从儿子节点过来的最远点的距离对比一下,就可以找到距这个点最远的点的距离了。INF = 0x3f3f3f3fN = 0g = [[]]dp = []ans = []res = 0def input(): global N, g N = int(raw_input()) g = [[] for i in range(N + 1)] for i i... 阅读全文
posted @ 2013-03-15 23:36 Staginner 阅读(488) 评论(0) 推荐(0) 编辑
  2012年11月10日
摘要: POJ_2989 求极大团的数量,我的程序是参照维基上的伪代码写的http://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm。#include<stdio.h>#include<string.h>#define MAXN 130int N, M, a[MAXN], g[MAXN][MAXN];void input(){ memset(g, 0, sizeof(g)); for(int i = 0; i < M; i ++) { int x, y; scanf("%d%d", & 阅读全文
posted @ 2012-11-10 23:04 Staginner 阅读(922) 评论(0) 推荐(0) 编辑
  2012年11月9日
摘要: UVA_11100 首先,pieces的数目是取决于出现的次数最多的数的,出现次数最多的数的出现次数就是pieces的数目。 剩下还要保证每个pieces里面盒子数的最大值要尽量小,那么可以直接将盒子按大小排序,然后将每个盒子按1,2,...,n,1,2,...n...的顺序依次放到每个piece中,就可以构造出一个符合题意的放置方案了,其中n表示pieces的数目。#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>#define MAXN 10010int 阅读全文
posted @ 2012-11-09 23:44 Staginner 阅读(531) 评论(0) 推荐(0) 编辑
摘要: UVA_11134 实际上行和列是独立的,也就是说不会因为rook行位置的不同而影响其列位置上的摆放,反之亦然。 那么我们不妨先将行号分配给各个rook,再将列号分配给各个rook。 单就分配行号而言,我们可以枚举1-N这N个行号,当前这个号码应当分配给可以分配的并且xri最小的那个rook,因为这样至少不会使结果变得更糟,至于对这个贪心的证明就暂且略过了。 这个题目和LA_4254的贪心思路是很像的。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 5010#define 阅读全文
posted @ 2012-11-09 23:10 Staginner 阅读(1544) 评论(0) 推荐(0) 编辑
摘要: UVA_11627 显然sj越小,越容易存在一条路线完成任务,那么我们可以先通过二分找到一个可能的最大的sj,再在所有的滑雪板中挑出一个和这个sj最近接的数即可。 在判断当前sj下能够穿过所有门时,可以自顶向下,逐步约束人能够到达的x坐标上的范围,直到这个范围变成空集或者所有的门都经过了为止。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 100010int W, vh, N;struct Gate{ int x, y;}g[MAXN];void input(){ scan 阅读全文
posted @ 2012-11-09 22:52 Staginner 阅读(1389) 评论(0) 推荐(0) 编辑