Codeforces Div. 2:D
文章平均质量分 91
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #340 (Div. 2) D. Polyline 计算几何,折线
几何,折线 题意 给出3个点的坐标, 用折线把3个点连起来,要求每个线段 parallel to the coordinate axes(平行于坐标轴),然后线段没有交叉 和 self-touches(可能是说不能成环), 求出需要的最小的线段个数 所以, 如果(x1 == x2 && x2 == x3) || (y1 == y2 && y2 == y3) 则可以一条线段 如果 (x1 == x2) || (x2 == x3) || (x1 == x3) || (y1 ==原创 2016-09-01 01:39:18 · 1136 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses 并查集+双重01背包
题意:一堆人,这些人构成一些集合,2个元素至少有一条路径则为同一个集合,对于这些集合每个交合要么全取要不去不超过一个人,且每个人有一个wi和ai,要求在总wi小于等于w的情况下,是总ai最大 并查集+双重01背包 先用并查集处理出ptr-1个集合,然后对于这ptr-1个集合要么全取要么去不大于1个,跑一边01背包。 dp[i][j]表示到 第i个背包是,总消耗容量j是最多装 dpij的东西。 复杂度 O(N^2)原创 2017-01-10 18:50:54 · 708 阅读 · 0 评论 -
Codeforces Round #386 (Div. 2) D. Green and Black Tea 数论+贪心
题意:喝掉n袋茶,其中a袋绿茶b袋红茶,连续喝相同的茶最多k次,如果可以全喝完则输出喝茶的序列,如果不能则输出NO 数论+贪心 char a为个数多的那个茶的字母的代表,同理b为少的那个字母,aa为a的个数,bb为b的个数 首先int realk = aa / (bb + 1); if(realk * (bb + 1) < aa) realk++; 如果 realk > k 则 ans 为 NO; 否则把aa 分成 bb + 1组,int ok = aa % (bb + 1);if(ok == 0){ok原创 2017-01-11 01:24:32 · 799 阅读 · 0 评论 -
8VC Venture Cup 2017 - Elimination Round D. PolandBall and Polygon 树状数组+几何
题意:给出一个凸n边形,然后给一个k,存在gcd(n, k) == 1,然后从顶点x = 1开始,在x 与 y = x + k;//(while(y > n) y -= n;) 间画一条线,然后 x = y,继续 y = x + k 画线, 没每画一条线图形中存在的中平面块数。 树状数组+几何 用ans表示画线前的平面块数,画一条xy线,则多出的平面块数为 线xy穿过的线的个数+1, 观察可以发现,xy穿过的线段的个数等价于 顺时针方向 x与y之间点的权值和,(每个点的权值为点所在的线段的条数), 然后考虑原创 2017-01-16 18:33:41 · 909 阅读 · 0 评论 -
Codeforces Round #389 (Div. 2) D. Santa Claus and a Palindrome 回文串+贪心+数据结构、字符串
题意:给出k个长度为n的字符串且每个字符串有一个权值,选一些字符串构成一个回文串,使这个回文串的总权值尽可能大,就权值的最大值。 回文串+贪心+数据结构、字符串 把字符串和权值储存在map<string, vector<int> > mp里,用map<string, bool> flag来标记字符串是否为回文串。 选尽可能多的字符串对x + y > 0,x与y互为回文,且xy都优先选大的,其中分成本身是回文串的和不是回文串2类讨论, 如果本身是回文串,且个数大于2,而且x + y > 0,则也ans +=原创 2017-01-15 00:45:36 · 942 阅读 · 0 评论 -
Codeforces Round #299 (Div. 2) D. Tavas and Malekas KMP+预处理、string suffix structures
题意:给一个字符串p,然后一个长为n的字符串s上,对于m个yi,每个yi,有syi-1syi-1+1... syi-1 + |p| - 1 = p,如果s是可能存在的求出s的可能方案数%1e9+7,否则输出0. KMP+预处理、string suffix structures 搞出字符串p的next数组,然后预处理出p的next[sz]的所有 {k | p[1..k] == p[i - k + 1..i]},放在bool check[k] == true里。 然后扫一遍y[],对于相邻的2个y 有y[i]原创 2016-11-21 23:57:12 · 912 阅读 · 0 评论 -
Codeforces Round #397 (Div. 1 + Div. 2 combined) D. Artsem and Saunders 映射+构造
题意:给出一个函数f(x) 属于[1,x],然后要求确定一个数m,使x属于[1,n],g[x]属于[1,m], x输入[1,m] h[x]属于[1,n], 当存在m时,求m最小时的gx和hx。 映射+构造 先把fx离散化化,然后通过离散化的结果,和h(g(x)) = f(x) for all , 求出gi 和 hi, 最后用g(h(x)) = x for all 来检查gi和hi,如果可以则输出,否则-1. 其中可以证明 fi 离散化成任意[1,m]都不影响结果,只要保证不同的数离散化成不同的数,相同的数原创 2017-02-14 19:43:57 · 908 阅读 · 0 评论 -
Codeforces Round #401 (Div. 2) D. Cloud of Hashtags 贪心、字符串处理
题意:给出n个字符串,要求删除尽可能短的后缀,是这n个字符串的字典序是非递减的。 贪心、字符串处理 可知,可以且需要从倒数第二个字符串开始考虑删除后缀,使s[i] <= s[i+1],因为只能从后往前处理, 然后删除后缀的时候满足删除尽可能短的后缀即可。 复杂度 O(n*length)原创 2017-02-25 00:01:30 · 652 阅读 · 0 评论 -
Codeforces Round #404 (Div. 2) D. Anton and School - 2 前缀的后缀、 范德蒙恒等式、容斥
题意:给出一个只有"("和“)"的字符串,为有多少个子序列,它的长度为len,则左边len/2个字符为”("右边len/2个字符为")",问这样的子序列有多少个。 前缀的后缀、 范德蒙恒等式、容斥 子串为 前缀的后缀,这里是子序列,所以s[i]为必取,作为序列的最后一个元素,然后前面的"("为选取, 所以可以预处理出suml和sumr,分表表示i的左边有多少个"(", i的右边有多少个")". 然后对于每个“(",必选这一个"(",然后i之前的(进行排列组合,选j个"(",就在sumr[i+1]里选j个")原创 2017-03-16 01:44:40 · 1553 阅读 · 0 评论 -
Codeforces Round #353 (Div. 2) D. Tree Construction __ Binary Search Tree
这个 construct the binary search tree 是 按 照 输 入 顺 序 构 造 的,每次从根部遍历按照二叉搜索树原理去找值然后把节点加上去 traverse the tree starting from the root 当时查单词的时候 traverse 只看到了"旋转" 然后就懵了, 结果还有遍历的意思,而且根据句子翻译也是 遍历 (┬_┬) 这里不用rotate()旋转 看了题解才注意到这个,然后才搞明白 ^_^ 所以每次插入,只要考虑已经出现(在树上)的比它大而且在隔原创 2016-05-17 23:05:13 · 2266 阅读 · 2 评论 -
Codeforces Round #402 (Div. 2) D. String Game 二分+优先队列+字符串匹配
题意:给出文本串和目标串,然后给出一个文本串删除字符的序列,从a1~an,要求删除s[a1 ~ ak]时剩下的字符串依然可以匹配,求尽可能大的k。 二分+优先队列+字符串匹配 从左往右是删除字符的顺序,倒着做,从右往做是添加字符的顺序,故check mid~n这个序列能否满足目标串的匹配,要求mid尽可能小, 故二分这个剩余序列长度即可,每次check是用优先队列priority_queue<int, vector<int>, greater<int>> pq;,然后依次进行匹配。 复杂度 O(nlognl原创 2017-02-26 21:41:34 · 1052 阅读 · 0 评论 -
Codeforces Round #394 (Div. 2) D. Dasha and Very Difficult Problem 贪心
题意:数组a、b,由bi - ai 得到ci,要求每个ci都不相同,给定a和p(p为c的压缩之后的保持大小顺序不变的序列),求b。 贪心 可以令 ci = pi + k,因为p为c的压缩之后的保持大小顺序不变的序列。 然后bi = ai + ci = ai + pi + k; 然后可以求出bi,这是用maxv = max{bi},minv = min{bi},然后如果 minv~maxv的宽度大于lr的宽度,则ans = -1; 否则,把区间minv~maxv 移到 lr里,如果偏小就每个bi都加(l -原创 2017-02-01 13:33:14 · 700 阅读 · 0 评论 -
Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 2-SAT、并查集
题意:每个门有且必须被2个开关所控制,一个开关可以控制多个门,给定n个门的初始状态和每个开关控制哪些门,问是否有方案打开一些开关使所有的门都为unlocked状态。 2-SAT、并查集 把由于每个门被2个开关控制,所以把门看成是边,把开关看成是点,每个开关有2种点,打开i和关闭i+m,从而变成一个经典的 2-SAT 问题。 一个门分别被last[r] 和 i控制,则 如果门是开的,则2个开关要么都关要么都开,_merge(last[r], i); _merge(last[r] + m, i + m); 否原创 2017-03-22 01:26:12 · 1027 阅读 · 0 评论 -
Codeforces Round #409 (Div. 2) D. Volatile Kite 计算几何、凸多边形、线段类
题意:给出一个凸多边形,要求求出一个最大的dist,使得所有的点可以任意移动距离最大为第dist的路程,依然为凸多边形。 计算几何、凸多边形、线段类 对于凸多边形,每相邻的三个点可以构成一个三角形ABC,答案为B到AC的距离的一半, 可以以每个点为圆心话圆,这里借用一下官方Tutorial里的图片☺☺ 然后借助下常用的点类和线段类即可,以下用的是红书上的线段类 复杂度 O(n)原创 2017-04-17 23:32:41 · 1062 阅读 · 0 评论 -
Codeforces Round #408 (Div. 2) D. Police Stations 最短路、BFS
题意:有一棵无根树,有一些节点上有一些标记(police station),初始时满足,每个节点至少 与一个被标记过的节点相连且距离不超过d,要求去掉尽可能多的节点,使剩余的图依然满足,每个节点至少 与一个被标记过的节点相连且距离不超过d。 最短路、BFS 本来用dfs写了一发,后来发现很多情况下会重复去掉边。 用BFS来做比较好,从所有的被标记过的节点开始BFS,当接下来的边会导向已经访问过的节点时把这条边减去,否则放入队列。 这样每个节点都会与一个被标记过的节点直接或间接的相连,且距离不超过d。 最终会原创 2017-04-13 19:38:48 · 767 阅读 · 0 评论 -
Codeforces Round #447 (Div. 2) D. Ralph And His Tour in Binary Country 二叉树、预处理、二分、数据结构
题意:给出一颗二叉树,每条边有一个权值,q个询问,每次询问以x为起点,到yi点,求max(H - xyi, 0)求和。 二叉树、预处理、二分、数据结构 先在每个节点维护 该点 到 以其为根的点 的距离,且排序(笔者用的c++的sort所以比归并排序多出一个logn), 并维护n个前缀和。这里时间复杂度 O(nlognlogn) 空间复杂度 O(nlogn)。 然后查询的时候,对于x点进行二分可以找出答案,然后向上回溯,且维护一个变量sumlx为其祖先节点到x的距离。 查找该节点所在的链的隔壁的子树,进行二分原创 2017-12-08 13:34:43 · 578 阅读 · 0 评论 -
Codeforces Hello 2018 D. Too Easy Problems 二分+贪心
题意:有m个题目,每个题目有个需要花费的时间ti,以及ai,表示只要最终过题数不超过ai这个题才count。求最大的过题数以及过了哪些题,多种答案则输出任一答案。 二分+贪心 首先把题目按照ti的为优先级排序,时间少的在前面。 然后二分答案,mid表示最终的过题数,check的时候,维护剩余的时间tmp,用cnt表示已选的题目数量, 对于题目从左向右扫,每次如果该题的ai<= mid 则 tmp -= ti,当tmp >= 0是cnt++,然后tmp <= 0时break。 之后cnt >= mid则返回真原创 2018-01-13 17:45:08 · 592 阅读 · 0 评论 -
Codecraft-18 and Codeforces Round #458 (combined) D. Bash and a Tough Math Puzzle 线段树+二分+卡时间+优化
题意:给出一个长度为n的序列,q个操作,每次询问区间[a,b]内最多改一个数,能不能变成gcd(a~b)== x;或者把第i个数改成y。 线段树单点修改区间查询+二分+卡时间+优化 用线段树单点修改区间查询来维护一段区间的gcd, 然后对于修改操作可以直接修改, 而对于询问操作则要二分出一个最大的区间[a,mid]满足gcd(gcd(a~mid),x) == x, 此时如果mid == b 或者 mid == b-1或者 gcd(gcd(mid+2~b),x) == x 则 Yes,否则No。 当mid不存原创 2018-02-01 12:57:12 · 532 阅读 · 0 评论 -
Good Bye 2016 D. New Year and Fireworks dp+枚举、状态总数
题意:烟花刚开始时占用一个格子的空间,然后开始移动经过ti秒(每秒移动一个格子),开始分裂,分裂成2半,分别向2边偏移了45度,然后运动ti秒,总共n个ti,问在这个二维平面里共有多少个格子有烟花经过过了。 dp+枚举 由于n <= 30,ti <= 5故向各个方向最多运行150个单位,故烟花只出现在一个300*300的平面内, 故定义状态dpijk,表示在ij点是否在上一秒有k方向上的烟花 对于每个ti 每一秒跑一遍ijk,把状态转移到newdpxyk里, 然后把newdpijk 拷贝到dpijk里,并维原创 2017-01-14 00:52:05 · 997 阅读 · 0 评论 -
Codeforces Round #382 (Div. 2) D. Taxes 数论、哥德巴赫猜想
题意:给定一个数n,n可以分成k个数的和(ni >= 2 , sum{ni} == n, k 可以为 1),花费为ni的除本身外的最大因数,求花费和的最小值。 数论、哥德巴赫猜想 任意大于2的偶数可以拆分为两个质数之和 然后2是素数所以ans = 1; 当n 为 奇数时判断是否为素数,如果是素数则 ans = 1; 如果不是,则判断 n - 2是否为素数,如果是则可以把n拆成一个素数和2 ans = 2; 否则只能拆成一个素数+一个大于2的偶数 ans = 3; 复杂度 O(sqrt(n))原创 2016-11-28 03:11:09 · 1197 阅读 · 1 评论 -
Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset 二进制树、Trie
二进制树、Trie 用一个二进制树(字典树的一种特殊化)来储存 child[x][k] 表示以x为父节点, k 为边, 的子节点 sz[x]表示这个节点的值, 值为0的时候节点不存在 查询的时候, 从根开始走, 尽量去走 和 val 的当前二进制为不相等的节点, 此时的二进制异或为 1 , k = ((val >> i) & 1) ^ 1, res ^= 1 << i; 如果没有再走二进制为相等的节点 if(!sz[chil原创 2016-09-09 02:17:36 · 1207 阅读 · 0 评论 -
Codeforces Round #345 (Div. 2) D. Image Preview __ two pointers and pretreat
Vasya's telephone contains n photos. Photo number 1 is currently opened on the phone. It is allowed to move left and right to the adjacent photo by swiping finger over the screen. If you swipe left from the first photo, you reach photo n. Similarly, by swi原创 2016-04-14 11:31:10 · 1673 阅读 · 0 评论 -
Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线操作,树状数组,last[value],异或和
离线操作,树状数组,last[value],异或和 首先,根据位异或的性质, 有一个结论:区间内所有出现次数为偶数的元素的异或和 == (区间内所有元素的异或和) ^ (区间内所有不同元素的异或和) 1、对于求 (区间内所有元素的异或和) 可以用 前缀异或和 2、对于(区间内所有不同元素的异或和), 则要用类似于求 区间不同的元素的个数 的算法 2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 树状数组+离线操作 先把所有询问储存下来, 然后原创 2016-09-16 23:17:16 · 643 阅读 · 0 评论 -
AIM Tech Round 3 (Div. 2) D. Recover the String 构造、贪心、多坑、WA162
构造、贪心、多坑、WA162 首先用杨辉三角求组合数打个表, 然后匹配一下找出 cnt11, cnt00,也就是1、0的个数 //这个做法比较暴力了嘿嘿 -_-|| 然后如果 (a01 + a10 != cnt00*cnt11) 则没有答案 否则 初始是 000000111111这样的 然后每次if(a10 >= lef0) ...... 这样就是优先搞出大的10, 因为这个时候后面的0比较多 第一次 a10 >= lef0 就把 一个1提到最前面 a10 -= lef0, 否则是0 lef0--, 然原创 2016-08-26 23:59:49 · 1356 阅读 · 1 评论 -
Codeforces Round #372 (Div. 2) D. Complete The Graph 图论、最短路、Dijkstra、路径、分配部分边权
图论、最短路、Dijkstra、路径、分配部分边权 首先去点2种不可能的情况: 1、不记录w == 0 的边的情况下,求出dis[e], 如果 dis[e] < L, 则 w == 0 的边无论怎样分配权值,src 到 e 的最短路 都是这个 dis[e], ans = “NO"; 2、把w == 0 的边赋值为1,然后把这些 w == 0的边记录下来,跑一边 Dijkstra,如果 dis[e] > L, 则 由于 w > 0 即 w >= 1, 则无论怎样dis[e] 都大于 L, ans = ”NO“原创 2016-09-23 19:07:27 · 1639 阅读 · 0 评论 -
Codeforces Round #377 (Div. 2) D. Exams 二分+贪心 or 纯贪心水过
二分+贪心 or 纯贪心水过 /*!!!!!! 1、纯贪心水过,事实上并不对 比赛的时候是纯贪心水过了,后来经过同学和热心读者们的提醒,发现纯贪心是水过去的,事实上并不对,抱歉 ......2、二分+贪心 二分右端点,然后check [0, x) 能不能满足条件,然后可以则 r = x, 否则l = x; 关于check()函数,从右端点往左扫一遍,只留下最靠右的相同d[j]值,然后从左往右贪/*贪心的策略就是"1、纯贪心水过的策略"*/ 最后的r就是答案了, 当 r == l 是 可能是没有答案也可能答案原创 2016-10-18 02:26:21 · 1323 阅读 · 8 评论 -
Codeforces Round #376 (Div. 2) F. Video Cards 数论+数据结构+前缀和
数论+数据结构+前缀和 就是以前用树状数组的感觉,比如有一个数x,就在以x为下标的地方插入一个 1,如果删除这个就在下标为x的地方插入一个-1, 这样要查询小于等于k的数的个数只要get(k)就好。 这里不需要维护,所以只要用一个前缀和数组,就可以直接预处理出来。 即对于每个a[i]就在 sum[a[i]]++; 读入完以后预处理出前缀和,for i = 1 ~ maxa, sum[i] += sum[i - 1]; 然后扫一遍i = 1 ~ maxa,对于每个i在a[maxn]数组中出现过的i,(即 s原创 2016-10-22 12:56:44 · 1395 阅读 · 0 评论 -
Codeforces Round #364 (Div. 2) D. As Fast As Possible __ binary search、方程 或解方程 直接解出答案
binary search、方程 1、binary search、方程 每个pupil 坐车的时间相同、走路的时间相同、总时间相同。 所以 l = 0, r = INF; 对于 每个答案 x,验证总时间 cnt <= x,即车跑的总时间要小于等于 总的总时间 t1 + t2 == x // t1 为每个pupil 走路的总时间, t2 为每个pupil坐车的总时间,每个pupil 都必须且只做一次车 v1 * t1 + v2 * t2 == l(路程) //求出 t2 就像图中所原创 2016-09-25 22:56:17 · 1259 阅读 · 0 评论 -
Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D. Dense Subsequence ST表+贪心
ST表+贪心 ST表,用O(nlogn)的预处理,然后O(1)查询,找出ans中出现的最大的字母, 然后把比它小的字母都从小到大push到ans里, 然后贪心的去那个需要的最大字母的个数, 每次if(maxv == query_min(i, i + m - 1)) 则在这个 [ i, i + m -1 ]区间内找出最右端的一个maxv + 'a' 字母,//如果优先选左边的,则右边的还会取到,所以取区间最右边的maxv+'a' 就好。 复杂度 O(nlogn)原创 2016-10-14 01:32:50 · 856 阅读 · 0 评论 -
Codeforces Round #363 (Div. 2) D. Fix a Tree __ dfs+剪枝+标记数组
dfs+剪枝+标记数组 找到第一个环把其中的一个点作为 root,然后每个环切去一条边。 找root的时候优先找自环的环,如果有自环的环,则 剩余的环每个环去掉一条边把环连到root上 环的个数 - 1 个操作; 如果没有自环的环,则有 环的个数 个操作。 具体操作 用dfs+标记数组实现,且需要剪枝不然可能有大量重复或者部分重复的dfs 用 bool flag[maxn]表示本次dfs访问过的点,当出现 flag[fatehr[v]] == true 时有环,且flag数组要在dfs回溯的时候重置好,方便原创 2016-09-29 00:00:40 · 1107 阅读 · 0 评论 -
Codeforces Round #375 (Div. 2) D. Lakes in Berland __ dfs+贪心+小根堆
dfs+贪心+小根堆 枚举所有未被标记过的 '.' 点, 先跑一遍dfs,如果是湖(没有到四周边界),则再跑一边来找出这个湖的大小,并记录在小根堆里 pq.push(ii(cnt, make_pair(i, j))); 然后对于pq里最小的前 pq.size() - k 个湖,跑一遍dfs把湖填上。//初始坐标为 (pq.top().second.first, pq.top().second.second) 然后MLE了,其实应该TLE吧,嘿嘿 dfs的时候没有处理本次dfs时访问过的点,所以可能跳不出递归原创 2016-10-16 11:45:17 · 845 阅读 · 0 评论 -
Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets __ dfs+优先队列+贪心
dfs+优先队列+贪心 向把数读入到priority_queue, 同时用 map<int, bool> mp来标记这些数字,出现过。 然后每次贪心的取最大的值,u = pq.top(), mp[u] = false; 然后dfs的向下推可行的一步,比如 13 到 6 如果可以就标记并返回,否者继续向下找。 如果最大值已经不能向下推了,则pq里维护着的元素就是答案了。 此外,这个方法对于 n == 1时要特殊处理, 不然n == 1的时候 一直mp[1] = false,然后dfs(1),这样每次flag都原创 2016-10-03 22:11:22 · 817 阅读 · 0 评论 -
Canada Cup 2016 D. Contest Balloons 小根堆+贪心
题意是每个人有ti个气球,和一个权值wi,然后会根据权值进行降序排序,Limak也有自己的初始气球和一个权值,然后Limak可以把自己的气球给别人,然后别人会因为 ti' > wi 而浮起来,从而失去排名资格,求Limak可以得到的最好的名次(所有气球比a大,且没有被浮起来的人,排在a的前面) 小根堆+贪心 a, b分别表示 Limak 的气球数和权值 然后把出Limak外的所以同志,按照气球数进行排序,得到一个 p v[maxn]。 然后把所有比a大的元素 把 v[i].w - v[i].t即差值丢到小根原创 2016-11-09 22:40:41 · 860 阅读 · 0 评论 -
Codeforces Round #378 (Div. 2) D. Kostya the Sculptor __ data structures、map<ii, priority_queue<ii>>
题意:可以把2个长方体合并成1个(只能把尺寸相同的面合并),或者只选一个,然后搞出一个球,求选1个或者2个合并成1个,从而球的体积最大 data structures、map<ii, priority_queue<ii> > mp; 把长方体的分成地面和高来储存, 如果长宽高3条边都不相等,则每个面存一次,mp[ii(x, y)].push(ii(z, i)); mp[ii(y, z)].push(ii(x, i)); mp[ii(x, z)].push(ii(y, i)); 并且确保mp.first原创 2016-11-14 00:36:35 · 883 阅读 · 0 评论 -
Technocup 2017 - Elimination Round 1 (Rated for Div. 2) D. T-shirts Distribution 贪心、flows
题意:给出 S,M, L, XL, XXL, XXXL 每种衣服的个数,然后给出每个人的选择,可能只有一种,可能2种中的任一种即可(且只能是大小相邻的两种,且这2种输入的时候是升序排列),求给出的那些衣服能否合理的分配给这些人,如果可以给出具体分配方案。 贪心、flows 首先把只有一种情况的直接处理掉, 然后对有2种选择的进行贪心 从S开始从左向右贪,因为单一选择的已经处理掉,比如那剩下的sz["S"]只能用来处理S,M的情况了,所以优先用sz["S"](左边的)来处理S,M,依次类推优先使用左边的。 在原创 2016-11-20 14:57:23 · 1007 阅读 · 0 评论 -
Codeforces Round #380 (Div. 2) D. Sea Battle 贪心+构造
题意:给定了一些区间,选一些区间里的点,要求至少有一个点在其中可能存在的一条线段上。 贪心+构造 首先处理出那些能够放下长为b的线段的区间,并用sum记录好,这些区间最多可以放多少个长为b的线段。 然后由于已知有a个线段分布在这些区间里,所以 可以选 res = sum - a + 1个点,来命中至少一个线段。 que.front().first += b 就是选入的第一个点,然后每次如果还放得下一个线段则在间隔为b的下一个点选入 故选这res个点即可至少命中一条线段。 复杂度 O(n)原创 2016-11-20 21:45:47 · 837 阅读 · 0 评论 -
Codeforces Round #381 (Div. 2) D. Alyona and a tree dfs+二分+线段树延迟操作、树形化线性
题意:一颗树,以有向图的方式读入,每个节点都有一个权值,每条边也有一条权值,当u在v的子树中,且u到v的边权和 <= u的点权时称v可以控制u。求出每个点可以控制 的结点的个数。 dfs+二分+线段树延迟操作、树形化线性 线段树延迟操作区间修改单点查询 O(nlogn) 前缀和sum[ptr]维护的是u到根的路径上的边权和 O(n) 用 树形转化为线性的思想 做,dfs到u的子节点v时,用二分的方法找到最靠近根的节点lr, 然后用把[lr, ptr-1]加1。 当当前结点u,开始回溯的时候,此时单点查询,线原创 2016-11-27 17:26:36 · 845 阅读 · 0 评论 -
Codeforces Round #460 (Div. 2) D. Substring BFS、拓扑排序、dp
题意:给出一个可能有环可能不连通的图,找出一个路径其上出现最多的字母出现的次数最大,求这个最大值。 BFS、拓扑排序、dp 这题与以前一个求最长路径的题差不多,这里定义状态dp[i][j]表示从某点开始跑到节点i时路径上出现字母j+'a'的最大次数。 只需要按照拓扑序跑一遍dp即可, ch[v] != j, dp[v][j] = max(dp[v][j], dp[u][j]); ch[v] != j, dp[v][j] = max(dp[v][j], dp[u][j] + 1); 最后如果度数不为0的点则有原创 2018-02-01 12:09:48 · 479 阅读 · 0 评论