技巧☺☺
文章平均质量分 90
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 树状数组求逆序对、离散化
这样排序相当于把右边v上的交点也移到uv内部去了;所以已经处理成交点只在uv内部了然后for i = 1 ~ Nadd(seg[i-1].order, 1);ans += i - get(seg[i-1].order);扫完就可以输出了☺☺另外这里附上一个比较好的讲树状数组求逆序对原理的博客原创 2016-05-01 00:02:26 · 1503 阅读 · 0 评论 -
HackerRank - pairs-again Satisfactory Pairs 数论、方程、优化、标记方法、预处理
题意:给出一个n,找出(a, b) a<b的个数,且 ax + by == n。数论、方程、优化、标记方法、预处理终于用自己的方法优化到过了 (┬_┬),感人。最初的想法是O(nlin(n)) ~ O(nln(n)sqrt(n))的,然后超时了,所以把那个sqrt(n)预处理了,变成远小于sqrt(n)了,但还是超时,所以后来发现,a <= n / 2,这个时候只超出了标准时限一点点了,⊙﹏⊙‖∣然后才发现如果用 int f[maxn] 代替 bool f[maxn],就不用对每个i进行mem原创 2017-01-17 20:23:50 · 977 阅读 · 0 评论 -
Gym - 101102C C. Bored Judge 线段树+贪心+反向推
题意:给出一系列分数变化情况,x p 表示队伍x获得了p分,求出最终winner在ans事件之后就一直是第一名,求出ans,(如果winner一直是winner,则ans = 1)。线段树+贪心+反向推先计算出每个队伍最终的分数,求出winner的最终分数和队伍编号,然后把每个队伍的分数输入到线段树,用线段数来维护1~n的最大值,存储在team[1]里,然后反向的遍历事件, Modify(ord[i], -p[i]);如果if(team[1] == maxi){ans = i - 1;}一旦不满足就原创 2017-01-14 21:28:21 · 1124 阅读 · 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 #364 (Div. 2) C. They Are Everywhere __ two pointers or binary search
two pointers or binary search1、binary searchint l = 0, r = n;while(l + 1 < r){ x = (l + r) >> 1; if(check(x)) r = x; //O(n)的检查 sz = x 时是否满足条件, 如果满足则 r = x, 然后继续检查x更小的情况, 最后 ans == x; else l = x;}复杂度 O(nlogn)2、two pointers用 sz 维护区间内的种类数 //原创 2016-09-25 22:21:47 · 1204 阅读 · 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 #372 (Div. 2) B. Complete the Word __ two pointers、队列(queue)
two pointers、队列(queue)用 queue<char> que;维护一个除了 '?'以外所有字符最多在该队列中出现一次的队列, 当que里的合法元素达到 26 个是就是 nice substring 了。在这过程中 用 map<char, int> ch 维护队列中每个字符出现的次数, 且用 ind 维护队列的首元素的在s中的下标。得到要求的que以后, 扫一遍map, 把没有出现过的大写字母丢到 队列 ans里去, 然后 输出 s[ 0 ~ ind-1], 输出 nice subs原创 2016-09-23 19:06:46 · 1370 阅读 · 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 评论 -
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 · 1674 阅读 · 0 评论 -
Moscow Subregional 2010 Problem K. KMC Attacks 交互题、队列优化、枚举
交互题 队列优化用 lCur 和 uCur记录 机器的运行路径, 然后枚举起点就好其中WA5, 后来发现要记录最大的和最小的 lCur, uCur, 以为可能中间过程越界然后就开始TLE了尴尬后来才想到队列优化因为本来是一个vis[][]布尔数组来记录有没有枚举过那个起点, 但每次要forfor枚举然后用vis[][]判断, 这样可能是 4*1e4步内的化, 可能要接近 4*1e4 * (200 * 200) == 4* 1e8了显然还是超时的 所以队列优化可以 O(n^4)的复杂度降低到 O(原创 2016-08-10 00:16:20 · 1134 阅读 · 2 评论 -
Codeforces Round #366 (Div. 2) C. Thor 数据结构、队列优化
数据结构、队列优化queue<pair<int, int> > que; //用来存放应该 操作3 后 剩余的通知queue<int> v[maxn]; //v[i]用来存放,剩余的未读的应用 i 的通知 所有通知 在que里入队一次出队一次, 在v[maxn]里入队一次出队一次, 总复杂度 2*n, 所以复杂度 O(n)此外 这里输出的东西 比较多, 用 cout << cnt << endl; 的运行时间 大约 是 cout <<原创 2016-09-12 13:35:31 · 1249 阅读 · 0 评论 -
Gym 100541 B. Sum 分块的技巧、思维题、Interesting
写几个n试试看, 会有连续的数字出现, 比如n == 5, 5 2 1 1 1n == 8, 8 4 2 2 1 1 1 1相当于把这些数据分成好多块, 最多sqrt(n)份,区别于数据结构分块的另外一种分块吧^_^len 表示相同数字的个数, 然后i表示这些相同val (LL)的第一个数的下标, ans + len*val //然后注意每一步取模i += len; //直接跳到下一种val的第一个数其中 len = n / val - i + 1原创 2016-07-26 01:37:07 · 1369 阅读 · 0 评论 -
Codeforces Round #401 (Div. 2) C. Alyona and Spreadsheet last数组、预处理、优化
题意:给出n*m个树,询问第i行到第j行是否至少有一列是非递减序列。预处理、last数组、优化用 vector<int> f[maxn],其中f[i]表示第i列的数据,然后O(n*m)的标出非递减状态结束时的点。然后用lastj[j]表示上一次处理时访问到的非递减状态结束时的点的下一个点。所以对于每个0 < i < n 预处理出ans[i]表示i为起点的存在的最长的非递减序列的长度,对于每个1 <= j <= m,扫到本次非递减状态结束的点然后刷新last[j]。克制当 last[j] > i原创 2017-02-24 23:53:16 · 605 阅读 · 0 评论