LOJ.2864.[IOI2018]排座位(线段树)】的更多相关文章

LOJ 洛谷 先令编号从\(1\)开始.我们要求\([1,i]\)这些数字能否构成一个矩形. 考虑能否用线段树维护,让每个叶子节点\(i\)表示前\(i\)个数能否构成矩形. 一种方法是维护前\(i\)个点最左上点和最右下点的坐标,直接判断这两个点构成的矩形面积是否是\(i\). 发现修改的时候这个最值不好维护,每次修改可能是\(O(n)\)的. 考虑合法矩形的特征.把前\(i\)个点标记为黑点,其余点是白点.那么前\(i\)个点构成了一个矩形当且仅当: 左边和上边都是白点的黑点有且只有一个.…
题目链接: IOI2018seat 题目大意:给出一个$H*W$的矩阵,将$0 \sim W*H-1$分别填入矩阵的格子里(每个格子里一个数),定义一个子矩阵是美妙的当且仅当这个子矩阵包含且仅包含$0 \sim i$($i$为$0 \sim W*H-1$的任意数)这些数,每次调换两个数的位置,求有多少个美妙的子矩阵. 这题思路真的很神. 原题编号从0开始,很不舒服,我们按从1开始的讲. 发现只需要判断[1,i]这些数是否组成了一个矩阵. 那么我们能不能用线段树,第i个叶子节点存前i个数的信息来判…
[LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\).那么就有\(\displaystyle a-[\frac{a}{d}]=b-[\frac{b}{d}]\). 那么假设\(a,b\)整除的结果分别为\(aa,bb\).\(a=d*aa+p_a,b=d*bb+p_b\) 得到:\(\displaystyle (d-1)aa+p_a=(d-1)bb+p…
[Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但是这样还不够. 仔细观察哪些点交换了才有意义. 假设交换的位置是\(l,r\) 首先必须有\(h[l]\gt h[r]\),这个很显然,如果把一个更大的数换到了前面显然不优. 其次,\(l\)必须是前缀的最大值. 如果\(l\)不是前缀最大值,那么存在一个位置\(i\)满足\(h[i]\gt h[l…
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜又开始研究起线段树来了,有所不同的是,她把目光放在了更广义的线段树上:在正常的线段树中,对于区间 \([l, r]\),我们会取 \(m = \lfloor \frac{l+r}{2} \rfloor\),然后将这个区间分成 \([l, m]\) 和 \([m + 1, r]\) 两个子区间.在广义…
原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节点,维护以下信息: 1. 这个点为 1 的概率. 2. 这个点为 0 ,且它有祖先是 1 的概率. 其中,第一种东西在维护了 2. 的情况下十分好求. 第二种东西,只有两类: 1. 一次线段树操作涉及到所有的节点,显然只要乘 0.5 . 2. 某些节点打了标记之后,它的所有子孙都被他影响了.于是我们…
题目链接: [IOI2018]meetings 题目大意:有$n$座山峰,每座山峰有一个高度,有$q$次询问,每次需要确定一个开会山峰使$[l,r]$所有山峰上的人都前往开会山峰,一个山峰的人去开会的代价为从这个山峰到开会山峰区间内山峰高度的最大值,对于每次询问求最小代价和. 还是按照编号都从$1$开始讲. 可以发现对于一个询问如果确定了开会地址那么答案只和每个点到开会点区间最大值有关. 而题目又没有强制在线,我们可以按区间最大值来分治. 我们设对于区间$[l,r]$的答案是$ans(l,r)$…
「SDOI2017」相关分析 题目链接:https://loj.ac/problem/2005 题解: 把上面的式子拆掉,把下面的式子拆掉. 发现所有的东西都能用线段树暴力维护. 代码: #include <bits/stdc++.h> #define N 100010 #define ls p << 1 #define rs p << 1 | 1 using namespace std; typedef double db; typedef double ll; ll…
题目链接: IOI2018doll 题目大意:有一个起点和$m$个触发器,给出一个长度为$n$的序列$a$,要求从起点出发按$a$的顺序经过触发器并回到起点(一个触发器可能被经过多次也可能不被经过),起点和每个触发器都有一个出口和若干个入口.你可以在这些触发器之间加上一些开关,每个开关有两个出口$x,y$和若干个入口,当奇数次进入开关时会从$x$出来,当偶数次进入开关时会从$y$出来,要求第一次回到起点时所有开关都被经过偶数次且使用的开关数尽量少,输出每个元件的出口指向. 因为最后要求回到起点,…
每个线段树维护一个行向量[A,B,C,len]分别是这个区间的A,B,C区间和与区间长度,转移显然. 以及此题卡常,稍微哪里写丑了就能100->45. #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define ls (x<<1) #define rs (ls|1) #define lson ls,L,mid #define rson r…