答案一定是在凸壳上的(y>0上凸壳, y<0下凸壳). 线段树维护, 至多N次询问, 每次询问影响O(logN)数量级的线段树结点, 每个结点O(logN)暴力建凸壳, 然后O(logN)三分(二分也是可以的, 不过三分好写, 而且没精度问题....), O(Nlog^2N), 可以AC. -------------------------------------------------------------------------------------------- #include&l…
Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值. 集合初始时为空. Input 输入的第一行包含整数N和字符s,分别表示操作数和数据类别: 接下来N行,每行一个操作,格式如上所述.…
题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)":询问第L个到第R个加入的向量与向量(x,y)的点积的最大值.集合初始时为空. 输入 输入的第一行包含整数N和字符s,分别表示操作数和数据类别:接下来N行,每行一个操作,格式如上所述.请注意s≠'E'时…
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的ans一定由凸包上的点做出贡献. 我们按照给出的询问点的纵坐标的正负做出划分: 若为正:那么对答案做出贡献的点一定在上凸壳上 若为负:那么对答案做出贡献的点一定在下凸壳上 所以我们可以分别考虑上下凸壳.不失一般性,我们假设纵坐标为正. 那么这时候答案肯定在上凸壳上 并且这个上凸壳上的所有点和询问点组成的…
题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值. 集合初始时为空. 分析 题目中相当于给出一堆点\((z,w)\) 询问点\(x,y\) 求\(maximize(ans=xz+yw)\) \(\fr…
正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 \(n\)个操作 在序列末尾加入一个向量\((x,y)\) 询问加入的第\(l\sim r\)个向量中的一个向量和\((x,y)\)的点积最大值 强制在线,点积的定义为\(x_1x_2+y_1y_2\) 解题思路 如果对于一个\((x,y)\)对于两个\((x_1,y_1)\)和\((x_2,y_2)\)如果后者更大那么有 \[x_2x+y_2y>x_1x+y_1y\Rightarrow \f…
题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_0x_1+y_0y_1\geq x_0x_2+y_0y_2$ 然后其实会发现这条路走不通 那么还有什么办法呢?我们发现上面的式子里面是有$Ans$存在的 那我们尝试把$Ans$搞进去 $y_1=-\frac{x_0}{y_0}x_1+\frac{A}{y_0}$ 诶,半平面出来了= = 实际上,这里…
传送门 达成成就:一人独霸三页提交 自己写的莫名其妙MLE死都不知道怎么回事,照着题解打一直RE一个点最后发现竟然是凸包上一个点求错了--四个半小时就一直用来调代码了-- 那么我们只要维护好这个凸壳,因为这是一个凸函数,所以只要在上面三分找最值即可 于是现在我们需要维护一个资瓷插入的凸壳.考虑线段树,我们发现每一次在线段树上询问的区间必然都是已经把点插满了的.那么我们可以考虑线段树上每一个节点内的所有元素都插入完之后,再构建凸壳,那么显然每个节点只会被构建一次凸包,所以复杂度是\(O(nlog^…
[BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2,v2)\),并且\(u1>u2\) 假设第一个向量的结果优于第二个. \(xu1+yv1>xu2+yv2\) 移项可以得到 \(x(u1-u2)>y(v2-v1)\) 所以\(x/y>(v2-v1)/(u1-u2)\) 也就是\(-x/y>(v1-v2)/(u1-u2)\) 右…
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum (浮点数小数点一定是0.5) 查询y = fnum这条直线穿过了多少个州和city.州指的是连通的城市. 解题思路:用并查集记录城市之间是否连通,还有每一个州的y的上下界.建立坐标y的线段树,然后每次运行road操作的时候,对范围内的y坐标进行更新:更新须要分三种情况:两个州是相离,还是相交,还是包…
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11987 并查集+线段树进行修改与统计 https://vjudge.net/problem/UVALive-4730 线段树 https://vjudge.net/problem/UVALive-4108 暴力 线段树 https://vjudge.net/problem/UVA-12299 树状数…
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树分治) 大力每个颜色维护一个并查集,就很像上面那道题了.但是存在一个问题:在处理线段树区间\([l,r]\)时,可能并不知道\(l\)处的修改是否成功,所以不知道\(l\)处修改的边具体是什么颜色的. 我的解决方案是:处理区间\([l,r]\)时忽略\(l\)处修改的边.先向左子树递归,递归到叶子时…
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; ],v[N*],tot,deep[N],num[N],f[N],fa[N][]; long long ans; int lca(int x,int y)…
题目链接 BZOJ3533 题解 我们设询问的向量为\((x_0,y_0)\),参与乘积的向量为\((x,y)\) 则有 \[ \begin{aligned} ans &= x_0x + y_0y \\ y &= -\frac{x_0}{y_0}x + \frac{ans}{y_0} \\ \end{aligned} \] 所以向量集里的向量实际上可以对应到平面上一组点,我们用一个斜率固定的直线去经过这些点,使得斜率最大或最小 当\(y_0 > 0\)时,要求截距最大 当\(y_0…
BZOJ_4311_向量_CDQ分治+线段树按时间分治 Description 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 Input 第一行输入一个整数n,表示操作个数 接下来n行,每行先是一个整数t表示类型,如果t=1,输入向量 (x,y):如果t=2,输入id表示删除第id个向量:否则输入(x,y),查询 与向量(x,y)点积最大值是多少. 保证一个向量只会被删除一次,不会…
第二道线段树分治. 首先设当前向量是(x,y),剩余有两个不同的向量(u1,v1)(u2,v2),假设u1>u2,则移项可得,若(u1,v1)优于(u2,v2),则-x/y>(v1-v2)/(u1-u2),然后维护上凸壳后进行三分即可,复杂度O(nlog2n),如果将询问排序扫一遍,可以优化到O(nlogn),当然我没写. #include<bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt&l…
题解 我们可以根据点积的定义,垂直于原点到给定点构成的直线作一条直线,从正无穷往下平移,第一个碰到的点就是答案 像什么,上凸壳哇 可是--动态维护上凸壳? 我们可以离线,计算每个点能造成贡献的一个询问区间[l,r]表示这个点在第l个询问和第r个询问之间存在,按照每个点的横坐标大小顺序插入线段树,我们就可以类似斜率优化构造出凸包 对于所有询问,我们可以给它们按极角排序,然后遍历线段树,如果按照极角排序,那么垂直于他们的直线斜率递减,最优点也右移 实现的方法就是一边遍历线段树,一边归并排序,每一层按…
由点积的几何意义(即投影)可以发现答案一定在凸壳上,并且投影的变化是一个单峰函数,可以三分.现在需要处理的只有删除操作,线段树分治即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector> using namespace std…
题目传送门 题意:训练指南P248 分析:第一个操作可以用并查集实现,保存某集合的最小高度和最大高度以及城市个数.运用线段树成端更新来统计一个区间高度的个数,此时高度需要离散化.这题两种数据结构一起使用,联系紧密. #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int M = 3 * N; const int INF = 0x3f3f3f3f; struct Point { int x, y…
Description 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);" Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值.    集合初始时为空. Input 输入的第一行包含整数N和字符s,分别表示操作数和数据类别:    接下来N行,每行一个操作,格式如上…
题目描述     LYK在玩猜数字游戏.    总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi.     我们总能构造出一种方案使得LYK满意.直到-- LYK自己猜的就是矛盾的!     例如LYK猜[1,3]的最小值是2,[1,4]的最小值是3,这显然就是矛盾的.     你需要告诉LYK,它第几次猜数字开始就已经矛盾了.   输入     第一行两个数n和T,表示有n个数字,LYK猜了T次.    接下来T行,每行三个数分别表…
如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x的位置去合并那个并查集,同时维护个数和大小 #pragma GCC optimize(3) #include<bits/stdc++.h> #define pa pair<double,int> #define CLR(a,x) memset(a,x,sizeof(a)) using…
[CF471E]MUH and Lots and Lots of Segments 题意:给你平面上n条水平或竖直的,端点在整点处的线段.你需要去掉一些线段的一些部分,使得剩下的图形:1.连通,2.无环,3.端点依旧位于整点处. $n\le 2\times 10^5$ 题解:如果把整点看成点的话,那么这题让你求的就是一棵生成树.一棵生成树的边数就是这个连通块内点数-1,所以我们找到最大的连通块将其点数-1就是答案. 具体实现中,我们先进行扫描线,用并查集维护连通性,用线段树快速查找区间中点的数量…
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两个已有的向量(u1,v1)(u_1,v_1)(u1​,v1​)和(u2,v2)(u_2,v_2)(u2​,v2​),假设给出的向量为(x0,y0)(x_0,y_0)(x0​,y0​)u1>u2&&(u1,v1)⋅(x0,y0)>(u2,v2)⋅(x0,y0)u_1>u_2\&…
Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconnected Connected Hint N<=100000 M<=200000 K<=100000 题目大意 给出一个有n个节点和m条边的图,然后有k个询问,每个询问是删掉一些边,然后判断图是否连通,询问之间互相独立. 连通性问题通常的做法是并查集,然而并查集不支持删边,但是可以撤销上次操作…
永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪 座,请你输…
题目大意:有$n$个点,你需要操作$m$次.每次操作为加入/删除一条边. 问你每次操作后,这$n$个点构成的图是否是二分图. 数据范围:$n,m≤10^5$. 此题并没有强制在线,考虑离线做法. 一条边在某个时间被加入,然后又被删除. 设这条边出现的时间为$[l,r]$,我们开一棵线段树,在对应的区间上标记出这一条线段. 最后我们遍历整个线段树,把这些线段往并查集上加,同时维护当前点的颜色,然后简单判断下就没了. 这个并查集需要支持撤销操作,所以不能路径压缩,需要按秩合并 时间复杂度:$O(n\…
用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map> #include <queue> #include <string> #include <string.h&g…
[HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #define re register #define gc getchar using namespace std; void chread(char &x){ char c=gc(); while(…
这这这这这这什么毒瘤题!!!!!!!!!!!!!!!!!!!!!!!!!!!! 卡LCT(优秀的LCT由于是均摊本身就带着2,3的常数在,而且这道题对于LCT标记十分难维护,又得乘上4,5然后就炸了),卡树剖,卡正解,但是暴力能A!!!!!!!!!!!!!!!!!!!!!! 考试的时候我撸了一发LCT可是.....我忘了rev标记的延迟性会影响到题中所需标记.......我们只有在spaly的时候才会用到pushdown是为了让传上去的东西·真,因为这个pushdown在把信息全部传下去之后也是…