seg

数据结构训练之一

▼魔方 西西 提交于 2019-12-01 01:30:48
https://www.luogu.org/problem/P3224 题目特性: 动态维护,询问 范围第k大 能够想到的是 并查集 , 权值线段树 ,但是它是动态维护啊, 会加边啊 ,怎么办? 权值线段树合并 ,并查集维护,动态开点保证 空间复杂度 ; 清晰明了的代码 code: #include <cctype> #include <cstdio> using namespace std; const int maxn=1e5+5, maxseg=maxn*20;//动态开点线段树空间是NlogN int n, m, q, v[maxn], id[maxn], fa[maxn]; int cnt, root[maxn], lc[maxseg], rc[maxseg], seg[maxseg]; void get(int &x){ int flag=1; char c; for (c=getchar(); !isdigit(c); c=getchar()) if (c=='-') flag=-1; for (x=c-48; c=getchar(), isdigit(c); ) x=(x<<3)+(x<<1)+c-48; x*=flag; } int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); } void add(int

[BZOJ4712]洪水(树链剖分+DP)

て烟熏妆下的殇ゞ 提交于 2019-11-30 12:07:35
题意 给一颗点带权的树,删除一个点需要花费对应的代价,每次询问一颗子树,求最小代价,使得子树的根到不了子树中的任何叶子,支持将单点的权值增加一个正值 思路 设 \(f[i]\) 表示i子树的答案,h[i]表示i的所有儿子的f和,w[i]表示i的权值,不难列出状态转移方程: f[i]=min(w[i],h[i]) 如果i是叶子,就将它的h赋成正无穷,可以避免一些讨论 对于修改操作,由于w只会增加,所以各个数组的值都不会减少 一个显然的情况是,如果一个点的f值已经等于w,那么无论它的h怎么增加,它的f值是不会变的(除非修改它的w) 设修改过程中的某个点的f值变化了delta,我们将该点对祖先的影响分为四种情况(设该点为i,父亲为fa) \(delta=0\) ,那么它的祖先不会变,break(其实和2差不多) \(f[fa]==w[fa]\) ,即修改它的h值对f没有影响,h[fa]+=delta,delta=0,下一步就会break掉 \(w[fa]>h[fa],w[fa]>h[fa]+delta\) ,即加了delta之后,f[fa]也会加delta \(w[fa]>f[fa],w[fa]\leq h[fa]+delta\) ,即加了delta之后,f[fa]就变为w[fa] 用树链剖分维护min(w-h),h,对于修改操作,找到最上面的满足3的点,将这一段路径的h值加delta

win10 1903 vs2019 调用RtlInitUnicodeString时导致的蓝屏

你离开我真会死。 提交于 2019-11-30 00:03:23
问题描述(蓝屏条件): 在CreateDevice前添加#pragma code_seg("INIT"), 以RtlInitUnicodeString(&devName, L"\\Device\\MyDDKDevice")形式初始化devName, 将其保存在设备扩展里,给Unload调用,一旦访问devName就会导致蓝屏, 蓝屏代码Bug Check 0x50: PAGE_FAULT_IN_NONPAGED_AREA 以RtlInitUnicodeString(&devName, g_wsDevName)形式初始化devName,则不会蓝屏 在CreateDevice前添加#pragma code_seg("PAGE")或#pragma code_seg()或不添加该行代码 RtlInitUnicodeString第二个参数形式无要求,都正常 注:这是在win10 1903 vs2019下测试的,该测试代码来自《Windows驱动开发技术详解》, 以前win10 1803 vs2017的时候也测试过,但不会导致蓝屏。 PCWSTR g_wsDevName = L"\\Device\\MyDDKDevice"; PCWSTR g_wsDevSymbolicName = L"\\??\\HelloDDK"; //#pragma code_seg("INIT") //1. WRONG

greenplum gpcheckperf 命令(GP集群压力测试)

Deadly 提交于 2019-11-29 18:58:17
目录 概述 1、greenplum gpcheckperf 命令参数说明 2、gpcheckperf 参数详解 3 gpcheckperf 测试脚本 4、gpcheckperf 测试结果 5、查看产生的文件 6、测试结果分析 概述 1、在以下测试时要在集群空闲的时间进行,测试的过程中会占用大量的资源 2、需要准备大约250G大小的空间磁盘,在测试过程中会生成文件 3、测试过程中在DISK WRITE TEST,DISK READ TEST这两个阶段比较耗时 4、测试完了会把gpcheckperf_$USER目录删掉 1、greenplum gpcheckperf 命令参数说明 以下列出了gpcheckperf 常用的一些参数 gpcheckperf -d test_directory [-d test_directory ...] {-f hostfile_gpcheckperf | - h hostname [-h hostname ...]} [-r ds] [-B block_size] [-S file_size] [-D] [-v|-V] gpcheckperf -d temp_directory {-f hostfile_gpchecknet | - h hostname [-h hostname ...]} [ -r n|N |M [--duration time]

CF1217E Sum Queries? (线段树)

爷,独闯天下 提交于 2019-11-29 10:30:28
完了,前几天才说 edu 的 DEF 都不会,现在打脸了吧 qwq 其实在刚说完这句话 1min 就会了 D,3min 就会了 E 发现,对于大小 \(\ge 3\) 的不平衡集合,它至少有一个大小为 \(2\) 的子集是不平衡的。 证明,发现对于大小为 \(2\) 的集合,平衡当且仅当两数的数位交为空(对于任意一位,至多一个数在这一位上不是 \(0\) )。 反证一波,如果大集合没有大小为 \(2\) 的不平衡集合,那么任意两数的数位交都为空,那么大集合也是平衡的,矛盾了。 所以,只需要考虑大小为 \(2\) 的集合。 这个就能线段树简单做了,每个线段树维护 \(ans\) 表示这个区间中的答案, \(mn_i\) 表示这个区间中第 \(i\) 位有值的数的最小值。pushup 具体看代码。 时间复杂度 \(O((n+q\log n)\log a_i)\) 。 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int maxn=200020,pw[9]={1,10,100,1000,10000,100000,1000000,10000000,100000000}; #define MP make_pair #define PB

【题解】GREWords(AC自动机)

时间秒杀一切 提交于 2019-11-29 10:10:10
【题解】GREWords(AC自动机) SP9941 GRE - GRE Words 题目大意: 给定一个由字符串构成的序列,不同位置的字符串有自己权值。现在让你选出一个子序列,使得在这个子序列中,前面的串是后面的串的子串。请你求满足条件的子序列的权值的最大值。一个子序列权值是所有元素权值的和。 考虑一个朴素的DP做法,设 \(dp(i)\) 表示选择了字符串 \(i\) 的最大权值子序列,转移直接枚举前面的字符串,通过 \(kmp\) 判断是否为子串,然后转移,复杂度 \(O(n^3)\) 考虑优化一下上面的做法,众所周知,ac自动机 \(fail\) 树上任意节点到根一条链是一段后缀。那么,一个字符串的所有子串就是它在ac自动机上的 所有节点 的所有到根链。(子串=自己某段前缀的后缀) 要优化上面那个 \(dp\) ,就是要求我们维护一个数据结构,使得可以根据一个字符串快速查询已有的他所有的子串的权值的最大值。考虑这样一种做法,把 \(fail\) 树单独拿出来,现在假设我有个 \(dp\) 值更新就只会对他的子树有影响,考虑到子树的一段连续的 \(dfs\) 序列,所以直接线段树维护一个区间取 \(max\) 单点求 \(max\) 即可。 可以直接先把fail建出来再依次更新 \(dp\) ,使得fail树的形态确定。 总复杂度 \(O(n\log n)\) //

【2019.8.23】测试题目订正

 ̄綄美尐妖づ 提交于 2019-11-28 11:14:37
T2:最大值与最小值 众所周知,小葱同学擅长计算,尤其组合数但这个题和组合数什么关系。 给定一张有向图,每个点有点权。试找到一条路径,使得该路径上的点权最大值减去点权最小值最大,问这个差最大是多少。   缩点后在DAG上DP,对每个dcc维护四个信息preMin/preMax/nxtMin/nxtMax,分别表示所有前驱、后继中的最大、最小点权,都要把这个dcc本身算在内。分别使用拓扑排序、记忆化搜索来更新前驱和后继信息,目标状态即为max{max(preMax[u] - nxtMin[u], nxtMax[u] - preMin[u])},可以保证组合得到最优路径上的差值。 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> #include <cctype> #define maxn 100010 #define maxm 500010 using namespace std; void open_file(string s) { string In = s + ".in", Out = s + ".out"; freopen(In.c_str(), "r", stdin); freopen(Out.c_str(), "w", stdout); }

树套树-线段树套平衡树

感情迁移 提交于 2019-11-28 08:56:37
树套树留坑 线段树套平衡树: 二逼平衡树 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<cmath> #include<map> #include<bitset> #pragma GCC optimize(2) #define rep(i,a,b) for(int i=(a);i<=(b);++i) #define dwn(i,a,b) for(int i=(a);i>=(b);--i) using namespace std; typedef long long ll; const int N=6000000,inf=2147483647; int n,m,maxn,a[N+10]; int tot,rt[N+10],sz[N+10],rec[N+10],v[N+10],fa[N+10],ch[N+10][2]; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48);

【学习笔记】扫描线

做~自己de王妃 提交于 2019-11-28 08:16:24
一.关于扫描线   基础是求周长并和面积并的算法。   注意,扫描线是一条不存在的线。   假设有一条扫描线从一个图形的下方扫向上方(或者左方扫到右方),那么通过分析扫描线被图形截得的线段就能获得所要的结果。 二.扫描线求面积并(由于本人不会做图,以下图片均来自洛谷的题解)   我们看一下这个东西。      我们模拟一条扫描线,从下到上扫过整个平面。   这条扫描线会在遇到横向线段的时候停下来更新一些东西。那么整个图形就可以找出四条线段。   如图:   我们要更新什么呢?当然是计算线段的长度了。   所以我们要记录的第一种东西就确定了。是每条线段的左右端点坐标。   然后我们把这些坐标放到一个数组,就叫X[]吧。   这个东西是需要排序的。具体原因请往下看。   那么我们考虑,在扫描线单调向上的过程中,怎么知道哪里有面积,哪里是空的呢?   我们想到一个矩形有上底和下底,在扫描线单调向上的过程中,总是先遇到一个矩形的下底,再遇到上底,然后这个图形的面积就被扫描线扫过了。   所以我们要记录第二个东西,给每条横向线段赋上一个权值,如果是下底则赋为1,如果是下底则赋为-1,这样扫描线扫有权值的部分就有我们要计算的面积。   然后我们考虑面积并的问题,我们知道,两个矩形相交的部分只能计算一次面积。   两个矩形相交,一个矩形的横向边上至少有1个另一个矩形边上的点。   那么如上图X

[SDOI2011]染色

杀马特。学长 韩版系。学妹 提交于 2019-11-28 07:51:52
题目描述 输入格式 不只有线段树外的节点需要合并,线段树内相邻节点,也要判合并 #include<bits/stdc++.h> #define re return #define inc(i,l,r) for(int i=l;i<=r;++i) using namespace std; template<typename T>inline void rd(T&x) { char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x; } const int maxn=100005; int n,m,tot,ans,k=1; int size[maxn],son[maxn],top[maxn],fa[maxn],deep[maxn]; int rev[maxn],seg[maxn],col[maxn]; int hd[maxn]; struct node{ int to,nt; }e[maxn<<1]; inline void add(int x,int y) { e[++k].to=y;e[k].nt=hd[x];hd[x]=k; e[++k].to=x;e[k].nt=hd[y];hd[y