Codeforces
Winterfell30
这个作者很懒,什么都没留下…
展开
-
Codeforces 675C Money Transfers (扫描)
题意每个银行都有都有一个需求,有的是正数有的是负数。 要求到最后通过数字转移全部银行都变成0,求最小移动步数。思路首先把他看成一个环来考虑,每次转移都要经过全部的有需求的银行,那么显然我们可以找到一个不用走的区间也就是中间全部为0的区间,让这个区间的结尾作为转移资金的开头,循环一遍到这个区间的开头。 预处理一下前缀和,然后再枚举一遍找到最大就可以了。代码#include <stdio.h>#i原创 2016-05-17 14:35:49 · 797 阅读 · 0 评论 -
Codeforces 675D Tree Construction (splay)
题意往一个根为a[0]的二叉搜索树里面插数,每插一个数就输出他的父节点。思路根据二叉搜索树的性质,我们插进去一个数,他的父节点肯定是比他小的最大的和比他大的最小的数里面的两个,然后这两个节点找最深的那个就是他的父节点,我们可以给这些节点设置一个时间戳就能判断先后顺序了。 在找那两个节点的时候我是直接用的splay找的,实际上我们可以直接用两个set一个储存负数一个储存正数然后两个lower_bou原创 2016-05-17 14:49:15 · 797 阅读 · 0 评论 -
Codeforces 670E Correct Bracket Sequence Editor (list模拟)
题意给出一个合法的小括号序列,然后有三种操作: L 光标左移 R 光标右移 D 删除当前位置括号并他的对应括号,两括号中间的也一起删除。 输出操作后的序列。思路list直接模拟就好了,这题主要考察的也就是list的操作吧。 list的删除也确实是个坑,注意光标移动出界之后别忘了向左移动一下。代码#include <stdio.h>#include <string.h>#include原创 2016-05-07 00:50:06 · 3707 阅读 · 1 评论 -
Codeforces 635C XOR Equation (脑洞)
题意给出一个s和一个x(s <= 1e12, x <= 1e12),求有多少对数相加等于s异或等于x。思路对于任意a和b,我们有s = a ^ b + (a & b) * 2,然后能得到a & b=(s - x) / 2。 那么显然当s < x或者s - x是最低位为1的时候无解 。 得到a & b之后还有一个重要的判定就是a & b和x相与不为0的时候也是不可能存在的。 然后就按照异或值按位原创 2016-05-07 01:00:43 · 589 阅读 · 0 评论 -
Codeforces 635D Factory Repairs (树状数组)
题意有一个机器,修好的时候一天可以生产a个没修好的时候每天可以生产b个,初始时机器是坏的,修好需要k天,这k天不能生产。 给出一些操作: 1,di,ai 表示在第di天新增了ai个订单,这ai个订单只能在一天完成。 2,pi 表示选择在第pi天修复机器。 对每个2操作输出最后的生产数量。思路树状数组维护两个sum,一个是维修前即a,一个维修后即b的。 然后查询的时候输出维修前的suma和维原创 2016-05-07 18:33:33 · 768 阅读 · 0 评论 -
Codeforces 11D - A Simple Task (状压DP)
题意求出一个n个点m个边的图,求简单环有多少(没有重复点和边)。思路这是个不错的题,这个状压dp保存的状态不是直接的环,而是路径的个数。s表示的状态为一条路径,则dp[s][i]表示以s的最小编号为起点,以i为终点的环的个数。那么我们就可以通过枚举状态,枚举状态中的起点和枚举路径外的终点,然后判断终点和起点是否相连来判断是否成环。代码 #include <stdio.h>#include <str原创 2016-05-08 19:17:29 · 1385 阅读 · 0 评论 -
Codeforces 673D Bear and Two Paths (贪心构造)
题意给出n个点,给出a,b,c,d,求能不能用少于m的边构成两条欧拉路 一条从a开始到b一条从c开始到d。思路因为m只有上限没有下限,我们贪心的构造就可以了,也就是说除了a,b,c,d其他的点都用相同的路径,这样就能使得路径最少了。 需要注意的是n等于4的时候。代码#include <stdio.h>#include <string.h>#include <iostream>#includ原创 2016-05-08 19:28:18 · 688 阅读 · 0 评论 -
Codeforces 451C Predict Outcome of the Game (枚举+YY)
题意3个队伍参加n场比赛打完k场之后一号队伍和二号队伍的差为d1,二号队伍和三号队伍的差为d2。求能不能n场比赛之后达到三支队伍平局。思路注意这里的一号二号只是标号不是名次,所以我们讨论k场比赛的情况,满足d1、d2的只有五种也就是代码中的五种分别讨论一下就行了。代码#include <stdio.h>#include <string.h>#include <iostream>#include原创 2016-05-08 19:44:20 · 1043 阅读 · 0 评论 -
Codeforces 451D Count Good Substrings (组合数)
题意给出一个只有a和b的串求有多少个子串满足删去连续的重复字母之后是一个回文串,输出分为奇数长度和偶数长度的。思路只有两个字母这是个很重要的条件,这样的话一个子串只需要头和尾相同就可以删成一个回文串了。 那就分别讨论一下就可以了: 奇数长度的=C(2oddnumofa)+C(2oddnumofb)+C(2evennumofa)+C(2evennumofb)奇数长度的 = C\binom{2}{o原创 2016-05-08 19:53:59 · 440 阅读 · 0 评论 -
Codeforces 16E Fish (状压dp+概率)
题意有n条鱼,他们相遇时会吃掉对方,给出他们相遇时双方获胜的概率,求这n条鱼最后剩下自己的概率。思路看范围就要考虑状压DP,dp[s]表示当前剩下的鱼的状态为s时的概率。 那么P(i吃掉j) = P(i和j同时存在) *P(ij相遇)* P(i战胜j) 即dp[s ^ (1 << j)] += dp[s] * p[i][j] * 1 / (num * (num - 1) / 2)。num是当原创 2016-05-08 19:00:05 · 1074 阅读 · 0 评论 -
Codeforces 686 D Kay and Snowflake (树重心)
题意给出n个节点的树和q个查询(范围均为3e5),对每个查询输出x为根节点的子树的重心。思路树的重心有几个很好用的性质,下文参考这里 1.树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么他们的距离和一样。 2.把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上。 3.把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离。原创 2016-06-27 23:17:06 · 955 阅读 · 0 评论 -
Codeforces Round #360 (Div. 2)
A按照题意暴力找一下char s[110];int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n, d; scanf("%d%d", &n, &d); int last = -1, ans = 0; for (int i = 0; i < d原创 2016-07-01 16:13:22 · 403 阅读 · 0 评论 -
Codeforces 571B Minimization (DP)
题意有一个n个数的序列,给出一个k,可以通过对序列重排让∑n−ki=1|Ai−Ai+k|\sum_{i=1}^{n-k}|A_{i}-A_{i+k}|最小,求最小值。思路题目相当于分成k组,使得{0,k,2k…},{1,k+1,2k+1…}等这些序列分别的序列更小。 显然对于每一个链就是排序之后得到的绝对值的和最小,通过列项相消就能得到对于序列i他的结果就maxi−minimax_i-min_i原创 2016-06-17 15:04:03 · 471 阅读 · 0 评论 -
Codeforces 689D Friends and Subsequences (RMQ+二分)
题意求有多少对区间满足其中一个区间的最大值等于另一个区间的最小值。思路首先RMQ预处理出所有区间的最大值和最小值(线段树会超时。。。) 然后因为我们固定这两个区间的左端点枚举区间的右端点,因为右端点越大max越大min越小,所以是满足二分的单调性的。 所以这题的做法就是枚举左端点,二分右端点的max == min的左边界l和右边界r,即[i,l]到[i,r]的区间都是满足max等于min的,统计原创 2016-07-16 22:52:56 · 526 阅读 · 0 评论 -
Codeforces 672D Robin Hood (二分)
题意有一个数列,有k天,每天可以让最大值减一最小值加一,求k天后最大值和最小值的差值。思路刚开始一直想着用什么东西维护一下,其实这个应该算是个模拟吧。 因为是把大的加到小的上面,所以我们只要看一下这个k最多能给最小值提高到多少,最多能给最大值减少到多少。 我们可以二分这两个值(找好上下界也就是最大值不能再分的时候),或者直接扫两遍也是支持的。代码#include <stdio.h>#inclu原创 2016-05-13 01:25:58 · 553 阅读 · 0 评论 -
Codeforces 672C Recycling Bottles (YY)
题意给出两个人的初始位置和垃圾桶的位置。 然后要把n个不同位置的瓶子一一放到垃圾桶求要走的最小距离。思路因为每次只能放一个瓶子,所以显然除了拿的第一个瓶子以外其他的都要走它和垃圾桶的距离二倍。也就是每个人的最小距离的公式就是所有的瓶子和垃圾桶的距离和的二倍减去某一个瓶子和人的距离及其和垃圾桶的距离的差值,对每个瓶子每个人维护一下差值然后使其尽量大就行了。 因为智障直接排除掉了有一个人不动的情况没原创 2016-05-13 01:14:08 · 685 阅读 · 0 评论 -
Codeforces 282E Sausage Maximization (Trie)
题意给一些数字,求前缀异或和后缀异或的最大值,前缀和后缀不能有交集。思路枚举每一个后缀,如果用朴素算法就要枚举每一个前缀求最大值。 我们可以后缀往后枚举的时候,从之前的前缀里找到异或最大的,然后前缀加一个数的长度之后继续插入。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#incl原创 2016-04-26 14:20:38 · 495 阅读 · 0 评论 -
Codeforces 669C Little Artem and Matrix (模拟)
题意对一个矩阵有三种操作 1.第row行循环右移x位 2.第col列循环下移x位 3.告诉你第row行的第col列的数是x。 要求构造出符合操作的原矩阵。思路因为数据很小,直接暴力就可以了,按照操作倒着模拟一遍,有3操作的就填数,没有的就为0。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algo原创 2016-04-28 21:34:51 · 702 阅读 · 0 评论 -
Codeforces 669E Little Artem and Time Machine (离散化树状数组)
题意给出一个multiset,可以对他进行三种操作: 1.在t时间增加一个x 2.在t时间删除一个x 3.查询t时间x的个数并输出思路题意看了很久很懂= =,看懂之后决定朴素BIT来一发,因为有时间和x两个维度,且都是1e9,选择其中任意一个离散化一下就可以用map来维护sum了,然后过了。时间390ms,内存50000+。。。代码#include <stdio.h>#include <st原创 2016-04-28 21:59:27 · 609 阅读 · 0 评论 -
Codeforces 669D Little Artem and Dance (脑洞)
题意给出一个1到n的序列,对他有两个操作: 1.整体向右移动x格子 2.奇偶位的数字互换 求经过q次操作之后的数字序列。思路显然这题是要O(q)来做的,从第一组样例能发现虽然整体在变,但是相邻的两个数是始终在一起的,但是这并不是正解,因为当移动的位数是奇数的时候再经过奇偶互换就不挨着了。 然后我随便造一个样例,发现不管怎么变奇偶性相同的相邻的数都是隔着一个数的顺序排列的,然后想一下变化过程的原创 2016-04-28 21:50:32 · 714 阅读 · 0 评论 -
Codeforces 149D Coloring Brackets (不错的区间DP)
题意给出一个合法的括号序列,要求给这个序列染色,求染色方案。 1.可以选择无色、红色、蓝色。 2.每一对括号要有且仅有一个染色的括号。 3.相邻的括号不能有相同的颜色(无色没关系)思路显然是个区间DP,然后因为他的转移和相邻和相对的括号有关系,所以我们要对每一个区间保存一下当前区间端点的括号颜色,也就是dp[i][j][k][l]表示区间ij的端点颜色分别为k和j时此区间的染色种数。 不过这原创 2016-05-24 14:43:35 · 552 阅读 · 0 评论 -
Codeforces 667C Reberland Linguistics (DP)
题意给出一个字符串,选出大于4个字符当前缀,然后把后面的字母分成2个或者3个的小字符串,要求每个字母都要包括并且在同一个分词方案里面没有连续的相同小字符串,字典序输出所有可以分出来的小字符串。思路刚开始我枚举出所有除去末尾剩一个字母的可能的后缀串,然后WA6了,然后想到有可能会有xxxxxabab这种,然后特判了一下还是WA6,然后想到xxxxxababab这样也不会有ab,然后感觉再特判一下可能还原创 2016-05-01 16:58:42 · 1037 阅读 · 1 评论 -
Codeforces 667D World Tour (最短路+枚举)
题意另dis[u][v]表示u到v的最短路,求最长的dis[i][j]+dis[j][k]+dis[k][l],输出i, j, k, l。思路先n*nlogn预处理出来所有点的最短路,然后给所有的dis[i][j]排个序保存起来,给所有的dis[k][l]排个序保存起来,然后就可以枚举所有的j和k,从itoj找最大的4条,ktol找最大的4条加起来就行了,找4条是因为为了防止这4个点出现重合比如j找原创 2016-05-01 17:11:42 · 932 阅读 · 0 评论 -
Codeforces Gym 100513
前面这些题都是一些模拟贪心= =描述还都很长。。。100513I - Sale in GameStore可以买任意一个游戏,然后可以选任意个加起来价值小于这个游戏的求最多能有几个。#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>using namespace原创 2016-10-22 14:19:29 · 598 阅读 · 0 评论