随笔分类 - codeforces
摘要:蛮有意思的一个题给你一个字符串,再给你k对字符要求删掉一些字符使得字符串中不存在相邻的字符是这k对中的某一对首先如果一个字符只出现在k对中的某一对中,那么可以贪心做因为不会出现如下情况了 : aaaabbbcccc2abac即不会出现删了之后前面的字符缩进来还会出现矛盾但是当可以出现这种情况怎么办DP就派上用场了dp[i][j]表示前i个字符处理完了之后最后一个字符为(j+'a')的最小需要删掉的字符那么到某个i位置的时候,首先不管它和前面留下来的最后一个字符有没有矛盾,都可以将它删除掉如果没有矛盾,我们还可以将状态转移为以当前字符结尾View Code #include<
阅读全文
摘要:有n个点排成一行,每两个点有一个权值。现在你可以从任何一个点出发,去遍历其他点,每经过两个相邻点之间的边,边的权值就会减1,求最多能走的步数用两个dp数组记录往左走和往右走的最大步数dp1[i][0]表示从i往左走最多能走的步数dp1[i][1]表示往左走并回到i最多能走的步数dp2同理然后遍历一遍就可得答案View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;long long num[maxn];l
阅读全文
摘要:第一题我还写了一个dfs暴力--!实在是太水了,第三题一直错,赛后发现忘了特判x=3时的情况,第二题最后时刻一气呵成,无奈时间过了。。。。。啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!!!!!结果自然名落孙山。但是有句话说的好失败是成功他妈
阅读全文
摘要:raiting掉了。。。为什么除了B题其他题都这么长。。。。。还有万恶的C题,暴力枚举的时候我竟然从9开始枚举。。。。哎。C题是模拟题,我写的很烦,到了最后时刻才交,可惜啊,百密一疏。。。最近CF阅读量好大啊。。。。CView Code #include<cstdio>#include<cstring>#include<set>#include<string>#include<iostream>#include<cmath>#include<vector>#include<map>#include&
阅读全文
摘要:转自 http://roba.rushcj.com/?p=439定义k-回文串如下:(1)任何串(包括空串)都是0-回文; (2)一个长度为n的回文串,若它的前n/2个字符和后n/2个字符都是(k-1)-回文,则它是k-回文。现给定一个串(长度不超过5,000,000),设它的每个前缀分别是x-回文,求所有这些x值的和。比如abacaba,”a”是1-回文,”aba”是2-回文,”abacaba”是3-回文,故输出6。将字符串 反转接在后面,然后KMP求解即可 把原串翻转后拼接在原来的串后面,用一个不在字母表中的分隔符隔开的。然后用KMP里对模式串的预处理那个过程,求出失配以后往前跳的那个指针
阅读全文
摘要:ps:D题挂了,最后只有三个。。。。E题是赛后看着一群大神的代码YY的(网上找不到题解,好奇怪,肿么都没人写的)之所以这么迟是因为一直在纠结E题A:如果第一个人能放,那就放在中间的位置,然后第二个人不管放哪第一个人总有对称的放法B:水题C:简单贪心,错了一次D:给你一幅图,假如在地板上铺上无限的同样的图,判断从S出发能否走到无限远的地方只需要判断能否从一幅图的一个点走到相对位置相同的另一幅图中的那个点即可,通过取余来表示无限幅地图E:给你一棵树,然后又给你坐标图上的n个点,让你按照树的构成将坐标连接起来,即给所有的坐标点一个编号,将树种的点与坐标对应起来树中相交的边 在坐标中体现 的线段也相交
阅读全文
摘要:对KMP的熟练使用View Code 我的代码 kmp匹配过去,需要熟练掌握KMP,数据范围大一点也没关系#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;int n,mb,mc;char a[maxn],b[maxn],c[maxn];int p1[maxn],p2[maxn];void getp(int p[],int m,char b[]){ p[1]=0; int i,j=0; for(i=2;i<=m;
阅读全文
摘要:前两题做的还算快,可是最后却没有出题了,原因是题目都看不懂,特别是D题,真想骂几句,这神马意思啊最后由于做的比较快居然还涨rating了, ——!E题,并查集的带权合并 w[x]表示x到根的权值和在find的时候合并掉View Code #include<cstdio>const int maxn = 100010;const int mod = 1000000007;int w[maxn],p[maxn];int find(int x){ if(x==p[x]) return x; int z=find(p[x]); w[x]+=w[p[x]]; w[x]%=mod...
阅读全文
摘要:这几个题A的好不容易啊!!!留念一下树链剖分初体验:可以解决 询问一棵树上点对间的简单路径的长度 边权的最大值最小值,并支持动态修改边权,注意,树的形态始终没有改变另外,点权的变化可以转换为边权,即每个点的点权都转移到与父节点的边之间的边权上,根节点特殊判断spoj 375贴上我巨搓无比的代码,虽然没有别人的短,虽然没有别人的快,但是毕竟它A了 -_-!!!View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define lson l,m,rt&
阅读全文
摘要:突然发现这题和省赛的线段树类型一模一样的啊,可恨早没有做In one well-known algorithm of finding thek-th order statistics we should divide all elements into groups of five consecutive elements and find the median of each five. A median is called the middle element of a sorted array (it's the third largest element for a group
阅读全文
摘要:A : 暴力枚举B:找规律,也可以用数学方法找最小的x使得 a*x%b == 0 a,b已知(a=4*n b=n+1)x是所走的圈数,易得只要把x只要等于 b/gcd(a,b) 就满足了 然后答案就是a*x/b 即a/gcd(a,b)还要加上1,因为出发前就在1的位置走了一步了 所以答案 : a/gcd(a,b)+1;B题开始太草率了,被人黑了,于是又回来看B题,有点慌,直接导致没出题,raiting掉了。C:给你一个字符矩阵,由 '#' 和 ‘.’ 组成 问你最少去掉几个'#'就能使得'#'不连通由样例可得,不管什么图,最多去掉两个'#
阅读全文
摘要:题意,给你n个数,让你求第k大的连续区间和是多少例如3 41 4 2最大的区间和 1 4 2第二大 4 2第三大 1 4第四大即答案 4首先要看出单调性:枚举的和越大,区间和大于它的区间数就越少所以可以采用二分+树状数组统计的方法二分答案,再n * log(n)判断有几个区间的区间和大于mid,然后调整上下界,使这个值不断的接近k。判断符合条件的区间总数:线性扫描s【】(前n项和) 每次判断以i结尾的区间有几个区间和大于等于mid,累加即可View Code #include<cstdio>#include<cstring>#include<algorithm&g
阅读全文
摘要:哎,CF终于变色了A题:我写了个二分,囧。。。B题:模拟题,水C题:想了半天,水王(一学长)告诉我是DP,果断敲了dp[i][j]表示i字符走到j字符最大的权值View Code int dp[30][30];int max(int a,int b){ return a>b?a:b;}int main(){ int n,i,j,k; char s[15]; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); for(k=1;k<=n;k++) { ...
阅读全文
摘要:A题:水题B题:水题C题:用栈来做D题:数学题,需要仔细地分类讨论E题:给你n个数围成一个环,若两个数之间没有比他们更大的数,则称两个数是一对合法的数问n个数中共有几对数合法类似于动态规划,一个相似的题目先破环,变成一条线,把最大的元素放到两个端点(增加了一个元素)用两个数组l[],r[] l[]记录某元素往左边第一个严格大于它的数的位置,r[]记录某元素的右边第一个严格大于它的数的位置。c[i]记录i位置的数与l[i]或r[i]之间等于num[i]的数的个数具体见http://codeforces.com/blog/entry/213代码写的有点搓View Code #include<
阅读全文
摘要:ABC水题D:n个二元组,求最长的一个序列组seq,序列的每一个元素的两个值都分别大于前一个元素记忆化搜索或者筛选后DP都可以两种方法View Code #include<cstdio>#include<cstring>#include<set>#include<string>#include<iostream>#include<map>#include<vector>#include<algorithm>using namespace std;#define DEBUG printf("
阅读全文
摘要:A:裸的广搜题,需要输出路径B:贪心抓住题目的特殊性,每个物品只有1 2 两种体积先按性价比排序,贪心的优先选择性价比高的,某次选了之后体积超了,就剪掉这样子遍历一遍之后还不是答案因为可能会有1体积的空位,而可能通过去掉已选集合中某个1体积的物品,再用一个2体积的物品替代达到更优解所以这里要判断一下View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;struct node { int type; in
阅读全文
摘要:A题:模拟题,仔细点就好B题:DP给你一个数字矩阵,要求从左上角走到右下角的一条路径,这条路径上的数乘起来后末尾的0的个数最少末尾的0是由2、5产生的,于是联想一下是不是走2最少的一条路或者5最少的一条路就ok了呢?嗯,就是ok的.*_*假设从左上角走到右下角走过的数含因子2的最小的个数是x,5的最小的个数是y,则答案是min(x,y),即最优解x、y的个数中有一项是最少的证明:用反证法,假设最优解经过的数含a个2,b个5,a>x,b>y,易得答案肯定大于min(x,y),所以最优解的x、y肯定有一项是最小的View Code #include<cstdio>#incl
阅读全文
摘要:A 大水题B 模拟题,要很小心,注意细节处理C 给你在一个正多边形上的三个点,判断这个多边形的最小面积。由于这个多边形最多只有100条边,可以直接枚举多边形的边数计算是否满足判断是否满足:三个点组成的三角形的每个角是圆周角的整数倍判断整数的时候精度不宜太大View Code #include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>using namespace std;const double eps = 1e-8;const double pi = acos(-1.0);
阅读全文
摘要:A 给你一个环,环上的每条边都有一个方向,按某个方向(顺时针或逆时针)走一遍,把与行走的方向相反的边反向,并加上相应的费用,判断走哪个方向的费用比较少直接dfs搞即可View Code #include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;int out[110];vector<int> edge[110];int flag[110][110];int mm[110][110];int vis[110];vecto
阅读全文
摘要:http://codeforces.com/problemset/problem/12/D线段树View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int inf = ~0u>>2;const int N = 500010;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int Max[N<<2];struct node{ int x,y,z
阅读全文

浙公网安备 33010602011771号