STL
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
HDU - 6085
题目链接:HDU - 6085考虑每个数字 a % b == k,其实就是 ( a - k ) % b == 0,然后考虑使用bitset通过右移来维护。直接用bitset做位运算与。但是这样错过了一些数的因子,所以我们对于每个因子对因子的倍数来做贡献。我们枚举余数,从大到小维护一个bitset即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define i原创 2021-01-25 22:32:52 · 203 阅读 · 0 评论 -
分组
题目链接:分组先对数组排序。贪心考虑每个组,如果这个人可以放到之前完成的某个组当中,那么一定是放之前人数最少的那个组。并且不会使得后面答案变劣。所以贪心是正确的,然后用set维护每个组即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;i原创 2021-01-23 11:38:54 · 165 阅读 · 0 评论 -
小清新人渣的本愿
题目链接:小清新人渣的本愿首先对于第一种查询:其实就是对于每个值 a 判断是否存在 a-x 。这个显然可以用bitset维护。对于第二种查询:我们可以化简为第一种查询。a + b = x -> a = x - b 。我们维护 -b 的bitset即可,但是不能维护复赛,所以我们加个足够的权值,最后减去。对于第三种查询:暴力找这个数的因子即可。对于每次找到当前区间的bitset,莫队即可。复杂度:令 c 为值域。 m * ( sqrt( c ) + c / 64 )AC代码:#pra原创 2020-11-30 15:29:41 · 268 阅读 · 0 评论 -
Trace
题目链接:Trace因为不存在偏序关系,所以我们分别考虑x,y的贡献即可。因为后面会覆盖前面,所以我们从后往前考虑。假设考虑x:如果x是最小的,那么对于他的y一定是后面当中最大的,所以直接加上贡献即可。否则,要减去前面的比他小的x。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;c原创 2020-11-06 15:19:56 · 135 阅读 · 0 评论 -
HDU - 6695
题目链接:HDU - 6695我们先按照x排序,然后依次枚举最大的x是多少。我们可以发现,x 之前的随意选取都是对 x 的最大值无影响的,然后当前的最优解可以是,后面未选择的最大的 y 和当前 x 的差值,如果 y 小于当前的 x ,那么可以从 x 之前的找一个接近的 y 。这个用multiset维护即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define原创 2020-07-26 22:42:26 · 207 阅读 · 0 评论 -
Dynamic Graph
题目链接:Dynamic Graph很简单的一道题,但是要注意细节。更新的时候暴力更新就好了,然后拓扑上面维护Bitset,但是要注意黑点不能直接跳过,直接不去更新颜色即可,如果直接跳过会导致某些点加不进来。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=31原创 2020-07-24 15:17:34 · 869 阅读 · 0 评论 -
J.I
题目链接:J.I因为题目保证不成环,那么说明肯定是一个二分图。那我们二分图染色之后,答案就是 n1*n2 - m ,所以我们要让二分图两边的点尽量接近,直接dp即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e5+10;int n,m,vis[N],原创 2020-07-23 08:56:29 · 315 阅读 · 0 评论 -
动态连通块
题目链接:动态连通块看到操作3和数据范围不难想到分块和bitset。但是分块不能解决动态连接问题,所以考虑用bitset。每个点维护能到的不同颜色即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=5e4+10;int n,m,f[N],col[N],c原创 2020-07-22 17:21:25 · 297 阅读 · 0 评论 -
Codeforces - Addition on Segments
题目链接:Codeforces - Addition on Segments选任意条最大值为k,其实就是看一个点能到的值。我们把每个线段打在线段树的区间上面,看每个叶子节点能到的值即可。类似于线段树分治。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e4原创 2020-07-19 12:12:52 · 169 阅读 · 0 评论 -
R6PL - Harbinger vs Sciencepal
题目链接:R6PL - Harbinger vs Sciencepal其实就是每次选一个值,然后选一个最接近中位数的和。dp即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;int n,base=100*5000,res,sum; bitset<100*5001> dp原创 2020-07-15 19:01:40 · 149 阅读 · 0 评论 -
坐标
题目链接:坐标把式子化简一下,我们可以发现其实两项之间是无关的。直接哈希记录前一个位置即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=5e5+10;int n,a[5],mi=1e18,mx;struct node{int x,y,z;};bool op原创 2020-07-02 22:09:22 · 140 阅读 · 0 评论 -
Median Sum
题目链接:Median Sum看到中位数,我们就会想到二分,但是子集太多了,二分也不行。我们可以发现,中位数形成的集合,是对称的。设s为所有数的和,如果存在x那么必然存在s-x。所以我们只需要知道某个数字是否存在于某个集合中即可,然后找到大于(s+1)/2的第一个存在的数字。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long long原创 2020-06-27 14:13:24 · 194 阅读 · 0 评论 -
AtCoder - Smart Infants
题目链接:AtCoder - Smart Infants显然用两颗平衡树维护插入删除即可。然后我们可以发现不需要求rank,kth。所以直接用multiset即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e5+10;int n,q,a[N],pos原创 2020-06-15 12:07:04 · 277 阅读 · 0 评论 -
Painting the Fence
题目链接:Painting the Fence显然对于一段区间连续的区间,要么全部被覆盖要么都不被覆盖。所以一段区间只和左右端点有关。所以我们用set维护每个颜色的每一段的点,然后对于处理的一段区间我们暴力修改,之后用并查集让这个区间缩成一个即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespac原创 2020-06-05 22:52:44 · 457 阅读 · 0 评论 -
DP 一般看规律
题目链接:DP 一般看规律显然我们可以发现答案是不会变大的。所以我们可以一直维护当前的最小值。每次做颜色合并的时候,就可以直接利用set启发式合并。然后并且维护答案。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=3e5+10;int n,m,a[N],原创 2020-05-30 09:53:46 · 332 阅读 · 0 评论 -
Music Problem
题目链接:Music Problem因为是3600的倍数,所以数字超过3600一定有解,简单的鸽巢原理。不过还有更简单的做法,直接bitset状压。每次添加一个数字,或上加入x 的答案,然后再将大于3600的集合放回来。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h&...原创 2020-05-06 12:21:23 · 383 阅读 · 0 评论 -
有趣的游戏
题目链接:有趣的游戏感觉比较裸的题了。首先树剖之后,线段树维护区间严格次大值。对于全局次大值,我们可以用multiset先删除找到的值,然后再找次大值,注意是严格次大值,所以lower_bound即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#de...原创 2020-04-21 15:03:01 · 155 阅读 · 0 评论 -
Codeforces - Array Division
题目链接:Codeforces - Array Division似乎都是二分做的,我看到这道题就直接想到了哈希映射。显然,总和为奇数无解,否则我们就知道前缀和后缀的值。我们考虑后面的某个数字,移动到前面来,使得前缀后缀合法。那么对于当前从前往后枚举的值 t ,数字总和为 s,后面只要存在一个 s/2 - t的值,那么就合法。否则在从后往前面扫,因为数字要么前面到后面要么后面到前面,所...原创 2020-02-29 14:58:53 · 331 阅读 · 0 评论 -
[USACO18DEC]Cowpatibility G
题目链接:[USACO18DEC]Cowpatibility G显然可以用容斥做,但是我喜欢暴力,我们可以采用:n*n/32的复杂度来秒掉这道题。我们用bitset来状态压缩,对没一种食物存有哪些人即可。然后居然拿到了rank4.。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/std...原创 2020-02-26 12:33:22 · 365 阅读 · 0 评论 -
HDU - 6301
题目链接:HDU - 6301对于m个区间,按照左端点从小到大排序,然后每次做上一次的左端点到这一次的左端点的垃圾回收,然后从set当中取数出来,从小到大放即可。如果不想做垃圾回收,直接建立1-n的主席树,然后从区间当中找不存在的最小数字即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bit...原创 2020-02-24 16:42:18 · 204 阅读 · 0 评论 -
Codeforces - Palindrome Pairs
题目链接:Codeforces - Palindrome Pairs因为可以随意排列。所以,答案只与奇偶性有关。只有一个字母是奇数,或者没有。进而,我们可以发现“bbb”和“b”其实本质是一样的。所以我们可以对每个字符串状态压缩。然后枚举哪一位是1即可。因为状态很大,所以我们可以对状态离散化,或者直接用map存。AC代码:#pragma GCC optimize("-Ofast"...原创 2020-02-19 14:06:14 · 186 阅读 · 1 评论 -
Codeforces - Delivery Club
题目链接:Codeforces - Delivery Club首先二分最长距离。然后按照任务顺序,加入点到set当中。对于当前点,排序无用的点,也就是距离a[i]大于mid 的点。如果某一时刻set为空则无解,否则有解。为什么只要不为空就有解呢?因为只要不为空证明存在一个位置到当前点的距离小于等于mid,我们提前让另一个人到达即可。AC代码:#pragma GCC optimize...原创 2020-02-12 20:12:57 · 374 阅读 · 0 评论 -
Codeforces - Trips
题目链接:Codeforces - Trips加边不好想,所以我们直接反向删边。每次删除一条边,那么对应两个点的度都减1,每次都把度小于k的删掉,剩下的点就是答案。删点直接标记即可,删边在set里面删除。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#d...原创 2020-02-11 13:52:10 · 200 阅读 · 0 评论 -
HDU - 5036
Problem DescriptionEveryone knows Matt enjoys playing games very much. Now, he is playing such a game. There are N rooms, each with one door. There are some keys(could be none) in each room correspon...原创 2020-01-29 13:51:51 · 272 阅读 · 0 评论 -
BZOJ - 3687
Description小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和。2.子集的异或和的异或和。3.子集的算术和的算术和。4.子集的算术和的异或和。目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把这个问题交给你,未来的集训队队员来实现。回到顶部Input第一行,一个整数n。第二行,n个正整数,表示01,a2….,。回到...原创 2020-01-29 10:49:11 · 259 阅读 · 0 评论 -
bzoj 1098 [POI2007]办公楼biu
1098: [POI2007]办公楼biuTime Limit: 20 Sec Memory Limit: 162 MBSubmit: 2021 Solved: 1026[Submit][Status][Discuss]Description FGD开办了一家电话公司。他雇用了N个职员,给了每个职员一部手机。每个职员的手机里都存储有一些同事的电话号码。由于FGD的公司规模不断扩大...原创 2019-11-28 23:30:18 · 190 阅读 · 0 评论 -
51Nod 1515
给n组操作,每组操作形式为x y p。当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等;否则输出NO,并忽略此次操作。当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 ;否则输出NO,并忽略此次操作。输入输入一个数n表示操作的次数(n<=110^5)接下来n行每行三个数x,y,p(x,y<=110^8,p=0 or 1)...原创 2019-11-17 13:40:31 · 214 阅读 · 0 评论 -
Codeforces - C. Glass Carving
C. Glass Carvingtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputLeonid wants to become a glass carver (the person who creates beautiful artwo...原创 2019-11-11 12:50:14 · 186 阅读 · 0 评论 -
Codeforces - E. Segments Removal
题目链接:E. Segments Removal题意:给你一个长为n的序列,每次对当前序列进行一次操作,就是将当前序列中最长的一段各元素相等的子段删掉,若满足题意的最长子段不止一条,则删最左边的,问你将该序列删完要操作多少次?看到这种删除,合并的操作,我们可以想到并查集或者set来做是很方便的。然后我们就要去想怎么去用set维护。我们开两个set,一个存,块的长度和编号,另一个存块的编号...原创 2019-11-10 17:35:44 · 276 阅读 · 0 评论 -
Codeforces - D. Balanced Playlist
Your favorite music streaming platform has formed a perfectly balanced playlist exclusively for you. The playlist consists of n tracks numbered from 1 to n. The playlist is automatic and cyclic: whene...原创 2019-10-17 10:30:28 · 408 阅读 · 0 评论 -
富豪凯匹配串
题目描述有n个长度为m的文本串,每个串只含有’0’和’1’。接下来有Q次询问,每次给出一个长度为m的字符串,且只含有’0’,‘1’和’’。如10_1_1。下划线可以匹配’0’或’1’。即10_1_1可以匹配101111,101101,100111,100101四种串。每次询问求出n个文本串中有多少个可以与当前询问的串匹配。输入描述:第一行输入n,m接下来n行,每行输入一个长度为m的01串表...原创 2019-10-15 22:55:43 · 177 阅读 · 0 评论 -
第k大的数
在许多题目中都会出现寻找第k大的数的类似问题,最简单的做法就是先排序在找位置就可以找到第k大的数,但是排序的做法显然不能满足我们的要求,排序的时间复杂度是O(nlogn),不够快,我们一般可以用快速排序的思想,用O(n)的时间内就可以找到第k大的数,这里我们只讲解C++ STL的函数nth_element。先看一下STLtemplate<class _RanIt, class _Pr&g...原创 2019-05-01 11:16:21 · 277 阅读 · 0 评论 -
优先队列
优先队列的本质其实就是一个堆,一直维护就行。我们使用C++就可以用STL轻松实现,就不用手写堆了(是不是很方便?(✪ω✪)).priority_queueq; 默认优先级从到大到小priority_queue<int,vector,greater > q; 优先级从小到大当然,我们也可以自定义排序,如下列代码,按照成绩大到小排序,如果成绩相等,就按照名字的字典序,小的排在前面。...原创 2019-03-28 19:51:31 · 281 阅读 · 0 评论