
ACM专题
ACM刷题经验
邺欢
什么时候才可以不靠参悟别人的代码维生,(((φ(◎ロ◎;)φ))),鄙人也想写属于直接的代码
展开
-
小Y与多米诺骨牌------线段树+dp
#include <bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;const int maxn=100005;int T,n,x[maxn],y[maxn],l[maxn],r[maxn],s[maxn<<2],f[maxn],g[maxn];void build(int x,int l,in...原创 2019-09-16 22:50:02 · 122 阅读 · 0 评论 -
Light bulbs-------思维
一开始第一反应是线段树,后来发现内存不够,就进行离散化,后来a了,但是!!!发现有巨好用的方法,晕了,(((φ(◎ロ◎;)φ))),被秀的体无完肤。这是楼主的:#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector&g...原创 2019-09-16 10:09:23 · 169 阅读 · 0 评论 -
牛客OJ.[FJOI2015]带子串包含约束LCS问题------ac自动机+dfs+dp
#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <iostream>#include <map>using namespace std;const int maxn = 1600;const int ...原创 2019-09-12 07:32:38 · 398 阅读 · 0 评论 -
牛客OJ.位运算------线段树
#include <bits/stdc++.h>using namespace std;const int maxn = 2e5+3;int O[maxn<<2][20],Bit[20],laz[maxn<<2],box,op,x,y,v;void Rotate(int o,int v){ for(int i=0;i<20;i++)Bit[...原创 2019-09-09 21:30:18 · 156 阅读 · 0 评论 -
牛客OJ.阿狸的打字机------ac自动机+链式向前星+离线优化
原题链接大佬代码本来只想练一练ac自动机的简单题,就拿此3星题练手,一开始所有代码都超时(在我的预料之中,因为还想不到什么好方法,就先试一试普通方法了),之后去看大佬的操作,恍然大悟,此题的要素过多,不说了,还是博主太菜了,直接上代码。...原创 2019-09-09 18:52:04 · 184 阅读 · 0 评论 -
牛客OJ.string------ac自动机
模板例题#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int MX=4e5+9;queue<int> ans;int n,m,cnt;...原创 2019-09-04 20:04:12 · 173 阅读 · 0 评论 -
K. Army------二分匹配
原题链接题意:有n个士兵,m个岛,w种武器。其中一个士兵必须拿一种武器才可以守住一座岛。每个士兵都有一些自己愿意守的岛。每个士兵都有一些自己愿意用的武器种类。每个岛都有一些可以在该岛上使用的武器。其中武器数量不限,问最多可以守多少座岛。题解:因为武器数量不限,所以利用武器与士兵,武器和岛的关系,创造一个新的士兵和岛的关系。再将士兵与岛的关系和一开始给的士兵与岛的关系联立,可以得到...原创 2019-08-22 17:38:15 · 121 阅读 · 0 评论 -
E. Painting the Fence------线段树+双端队列
一开始写这一题,总觉得自己的代码会超时,后来看了下大佬的代码,果然,两秒的时间限制不是白给的,如果时间给的比较大的话,那么就不能局限于思维,使用一些平常觉得必超时的方法再进行部分优化也是可以的。大佬代码代码也就是线段树和双端队列的使用,挺易懂的。(这题让我对时间限制有了新的理解)#include<cstdio>#include<iostream>#include&...原创 2019-08-22 10:53:44 · 140 阅读 · 0 评论 -
K. Medians and Partition------思维
原题这题的重点是使用思维方式。例如,任意一个数组,若它的中位数大于等于m,那么这一串数字中,比m大的数字一定比m小的数字多,多多少不清楚,至少多一,那么,就让它多一,那么,这题就会很简单了。注意,这里必须是每个子序列的中位数均大于等于m。#include<cstdio>#include<algorithm>#include<cstring>using ...原创 2019-08-21 20:04:55 · 183 阅读 · 0 评论 -
CodeForces 787D------线段树建图
看到了大佬的做法,才发现竟然可以这样写,只是看起来挺复杂的,实际上就是个线段树建图,再用Dijkstra的过程大佬链接#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<queue&...原创 2019-08-20 22:37:48 · 118 阅读 · 0 评论 -
HDU5361------线段树+图论
当时是在疯狂刷线段树类的题目,刷到这一题时,一点思路都没有,后来看到了大佬的博客,恍然大悟。大佬链接原题链接#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<queue>...原创 2019-08-20 20:58:51 · 146 阅读 · 0 评论 -
HDU3804------树链剖分+线段树
想把这一道典型题给发出来,但是无奈一直没有找到题,直到最近才找到的。原题链接问题描述树上有一些有n个节点的查询。每个查询都被描述为两个整数(X,Y)。对于每个查询,您应该找到集合E中边的最大权重,它满足以下两个条件。1)边缘必须在从节点X到节点1的路径上.2)边缘的权重应该小于或等于Y.现在给你树和查询。你能找到每个查询的答案吗?输入输入的第一行是整数T,表示测试用例的数量。对于每...原创 2019-08-20 20:29:37 · 155 阅读 · 0 评论 -
K小生成树(kmst)------并查集
#include <bits/stdc++.h> using namespace std; const int MAX_N = 110; int n, m, q;int sols[int(1e7 + 200)], tot, fa[MAX_N];bool vis[MAX_N]; struct edge{ int from, to, weight;} edg...原创 2019-10-22 20:22:10 · 2141 阅读 · 0 评论 -
食物链------并查集
一个基础的并查集,因为有类似于循环的存在,所以用一个数组,3个区间去存(很巧妙),使得第一个区间吃第二个区间,第二个区间吃第三个区间,第三个区间吃第一个区间。要注意,如果要对并查集赋值,一定要3个区间的关系均赋值到位。#include<bits/stdc++.h>using namespace std;const int MX=1e5+9;int t[MX*3],n,k,or...原创 2019-10-21 21:16:13 · 107 阅读 · 0 评论 -
栗酱的文明------线段树+Havel-Hakimi定理
#include<cstdio>#include<iostream>#include<vector>#include<cstring>#include<string>#include<queue>#include<algorithm>using namespace std;#define NUM 1...原创 2019-10-21 18:47:10 · 270 阅读 · 0 评论 -
Transformation------线段树标记次序
原题这是当时暑假刷的题,最近终于找到了,感觉是个非常不错的例题,其中有大量的标记次序问题要注意。#include<bits/stdc++.h>using namespace std;#define left k*2#define right k*2+1const int N=10007;struct node{ int l,r; int tag1,tag...原创 2019-10-17 20:44:36 · 266 阅读 · 0 评论 -
Squared Permutation------线段树
原题其实只要记住一点,若要改变2个位置(l,r)的数值。那么影响的,是l,是r,是a[pos]=l的pos,是a[pos]=r的pos。一共4个值。所以用一个b数组来存(例如,位置k被换了,那么影响的是a[pos]=k的pos,而b数组来存b[k]=pos),#include<bits/stdc++.h>#define lson k<<1,l,mid#define ...原创 2019-10-17 20:21:46 · 165 阅读 · 0 评论 -
未来城市规划------线段树+树链剖分
原题其实就是利用树链剖分建图,然后在线段树上实现。树链剖分中的每一个树枝都可以在线段数中有对应的。然后,至于算出‘城市u所管辖下的所有城市对’的花费之和,其实就是每一个子城市(v)的贡献=路程wsiz[v](siz[u]-siz[v])(这个很容易证),可以在线段树中用2个数字维护。一个维护wsiz[v],另一个维护wsiz[v]*siz[v],然后就是区间求和,区间改变。#include&l...原创 2019-10-17 15:58:10 · 131 阅读 · 0 评论 -
吾好梦中做题------线段树状压
原题一开始的超时代码:#include<bits/stdc++.h>#define lson k<<1,l,mid#define rson k<<1|1,mid+1,rusing namespace std;const int MX=5e5+9;int T,n,m,pos,order,t[MX<<2],laze[MX<<2]...原创 2019-10-16 19:45:49 · 169 阅读 · 0 评论 -
[ZJOI2008]无序运动MOVEMENT------ac自动机+计算几何
原题大佬源码整个就一ac自动机,不过把建树文本换成了许多的Q点列,把搜索文本换成了P点列,把平常所熟悉的字符串换成了一个一个点,可以用map函数存。易知,任何一个节点,就是它整个边与上一条边的长度的比值,还要此3个点所拼成的角度,这两个关键量可以用结构体c存。为了确保精度,边长比例可以用两边平方的比例。而角度就比较麻烦了,当时就卡在这里(晕),后来在网上查到了一种很方便的方法,就是两向量边的...原创 2019-10-12 15:24:56 · 271 阅读 · 0 评论 -
[HNOI2014]抄卡组------hash
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 10550003#define ULL unsigned long long #define p 2000001001using na...原创 2019-10-08 23:40:53 · 239 阅读 · 0 评论 -
白兔的字符串------字符串hash
原题一道典型的字符串hash,至于hash,这里讲的非常好。一开始用map函数一直超时,后来改用unordered_map就过了,至于这2个map的区别,这里讲的挺清楚的。之后去查了一下其它方法,发现还有一种方法是手写map函数(强),指明@大佬unordered_map是跑了600ms,重写跑了100ms(强)unordered_map:#include<unordered_m...原创 2019-10-05 11:28:03 · 232 阅读 · 0 评论 -
wyh的天鹅------函数运用
原题一开始以为要主席树做((((φ(◎ロ◎;)φ)))晕),后来发现,原来可以这么简单,就是几个函数稍微装扮一下就行了,不过这几个函数并不是经常用,写下来留作以后参考用。#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<vecto...原创 2019-10-04 23:49:20 · 267 阅读 · 0 评论 -
情人节的电灯泡------二维线段树
原题题目难度并不大,但是太久没有写二维生疏了,就是个模板题,当然,这里如果使用树状数组的话会更加简便,但是毕竟线段树的功能较为强大,为了防止以后遇见了什么骚操作的二维线段树。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define lson ...原创 2019-10-04 13:07:11 · 218 阅读 · 0 评论 -
合并字符串的价值------线段树+暴力
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;char s[N], t[N];int n, m, mx[N << 2], tag[N << 2];int tot[4], num[4], nw[4], org[N], pos...原创 2019-10-03 19:40:31 · 530 阅读 · 1 评论 -
连续区间的最大公约数------线段树+区间合并
原题链接几天都在苦思冥想找个gcd区间个数到底应该是怎么求的,并且和线段树怎么联系到一起,最后还是参悟了大佬的代码才恍然大悟。每个节点要保存的东西有一点多。1:这个节点的范围长度。len2:这个节点的最大公约数。x3:这个节点范围区间里,各个区间的最大公约数不是x的个数。cnt4:这个节点的范围内,从最左边数,到最右边,每一个范围的最大公约数,以及个数。vector<pair&l...原创 2019-10-01 00:13:00 · 541 阅读 · 1 评论 -
Yazid 的新生舞会------线段树+思维
#include <cstdio>#include <cstring>#include <iostream>#include <vector>#define lson x<<1#define rson x<<1|1using namespace std;const int maxn=500010;typedef...原创 2019-09-28 12:17:21 · 293 阅读 · 0 评论 -
VVQ 与线段------线段树+二分
原题链接这题主要是要去判断2个线段会不会又交集。首先将线段按r从小到大排列,然后一个一个放进线段树里面方便以后查找有交集的范围内的被减数的最小值。然后求交集,若LR与lr有交集,且R是右边的那个线段。就有L<=r<=R,这里可以使用二分函数lower_bound求,主要快一点。然后,交集又分2种情况。第一种是lr与LR相交于左边,答案就是(R-L)-(r-l)第二种是lr在L...原创 2019-09-24 23:21:07 · 434 阅读 · 0 评论 -
[JSOI2007]文本生成器------ac自动机+dfs/dp
原题链接这题比较简单,主要是想注意一下数组开大后的memset函数耗时,这里,如果数组开大了,那么时间就比较大了。博主一开始dfs数组开大了,180多毫秒,后来发现6000多就够了,30毫秒,,,(吓我)dfs:#include<cstdio>#include<cstring>#include<iostream>#include<algori...原创 2019-09-23 22:49:59 · 95 阅读 · 0 评论 -
方块 III-------线段树+思维
#include <bits/stdc++.h>using namespace std; // ____ _ _ __ __#define ll long long // / ___| | |_| | / /const ll INF = 0x3f3f3f3f; // | | | _ | V /const...原创 2019-09-21 21:08:10 · 120 阅读 · 0 评论 -
[SDOI2014]数数------ac自动机+dfs
#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <cctype>#include <iostream>using namespace std;typedef long long ll;const in...原创 2019-09-23 12:20:06 · 168 阅读 · 0 评论 -
[HEOI2012]旅行问题------ac自动机+lca倍增
#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <cctype>#include <iostream>#include <map>using namespace std;typedef l...原创 2019-09-18 20:11:27 · 135 阅读 · 0 评论 -
P3391 【模板】文艺平衡树(Splay)------文艺平衡树(FHQ)
原题#include<bits/stdc++.h>using namespace std;const int MX=1e5+9;int son[MX][2],laze[MX],siz[MX],val[MX],ran[MX];int Root=0,tot=0;void pushdown(int k){ if( laze[k] ){ swap(son[...原创 2019-11-15 00:04:43 · 141 阅读 · 0 评论 -
P3644 [APIO2015]八邻旁之桥------FHQ-treap
如果在同一侧就直接ans+=abs(t-s),否则就ans++。#include<bits/stdc++.h>#define ll long longusing namespace std;const int MX=2e5+9;struct node{ ll s,e,k; bool operator<(const node &a)const {...原创 2019-11-14 11:00:28 · 141 阅读 · 0 评论 -
P3285 [SCOI2014]方伯伯的OJ------平衡树区间储存
#include<bits/stdc++.h>using namespace std;const int N=100500000;int n,m,opt,x,y;int ans,L,R,root;int sum[10000000],cnt;int son[10000000][2];struct node{ int tot; int head[100000...原创 2019-11-05 20:56:55 · 132 阅读 · 0 评论 -
P1110 [ZJOI2007]报表统计------multiset
首先可以用multiset写,但是会卡常,因为MIN_SORT_GAP问的答案最低为0,所以可以到0之后就不需要管它了,这样可以加快速度300ms左右。原创 2019-11-03 15:26:16 · 190 阅读 · 0 评论 -
Aeroplane chess------概率dp
原题一道概率dp题,这里尤为要注意的是,必须从后往前dp。1因为:i到节点i+1i+6每个概率都是1/6,但是节点i-6i-1到i点每个概率却不是1/6。2因为:并且比如从a到b有近道,如果从前往后,那么到b的概率和a就一样了,明显这是不可能的。但是,从b到a的话,那一定是dp[a]=dp[b],因为有近道超近道。因为是从后往前,所以有近道超近道。#include<bits/stdc...原创 2019-11-02 11:05:19 · 122 阅读 · 0 评论 -
String painter------区间dp
原题说实话,dp类型的并不是很常做,这个题解讲的挺不错的------传送门我们可以先求出一段无变成s2所需要的最小次数dp[i][j](将无变成s2的第i到第j个所需要的最小次数),这里的方法是从前向后进行枚举,假如遇到了一样的字符,比如ABCDAE,其中1和5相同,那么dp[1][6]=min(dp[1][6],dp[2][4]+dp[5][6])这样递归。递归完无的dp,就可以进一步递...原创 2019-11-01 23:50:01 · 139 阅读 · 0 评论 -
Cow Exhibition------变种01背包
原题题目大意:一共有n头牛,每头牛都有个值s[i],f[i]。请从中取一部分牛出来,使得这部分牛的s之和S不为负数,f之和F不为负数,且此时的S+F最大,请输出S+F的值。解题思路:是后来看博客补的,这里使用的是dp的解法,不过,这里dp[i],i储存的是s[i]当前的总和。所以,这样dp表达式很容易就可以出来dp[i]=max(dp[i],dp[i-s[j]]+f[j])但是重点的不是这...原创 2019-11-01 21:26:45 · 135 阅读 · 0 评论 -
P3369 【模板】普通平衡树------平衡树Treap || FHQ_treap
原题链接#include<bits/stdc++.h>#define il inline#define ll long long#define RE register#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a...原创 2019-10-31 17:28:25 · 154 阅读 · 0 评论