Codeforces
文章平均质量分 69
C_z_Q
ACM Retired
展开
-
Codeforces 617E XOR and Favorite Number[莫队算法]
题意:给你n个数,再给定m个询问和一个数k,每个询问是一个区间 [ l ,r ]问这个区间中有多少个i j 满足a[i]^a[i+1]^...^a[j]==k;刚开始得知是莫队算法,去了解了下这个算法然后开始写,发现还是不知道怎么处理最后是照着别人代码写的,还看了好久,,最后还是理解了 自己还是弱啊。。(不过对异或和这个算法也更了解了)#includeusing nam原创 2016-09-07 21:11:52 · 468 阅读 · 0 评论 -
Codeforces 827C/828E DNA Evolution[树状数组]
题意:给定一个只包含A,T,C,G的字符串,有如下两种操作1)修改一个点的字母2)给定一个字符串e (strlen(e) 思路: 对每个字母建立10 * 10个树状数组(前面的10表示e的长度,后面表示mod e的长度后的值),表示区间中膜len(e) 结果为 k = (0...len(e)-1)的个数。查询的话,对于给定的e 查询对应len(e)的树状数组比如给定 e原创 2017-07-12 15:56:03 · 1112 阅读 · 0 评论 -
Codeforces 812C Sagheer and Nubian Market[二分]
题意:给了n个物品,每个物品的价值为ai,你可以选取其中的k个,代价是k个ai的和加上他们的下标乘k的和。问,在给定最大代价S的条件下,最多能取几个,取的最多的情况下,代价是多少。分析:对能取几个进行二分,每次判断的时候,将原来的数组对ai+i*mid排序,取前mid个,看是否大于S。以下是代码:ll n, s, ans1, ans2;struct lx { l原创 2017-06-02 13:06:46 · 732 阅读 · 0 评论 -
Codeforces 812B Sagheer, the Hausmeister[dp]
题意:n层楼,每层楼有m个房间,m个房间的左右两边分别是楼梯。每个房间0表示灯关着,1表示灯开着,走一格需要一分钟,问最少需要几分钟把所有的灯都关了。分析:我们先预处理出每层楼最左边的灯在什么位置,最右边的灯在什么位置,然后dpdp[i][0]表示走到第i层的左边楼梯处,且i层以下的等全灭的最少时间,dp[i][1]则是走到第i层右边楼梯处的答案。我们找出等未关的最高的楼层,再上面还有原创 2017-06-02 12:58:49 · 530 阅读 · 0 评论 -
Codeforces 812A Sagheer and Crossroads[模拟]
题意:(这题关键就是理解题意了。。) 1. p[i]为1的时候,如果当前方向也有1,是会发生事故的,2. p[i]为1的时候,其他方向开向 i 的路上也有1,也会发生事故。以下是代码:int l[5], s[5], r[5], p[5];int main() { for (int i = 1; i <= 4; ++i) { scanf("%d%d%d%d", &l[原创 2017-06-02 12:47:10 · 532 阅读 · 0 评论 -
Codeforces 811E Vladik and Entertaining Flags[线段树][并查集]
题意:给了一个n*m的矩阵,上下左右相同数的点可以并为同一个联通块,对于每个询问L,R 输出(1,L) ... (n,R)的块中有几个联通块。分析:用线段树维护每列的状况,一个sum表示这一块的联通块个数,L[i],R[i]表示这块中第i行左边的标号,右边的标号,标号用来表示属于哪一个联通块。每次合并,先是sum相加,一行行判断是否能合并成一个联通块,如果左右数值相同,而且,左右标原创 2017-06-01 10:37:43 · 743 阅读 · 0 评论 -
Codeforces 811D Vladik and Favorite Game[模拟][bfs]
题意:说有四个按钮 L,R可能是反的,U,D可能是反的,然后对于你每次输出的(L,R,U,D),会返回一个坐标,到达给定的F 的位置停止。分析:关键就是判断L,R 是否是反的,U,D 是否是反的,刚开始的位置是(1,1),贴墙的,为了防止走到 * 上,我们可以找一个右边是空的位置,然后输出一个L,如果在原地,那么说明 不反,如果到了右边,说明反了,对于U,D 也同样,知道反没反之后就是原创 2017-06-01 10:26:18 · 385 阅读 · 0 评论 -
Codeforces 811C Vladik and Memorable Trip[dp]
题意:给了一串长度分析:我们可以先预处理出每个数第一次出现的位置st,最后出现的位置ed,还有区间的异或值sumdp[i] 表示到了 i 之前的序列的答案为多少。每次在ed的位置转移,判断其中是否有数的ed比现在大,如果大,跳过。没有的话,找其中最小的min_st,dp[i] = min(dp[i-1],dp[min_st - 1] + sum[min_st][i]);原创 2017-06-01 10:18:49 · 411 阅读 · 0 评论 -
Codeforces 811B Vladik and Complicated Book[主席树]
题意:给了一串长度为n的序列,每个数都不相同,随后是m个询问,L R K 问将[L,R]中的数从小到大排序后,原来第K个数是否还是第K个。分析:用主席树维护这个序列,对于每个询问,查询这个区间里比a[K]大的数的个数Q,如果R - Q == k 输出 Yes。具体见代码。以下是代码。struct { int lc, rc, sum;}st[MAXN * 40];i原创 2017-06-01 10:11:11 · 545 阅读 · 0 评论 -
Codeforces 808G Anthem of Berland[dp][kmp]
题意:给定一个包含?的字符串A,还有一个字符串B,问B最多可能在A中出现几次。分析:dp dp[i] 表示0-i的字符串最多能出现几次Bcnt[i] 表示最后一次出现的 B 以 i 结尾 0-i中最多能出现几次B转移:为了转移,我们还需要一个next数组首先将dp[i] 赋值为 dp[i - 1],O(lenB)判断是否能以当前位置结尾,(如果有一个位置字符不相同原创 2017-05-25 17:41:54 · 1080 阅读 · 0 评论 -
Codeforces 786C Till I Collapse[主席树][二分]
题意:给你n个数,问最少能把这n个数分成连续的几段,且每段中不同的个数小于等于k个,输出k从1到n的答案。分析:我们知道i~(i,,,n)的不同数的个数肯定是递增的,所以对于每个i,我们可以通过二分得出一个最大的j使[i,j]中不同的数个数我们可以利用主席树,以root[i]为顶点的线段树存的是,[i,n]中不同的数个数,对于每颗树,将每个第一次出现的数的位置 置为1,其他重复出现原创 2017-03-24 17:04:27 · 1165 阅读 · 0 评论 -
Codeforces 771B Bear and Different Names[构造]
题意:现在需要给n个东西命名,任意连续k个不能有相同名字,给了n-k+1个连续名字的满足情况"YES"or"NO",第i个YES表示从i开始连续k个名字是互不相同的。分析:问题在于我们如何构造出一个满足条件的n个名字,首先,我们先构造出n个互不相同的名字,首字母大写,然后看要求,如果是"NO“,令ans[i+k-1] = ans[i],这样,我们到下一个要求的时候刚开始还是两两互不相同的。知道原创 2017-03-19 17:42:58 · 711 阅读 · 0 评论 -
Codeforces 771A Bear and Friendship Condition[并查集]
题意:给了你一张图,问是否 对任意的A,B,C,有A-B 和A-C的话,同时有B-C 分析:其实就是每个块都是一个完全图,n个顶点的完全图有n*(n-1)/2条边。用并查集统计每个块有几个点,几条边。需要注意的是n*(n-1)/2这里是会爆int的,需要用longlong(心痛。。以下是代码:#include#include#include#include#include原创 2017-03-19 17:35:59 · 842 阅读 · 0 评论 -
Codeforces 85D Sum of Medians[线段树]
题意:给了一个set,有n个操作,有三种操作1. add x 把 x 放入set中;2. del x 把 x 从set中删去;3. sum 求set中,第n大的数,n%5==3,的总和。分析:因为x有[0,1e9],所以肯定要离散化处理,刚开始我的思路是线段树存当前区间的个数,然后每个sum去二分[1,m]有余5是3的个数的值,发现还是会T。正解是:每个线段原创 2017-03-02 17:52:14 · 547 阅读 · 0 评论 -
Codeforces 768B Code For 1[DFS]
题意:给你一个小于2^50的数,每次将这个数分成三个数 x/2,x%2,x/2,直到剩下的数全是0,1,然后给你一个询问L,R,问你这个区间里面1的个数有几个。分析:通过观察可以发现,给你一个数n,分解后这个01串的长度为比他大的2^k-1,然后0只会出现在x%2的位置。所以,一开始,我们将ans设置成R-L+1,每次dfs,取一个中点mid(因为x%2只会出现在中间)如果当前n%2==0 而原创 2017-02-21 13:17:39 · 464 阅读 · 0 评论 -
Codeforces 767C Garland
题意:给你一颗有n个节点的树,每个节点都有一个值,问你是否能删去两条边使删后的三块值的和都相等。分析:首先,要使三块和相等,总和sum%3一定是0的。这样我们先用一个dfs求出每个节点的子树的值的总和,再遍历一遍找值是sum/3的节点,因为删去的两条边的节点可能有两种情况,一种是一个是另一个的祖先,另一种是一个和另一个没有关系,所以我的做法是找到sum/3的节点,先放到一个vector里面,再原创 2017-02-19 12:28:34 · 1961 阅读 · 0 评论 -
Codeforces743D Chloe and pleasant prizes[树形DP]
题意:给你一棵以1为根的树,问截取他的两棵子树,这两棵子树上的节点的值全加起来的最大值为多少,并且这两棵子树不能有公共的节点。如果不存在这样的两棵子树,输出"Impossible".首先是不存在的情况,当给出的一棵树为一条链的时候就是不存在的。然后就是如何求值,我们把选子树看成选择树上的一个节点u,那么我们就需要以u为根的树上的点值的总和,我们用一个数组cot存,其次,因为要求最大原创 2016-12-16 18:31:18 · 479 阅读 · 0 评论 -
Codeforces 721D Maxim and Array[贪心]
题意:给定n个数,每个数的绝对值小于1e9,需要进行k次操作,每次操作可以使一个数+x或-x,问k次操作之后每个数相乘结果最小的n个数。思路:首先当n个数中有奇数个负数,那么当前乘积已经是负数了,我们只要对绝对值最小的数加或减得到的结果就是最小的,用一个优先队列处理。当n个数中只有偶数个负数时,我们可以选择把绝对值最小的那个数变正,或负,如果k不够,那么直接在这个数上处理k次,得到的结果也原创 2016-10-01 18:45:59 · 324 阅读 · 0 评论 -
Codeforces 827A/828C String Reconstruction[线段树单点更新]
题意:给了你n个字符串,然后说明这个字符串在什么位置出现了,然后让你输出字典序最小的答案.分析:1.首先是答案的长度,因为长度约小字典序越小。所以长度取,给定的n个字符串出现的最大的(位置+len(i)-1);2.如何把给定的字符串更新上去, 因为题目保证没有矛盾,所以更新过的点就不用再更新了,这样我们用一个vis数组,表示当前区间是否已经完全更新完,如果更新完了就不管了,没更原创 2017-07-12 16:03:22 · 918 阅读 · 2 评论