这题很锻炼模型转换的能力http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3597题意:有一排的枪编号依次为1~n 有一排靶子编号依次为1~m告诉你哪些枪能打中哪些靶子,然后如果每次只能选连续的P把枪,连续的Q个靶子,每次能打中的靶子的最大值为多少答案是把每次打中的最大值相加再除以总的次数即选择 1~P 的枪能打中的最多的靶子的数量 + 2~p+1 的枪能打中的最多的靶子的数量 +。。。n-p+1~n的枪能打中的最多的靶子的数量 /(n-p+1)注意,每把枪最多只能打一个靶子解法:将题目中的关系转换为坐标 以枪为纵坐标 a Read More
先是论文中的一个模板View Code /*后缀数组模板rank[0~n-1] : 值域: 1~nsa[1~n] ; 值域: 0~n-1height[2~n]: suffix[i-1]与suffix[i]的最长公共前缀suffix(i-1) 与 suffix(i)是排名相邻的两个后缀height[1]无意义*/#include<cstdio>#include<cstring>#include<set>using namespace std;const int maxn = 400010;int rank[maxn],sa[maxn],height[maxn] Read More
参考了这里http://blog.sina.com.cn/s/blog_6a6aa7830100x890.html题意:有N条赛道,每一条初始时都是坏的,修复第i条赛道的费用是cost[i];赛道上会举办m个赛事,每个赛事会用到[L,R]之间的赛道,而且要保证赛事进行必须使得这一段的赛道完好,每项赛事还可以获得一定的钱数。问题要求安排哪些比赛可以使得收益最大。可以设dp[i]表示到i这个赛道为止能获得最大的利益有状态转移方程dp[i]=max(dp[i-1],dp[j]+benefit[j+1][i]-mend[j+1][i]);注: j+1->i之间有赛道数据范围200000 暴力的话 Read More
http://www.codeforces.com/problemset/problem/182/E给你n中篱笆,每种篱笆都有一个长和一个宽,设为a[i],b[i],再给你一个长度L问用这些篱笆的长可以组成多少长度为 L 的漂亮的篱笆漂亮的定义: 1、相邻的两个篱笆要属于不同的种类 2、 后一个篱笆的长必须等于前一个篱笆的宽注意:一个篱笆的两个边长都可以作为长因为所选的每个篱笆都有两种状态,一种是用a[i]作为长,一种是用b[i]作为长所以可以设dp[i][j][0]表示组成i长度的篱笆,最后一个为第j个篱笆,且第j个篱笆用a[i]作为长的方案数同样dp[i][j][1]表示第j... Read More
http://www.codeforces.com/problemset/problem/182/D求两个字符串的公约数的个数,具体细节见题目利用KMP可以求最小周期的特性来解这道题具体证明参见我的另一篇文章所以第一步:KMP求出两个串的最小周期 t1 t2第二步:分情况讨论1: t1==n&&t2==m2: t1==n t2!=m3: t1!=n t2==m4: t1!=n&&t2!=mView Code #include<cstdio>#include<cstring>int n,m;char a[100100],b[100100]; Read More
给出一棵树询问 a-b的路径长度是多少sum【i】记录节点i到根的距离长度对于每次询问,用RMQ预处理的LCA可以在线回答每个询问, ans=sum[a]+sum[b]-2*sum[LCA(a,b)];但是这个题目离线的tarjan算法在速度上上拥有巨大的优势,几乎是瞬秒的View Code #include<string.h>#include<stdio.h>#include<vector>#include<math.h>using namespace std;const int M =40100;const double inf = 1e20 Read More
题意:给你两个字符串s、t,输出由s组成的字符的一个排列,使得s字典序大于t,且字典序尽可能小做法,贪心,要使字典序尽可能小又要大于t的字典序,则应该使得答案串与t串的前缀尽可能多的相同然后就分两步走了1 如果s中包含了t中的所有字符,且有多余的字符(因为字典序要严格大于t),则直接输出t,在接在后面输出剩下的字符的最小字典序的一个排列2 假如1的条件不成立,就找这样一个位置,这个位置之前的字符都可以做到和t相同,且这个位置的字符要比t相应位置大,因为要是前缀尽可能多的相同,所以贪心的从后往前求这个位置,找到这个位置后就可以把s中剩下的字符一并输出了View Code #include< Read More
有一个连通器,由两个漏斗组成,倒vol提及的水,问你连通器中水的高度是多少解法:先求出水面可以到达的最低和最高的高度,然后二分答案判断View Code #include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const double eps = 1e-8;const int maxn = 1010;const double inf = 1000000000;int n,m;double vol,miny,maxy,ans;str Read More
这道题关键是有两个延迟标记当区间被完全覆盖时,要撤销抑或操作所以每次先判断当前区间有没有被完全覆盖有的话就直接改变相应的值,没有的话在判断有无异或标记主要是这个地方要注意,其他地方都和另外一道题一样代码有点长,但是不难View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int num Read More
题意:给你一个整数序列,按照这个序列构造一颗二叉排序树输出一个整数序列,要求按照这个序列构造的二叉排序树的形状和原来的一样,而且序列的字典序最小做法:按照题目的序列构造好二叉排序树后直接按照先根遍历的顺序输出即可,因为左儿子小于右儿子,所以在根先输出的情况下,尽量都先输出左儿子,刚好符合先根遍历的特点从来不写指针,最近也偶尔写写,尝试不同的方法View Code #include<stdio.h>#include<string.h>#include<stdlib.h>struct node{ int num; struct node *left; struc Read More