指针式线段树 bzoj 1798 学习了指针,重写bzoj 1798数组本质是指针,所以可以buid(tr,1,n)一个Tree *tr指针,tr[1]指的是这个指针指向的下一个位置,不是开数组的那个tr,所以都改成了root#include#include#include#include#define ll long long#define inf 1e9#define md#define N 100
c++ primer 学习笔记(一) 2.1 基本内置类型2.1.1算数类型short 16位 long 32位 long long 64位(c++11新定义)wchar_t 用于确保可以存放机器最大扩展字符集中任意一个字符char16_t char32_t 为Unicode服务除bool型和扩展的字符型以外,其他整形可以划分为带符号的和无符号的字符型被分为 char/signed char/unsigned
bzoj 2989&&4170: 数列 首先所谓的“可持久化” 就是加入一个新的元素把看成平面上的一个点,graze函数就是曼哈顿距离求点集中曼哈顿距离≤k的,自然要转换为切比雪夫距离的一个矩阵内点的个数然后CDQ分治或者强上数据结构注意矩阵y坐标取min要和1算,因为查询的时候是L-1,而树状数组不允许查询负数位置#include#include#include#include #define ll lon
4556: [Tjoi2016&Heoi2016]字符串 字符串题不会做先想能不能把字符串反过来把字符串反序,建立后缀自动机,利用线段树合并算出每个位置的right集二分答案,用树上倍增找到对应的节点,看是否有[a+mid-1,b]中的数在right集中#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-10#define m
bzoj 3825: [Usaco2014 Dec]Marathon 查询的答案就是完整走过所有点的距离-少走一个点可以减少的距离的最大值。所以线段树维护区间和,还有如果不走每个点,可以少走多少路然后答案就是sum[l+1,r]-max[l+1,r-1]没写%lld wa了一发#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-1
bzoj 4282: 慎二的随机数列 结论:所有的未知数都可以出现在最优解中。所以,把每个确定的数减去它前面未知数的个数,计算lis就行膜拜了一下popoqqq大爷优美的lis#include#include#include#include #define ll long long#define inf 1000000007#define eps 1e-10#define mdusing namespace std
bzoj 4591: [Shoi2015]超能粒子炮·改 S(n,k)=S(n/p,k/p-1)*S(n%p,p-1)+C(n/p,k/p)*S(n%p,k%p)意思是根据lucas定理对于i/p忘记处理sum[0][?]了#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 250
bzoj 4436: [Cerc2015]Kernel Knights T集表示已经确定不在S集内的点。对于一个点,如果不存在非T集的点挑战它,那么它一定在S集中。如果存在一个挑战它的点在S集中,那么它一定在T集中。用类似拓扑排序的方法,首先找出所有不被挑战的点,归入S,把这个点挑战的点y归入T集,然后y挑战的点的度数-1.最后剩下一些点在环中,满足每个点都被别人挑战,也挑战别人,因为是二分图,所以保证是偶环,所以把#include
bzoj 4530: [Bjoi2014]大融合 先说一下我的做法:没有强制在线,先建出来这棵树,然后发现x到它父亲的边的答案是 (目前连通块大小-x子树的大小)*(x子树的大小),这个子树大小也是指目前连通块内的子树大小,子树大小可以用线段树维护dfs序,进行线段树合并得到。子树size也可以用树链剖分做。#include#include#include#include #define ll long long#define inf
bzoj 4103: [Thu Summer Camp 2015]异或运算 水题,查询由ai^bj组成的矩形的子矩形内的k大值,行数和询问数都很少,所以可以枚举行数,跑可持久化字典树。注意不能 int l=0,r=2147483674,mid=(l+r)>>1,这个会爆int,开unsigned int 就行。还有,写可持久化主席树又忘了ch[i][0]=ch[pre][0], ch[i][1]=ch[pre][1]#include#include#i
bzoj 4104: [Thu Summer Camp 2015]解密运算 暴力做法: 已知长度为l的所有子串,可以推出长度为l+1的所有子串,比如样例已知长度为1的子串是?AAAABC,而以这些字符开头的字符串的结尾分别是AAAC?AB,而这些字符也是写在对应字符前面的字符,所以得到了子串{A?,AA,AA,CA,?A,AB,BC},然后再用相似的办法推出剩下的子串,但这样太慢了。我们只需要记录那个以?开头的字符串,每次这个字符串前面会加上一个新的字符,然后得知了这
bzoj 4592: [Shoi2015]脑洞治疗仪 线段树维护最长连续段的长度,然后暴力修改,暴力查询,这个复杂度应该是nlogn的。然而我调了好久。。。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 200010using namespace std;struct Tr { i
bzoj 4590: [Shoi2015]自动刷题机 刷题数是关于n单调递减的函数,所以可以二分答案判断。无解有两种情况,一种是无论n是多少都无法ac这么多题,一种是不存在n恰好ac这么多题,判断一下就好。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 100010using
bzoj 4597: [Shoi2016]随机序列 对于一个表达式序列 ****+??????? 一定有一个表达式序列 ****-??????? 与它相加为0,所以对答案有贡献的是第一个非*之前的序列乘上这个序列出现的次数。对于前i个数组成的序列,出现次数=2*3^(n-i-1),前n个数组成的序列出现次数为1.所以用线段树维护这个式子的值就好了,具体实现看代码#include#include#include#include #defi
bzoj 4571: [Scoi2016]美味 如果没有加法,这就是一道水水的可持久化trie,有了加法,我们就要用可持久化权值线段树,然后按位贪心,查询变成一个区间内是否存在数字。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 4000010using namespace
bzoj 3569: DZY Loves Chinese II 神题一道。将所有边分为树边和非树边,把所有非树边随机一个权值,然后树边的权值是所有覆盖它的非树边的权值的异或和。如果一个边集的存在一个非空子集的异或和为0,那么树是不连通的。原因是:(1)删除了一条树边和所有覆盖它的非树边,那么这些边的异或和为0(2)一个点的出边只有树边,且删除了所有与它相连的树边,因为这些树边的异或和一定存在一对相同的,所以也对。然后就是如何搞出树边的权
bzoj 2708: [Violet 1]木偶 最优策略一定可以把整个序列分成几段,每一段都是像这样子的红线表示不可匹配。所以可以排序后dp[i]表示前i个数最多删掉多少=max(f[j-1]+cal(j,i)) cal(j,i)表示j到i最多删掉多少个。注意是判断红线相连的两个是否能够匹配,而不是第i个和第i+k个能否匹配#include#include#include#include #define ll lon
bzoj 3702: 二叉树 发现子树中如何排列对于兄弟节点的逆序对是没有影响的,所以统计兄弟节点之间交换和不交换的逆序对数,取较小值即可。用线段树合并时直接计算逆序对的方式可以搞到nlogn。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 200010
bzoj 4000: [TJOI2015]棋盘 矩乘,题意坑爹,那个第一行是中间那一行,所以记录一行的状态就可以了。f[S]表示最后一行状态为S的方案数,然后暴力看能否转移。#include#include#include#include #define ll long long#define ui unsigned int #define inf 1e9#define eps 1e-8#define md#define N 70u
bzoj 4569: [Scoi2016]萌萌哒 一种会T的做法:发现并查集加边只会发生n-1次,所以只要一个较小的复杂度完成这n-1次加边即可启发式合并维护并查集,每次暴力修改所有属于小区间的fa值,用vector记录每个连通块内的数,暴力在线段树内修改hash值,复杂度logn,需要进行nlogn次线段树上hash把所有的fa hash起来,然后二分找位置,每次寻找log^2,需要进行On次#include#inclu