自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ProLights的博客

Someday, you can program the lights.

  • 博客(10)
  • 收藏
  • 关注

原创 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 1385

原创 Codeforces Round #376 (Div. 2) C. Socks 并查集+贪心、图论

并查集+贪心、图论 在读入的时候直接把有边相连的点维护到一个集合里,最后对于处理出的森林,可以用map<int, map<int, int> > mp;维护,即mp[i][j]表示以 i 为根的树上颜色 j 出现的次数, 然后对于每颗树,找出树上出现的次数最多的结点颜色相同的颜色, ans += (该树的总结点数) - 出现的次数最多的结点颜色相同的颜色的结点个数 复杂度 O(n)

2016-10-22 12:31:39 1135

原创 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 1307 8

原创 Codeforces Round #377 (Div. 2) C. Sanatorium 分类讨论

分类讨论 LL maxv = max(a, max(b, c)); if(a == b && b == c) ans = 0; else if(a == maxv){ if(max(b, c) != a){ ans = a - 1 - b + a - 1 - c; } else if(a == b){ if(b != c){ ans = a - 1 - c;

2016-10-18 02:15:09 977 2

原创 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 832

原创 Codeforces Round #375 (Div. 2) C. Polycarp at the Radio 贪心+排序

贪心+排序 刚开始的时候理解题意错了,以为最小值尽可能大,最大值尽可能小, 但其实是中间贪心的过程中把最大值的 cnt[m-1].b的乐队变成最小值的乐队 cnt[0].b,直到 cnt[0].cnt 达到 n / m 就是最大的那个最小值了,而bj 的最大值不用再压缩了。 即 val[i].b 表示乐队编号, val[i].cnt 表示该乐队当前表演songs的数量 while(最小值 < int(n / m)){ 如果 大于m的 v[j] 还有则把这个v[j] 变成 当前最小值的乐队 val[0].

2016-10-16 11:32:51 899

原创 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 840

原创 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C. Ray Tracing 模拟+预处理、几何

模拟+预处理、几何 首先每个点只有 2 条 abs(k) == 1的直线, 并且每条线最多经过一次,即每个店做多经过2次, 所以复杂度是O(n)的,模拟是可行的 故先在读入的时候把该点 对应的 2 条 abs(k) == 1的直线 然后分别求出 他们与 矩形边框的2个交点 a(x1, y1),b(x2, y2) cnt[make_pair(a, b)].push_back(x, y); 即x, y 在 线段(a, b) or (b, a)上 然后初始的时候 x0 = 0, y0 = 0; if(n <

2016-10-13 23:39:01 985

原创 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 800

原创 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 双向链表+反向做+优先队列

双向链表+反向做+优先队列 反向做,按着反的顺序把元素一个一个的添加进去,用priority_queue 维护当前最值, 用双向链表维护当前区间的状态,L[i]表示以i为端点的区间的区间左端点,R[i]表示以i为区间端点的右端点 对于每个点 j, 当只R[i + 1] != 0 时, 右边有区间,可以把两个链表合并成一个, R[i] = R[i + 1], L[i] = i; 当只L[i - 1] != 0 时, 左边有区间,可以把两个链表合并成一个

2016-10-03 21:55:21 1022

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除