09 2014 档案
摘要:题意:给一棵树,每次给两个节点间的所有节点发放第k种东西,问最后每个节点拿到的最多的东西是哪种。解法:解决树的路径上的修改查询问题一般用到的是树链剖分+线段树,以前不会写,后来学了一下树链剖分,感觉也不是很难,就是把整个数分成很多链,然后一条重链上的点在线段树中位置是连续的,这样使得更新和查询时更加...
阅读全文
摘要:题意:给n个数字,每次两种操作: 1.修改第x个数字为y。 2.查询[L,R]区间内第D位为P的数有多少个。解法:这题当时被卡内存了,后来看了下别人代码发现可以用unsigned short神奇卡过,于是学习了。这种区间求和的问题很容易想到树状数组,根据第i位为j(i#include #includ...
阅读全文
摘要:题意:给出一个距离矩阵,问是不是一颗正确的带权树。解法:先按找距离矩阵建一颗最小生成树,因为给出的距离都是最短的点间距离,然后再对每个点跑dfs得出应该的dis[][],再对比dis和原来的mp是否一致即可。首先还要判断一些东西。具体看代码吧。代码:#include #include #includ...
阅读全文
摘要:题解见官方题解,我这里只实现一下,其实官方题解好像有一点问题诶,比如while( str[startPos] != str[i+1] ) cnt[str[startPos]]--, startPos++;那个str[i+1]的话会越界。应该是这样:while(str[startPos] != str...
阅读全文
摘要:题意:给n个‘M'形,问最多能把平面分成多少区域解法:推公式 : f(n) = 4n(4n+1)/2 - 9n + 1 = (8n+1)(n-1)+2前面部分有可能超long long,所以要转化一下,令a = 8n+1, b = n-1,将两个数都化为a1*10^8+b1的形式,则(a1*10^8...
阅读全文
摘要:题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询的任意一个点的。这时候我们可以建立点集的补集,以线段的形式,如果点集的补集线段包含了某条给出的线段,那...
阅读全文
摘要:题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值。解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数。那么每次查询[L,R]之间两数gcd的最大值即为查询[L,R]中值最大的线段,离线所有的查询数据,然后...
阅读全文
摘要:题意:给一些建筑物,x表示横坐标,h表示高度,然后查询某些坐标x,问从该点看向天空的最大张角是多大。解法:离线操作,读入所有数据,然后按x升序排序,对每一个查询的x,先从左到右,依次添加x坐标小于x的建筑物,加入一个建筑物的条件:1.此建筑物高度大于栈中的前一个,这个必然是最优的。2.加入这个建筑物...
阅读全文
摘要:题意:给一个地图,孙悟空(K)救唐僧(T),地图中'S'表示蛇,第一次到这要杀死蛇(蛇最多5条),多花费一分钟,'1'~'m'表示m个钥匙(m=dis[当前状态],那么就不再扩展下去了。BFS中的逻辑就很简单了,看代码吧。最后,枚举蛇的状态S,取dis[x][y][m+1][S]的最小值即为最小步数...
阅读全文
摘要:题意:给一篇文章,再给一些单词替换关系a b,表示单词a可被b替换,可多次替换,问最后把这篇文章替换后(或不替换)能达到的最小的'r'的个数是多少,如果'r'的个数相等,那么尽量是文章最短。解法:易知单词间有二元关系,我们将每个二元关系建有向边,然后得出一张图,图中可能有强连通分量(环等),所以找出...
阅读全文
摘要:题意:把长度为n的序列分成k个m长的连续小序列,这些连续小序列的和最大是多少。解法:显然DP。定义: dp[i][j] 为前 i 个元素分成j个m端,且 i 是第j个的末尾的最大和。那么有: dp[i][j] = max(dp[i-1][j], dp[i-m][j-1]+sum[i]-sum[i-m...
阅读全文
摘要:题意:给一个环,环上有n块,每块有个值,每一次操作是对每个点,他的值变为原来与他距离不超过d的位置的和,问k(10^7)次操作后每块的值。解法:一看就要化为矩阵来做,矩阵很好建立,大白书P157页有讲,大概为:[1 1 0 .. 0 1][1 1 1 .. .. 0]...[1 1 .. .. .....
阅读全文
摘要:题意:给一个点(x,y),给一些步长delta1,delta2...deltaN,问从(0,0)严格按照步长走完N步后能否正好到达(x,y)点。解法:其实就是判断这些线段和(0,0)-(x,y)这条线段能否构成一个多边(角?)形的问题,只需判断最长的边是否不大于于所有边长和的一半即可。代码:#inc...
阅读全文
摘要:题意:给n个点(x,y,p),从1~n,一次每次所有点绕着第 i 个点(原来的)逆时针转pi个弧度,问最后所有点的位置相当于绕哪个点旋转多少弧度,求出那点X和弧度P解法:直接模拟旋转,每次计算新的坐标,最后选两个新的点分别和他们原来的点连一条线,两条线的中垂线的交点即为圆心,求出了圆心就可以求出转了...
阅读全文
摘要:1.数字转stringint x;string id;stringstream ss;ss > id;2.字符串转数字int num;string s;stringstream ss(s);ss>>num;char str[];sscanf( str, "%d", &num ); /...
阅读全文
摘要:为了补这题,特意学了下模拟退火算法,感觉算法本身不是很难,就是可能降温系数,步长等参数不好设置。具体学习可以参见:http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html 我认为讲的很不错,通俗易懂。这题设置一个step为1,降温系数为...
阅读全文
摘要:题意:给出矩阵的第0行(233,2333,23333,...)和第0列a1,a2,...an(n#include #include #include #include #include #define Mod 10000007#define SMod Mod#define lll __int64us...
阅读全文
摘要:题意:统计一段序列【L,R】的和,重复元素只算一次。解法:容易看出在线做很难处理重复的情况,干脆全部讲查询读进来,然后将查询根据右端点排个序,然后离散化数据以后就可以操作了。每次读入一个数,如果这个数之前出现过,那么删除之前出现的那个数,改加上这个数,然后进行所有右端点小于等于此时下标的查询即可。关...
阅读全文
摘要:题意:给一个三维数组n*n*n,初始都为0,每次有两个操作:1. 翻转(x1,y1,z1) -> (x2,y2,z2)0. 查询A[x][y][z] (A为该数组)解法:树状数组维护操作次数,一个数被操作偶数次则相当于没被操作。每次更新时在8个位置更新:。相当于8个二进制数:000,001,010,...
阅读全文
摘要:题意:给出一个两边长为a,b的矩形,要求增加a和增加b使a*b>=6*n且a*b最小。解法:设新的a,b为a1,b1,且设a#include #include #include #define lll __int64using namespace std;int main(){ lll n,a...
阅读全文
摘要:题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val 操作2:查询 i 位置的值解法:树状数组记录更新值。 由 (i-a)%k == 0 得知 i%k == a%k,又因为k #include #include #include #include #inclu...
阅读全文
摘要:题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k#include #include #include #include #include #include #define Mod 1000000007using names...
阅读全文
摘要:题意:求S(k) = A+A^2+...+A^k.解法:二分即可。if(k为奇) S(k) = S(k-1)+A^kelse S(k) = S(k/2)*(I+A^(k/2))代码:#include #include #include #include #define SMod musing ...
阅读全文
摘要:题意:给一串数字,问长度为m的严格上升子序列有多少个解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数,则有dp[i][j] = SUM(dp[k][j-1]) (a[k] #include #include #include #inc...
阅读全文


浙公网安备 33010602011771号