【UOJ #46】 【清华集训2014】玄学】的更多相关文章

uoj 因为询问是关于一段连续区间内的操作的,所以对操作构建线段树,这里每个点维护若干个不交的区间,每个区间\((l,r,a,b)\)表示区间\([l,r]\)内的数要变成\(ax+b\) 每次把新操作加入线段树中下一个叶子,然后如果某个节点里所有操作都加进去了,就条到父亲,把两个儿子的信息合并到父亲上.这里合并就是把两个区间集合合并成一个,例如两个区间\([a,c]\)和\([b,d](a\le b\le c\le d)\)会合并成\([a,b),[b,c),[c,d]\).合并出来的区间如果…
  题目传送门:uoj46   题意简述:要求在序列上维护一个操作间支持结合律的区间操作,查询连续一段时间内的操作对单点的作用效果,\(n \leq 10^5,m \leq 6 \times 10^5\).   刚开始看到这道题的时候想到树套树,然而需要用到的空间太大,时间复杂度无法承受,再一看有8s的时限,就试着强行对操作分块,看看能不能\(O(m \sqrt m)\)卡过去,不过极限数据下再怎么优化也要10s,卡不过去.   正解可以用二进制分组的思想,对操作序列维护一棵线段树,每个结点维护…
uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如果进行编号\([s,t]\)的操作,第\(k\)个数会变成多少. \(n\le10^5,q\le6\times10^5\) sol 二进制分组. 按顺序把变化插入线段树,如果线段树的某个满了就向上归并两个儿子的变换. \(a_j(a_ix+b_i)+b_j=a_ia_jx+a_jb_i+b_j\)就…
题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完备匹配,则称这是一个稳定匹配. 稳定匹配一定存在,且存在一个\(O(n^2)\)的算法: 任选一个未匹配的男生x,按x的喜爱程度从大到小枚举每个女生,若当前女生没有配偶或喜欢x胜过喜欢当前配偶,则与x匹配.直到所有男生都匹配. 这一题我们用行表示男生,n个数表示女生.喜爱程度为:行更喜欢靠前的数,数…
稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男生向自己未追求过的排名最高女生求婚. 然后每个有追求者的女生在自己现男友和追求者中选择一个最喜欢的接受,然后拒绝其他人. 算法一定可以结束. 因为如果最后有一个男生单身,那他一定把所有女生都追求过一遍,说明没有女生单身,产生矛盾. #include<iostream> #include<cs…
注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见的被卡常了.当年的标算似乎就是树套树,然而都是可持久化AVL树之类难懂的话. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 100010 #define mp(x,y) make_pair((…
[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,…
#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘以一个数的逆元: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005…
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一位火焰之神 “我将赐予你们温暖和希望!” 只见他的身体中喷射出火焰之力 通过坚固的钢铁,传遍了千家万户 这时,只听见人们欢呼 “暖气来啦!” 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小R的宿…
传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干块,每块对应序列上不同的区间 于是查询时对于每个线段树上区间查询时二分查找当前点在哪一块中即可 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include&…
清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了(找了好久才找到的良心题解.) 首先看到向下取整的式子要会拆开. 然后套类欧几里德. 这里的类欧几里德比较简单,因为可以看作是\(y=kx\)的正比例的向下整点. 如果\(k>1\),那么就相当与直接算上面的点,然后把直线砍到\(k\leq 1\). 否则取反函数,相当于减小了\(n\)而增大了\(…
题目描述 巨酱有 n 副耳机,他把它们摆成了一列,并且由 1 到n依次编号.每个耳机有一个玄学值,反映了各自的一些不可名状的独特性能.玄学值都是 0 到 m-1 间的整数.在外界的作用下(包括但不限于换线.上放.更换电源为核电.让kAc叔叔给它们讲故事),这些耳机的玄学值会发生改变.特别地,巨酱观察发现,每种作用 o 对应了两个整数 ao与 bo,在这种作用之后,玄学值原本为 x 的耳机,其玄学值恰会变成 (aox+bo)modm. 巨酱对他手头耳机的表现并不满意,遗憾的是,最近他并不有钱,无法…
这怎么想得到啊......... UOJ #36 题意:求随机一个集合的子集的异或和的$k$次方的期望值,保证答案$ \lt 2^{63},1 \leq k \leq 5$ $ Solution:$ 首先考虑$ k=1$的时候怎么做:如果某位上有$ 1$则有$ \frac{1}{2}$的概率可以取到这一位 $ k=1$时每一位都是独立的,可以直接做 然后考虑$ k=2$时怎么做 如果一个集合中有元素$ a,b$,则产生的贡献为$ a^2+2ab+b^2$ 我们把$ a^2$和$2ab$分开讨论…
UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\)的信息.由于每次加入一个操作只会加入两个断点,所以维护数列上每个线段的二元组\((a,b)\). 当一个时间块被填满之后就把两边的二元组归并上来,复杂度是\(O(断点个数)\). 由于一个操作只会加2个断点,一个断点只会被往上合并\(O(\log n)\)次,所以复杂度非常正确. 询问的时候在线段树…
题目链接:UOJ 这题的时间线段树非常的妙. 对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲. 对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序.于是就形成了差不多这样的一个结构. 查询的时候在分段函数上二分. 因为每个断点至多被合并\(\log n\)次,所以时间复杂度是\(O(n\log^2n+m\log n)\) #include<bits/stdc++.h> #define Rint register int using namespace st…
UOJ 题面传送门 看到 \(k\) 次方的期望可以很自然地想到利用低次方和维护高次方和的套路进行处理,不过.由于这里的 \(k\) 达到 \(5\),直接这么处理一来繁琐,二来会爆 long long,因此考虑另辟蹊径.注意到答案 \(\le 2^{63}-1\),也就是说当 \(k\) 比较大时值域也不会太大.因此考虑对 \(k\) 分类讨论. \(k=1\) 时考虑计算每一位的贡献,注意到对于一位 \(i\),如果存在某个 \(a_j\) 满足 \(a_j\) 的 \(2^i\) 位为 \…
 number⋅x+product⋅y=1  有整数x,y解的条件是gcd(number, product) == 1. product用线段树维护一下,然后现学了个欧拉函数. 可以这样假如x = p1^a1 * p2^a2 * p3^a3 * ... * pn^an,那么phi(x) = (p1 - 1) * p1^(a1 - 1) + (p2 - 1) * p2^(a2 - 1) + (p3 - 1) * p3^(a3 - 1) + ... + (pn - 1) * pn^(an - 1).…
Description 给出一个 $N$ 行 $M$ 列的矩阵A, 保证满足以下性质: $M > N$. 矩阵中每个数都是 $[0, N]$ 中的自然数. 每行中, $[1, N]$ 中每个自然数都恰好出现一次.这意味着每行中 $0$ 恰好出现 $M - N$ 次. 每列中,$[1, N]$ 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,并把这个数之后的数赋值为这个数.我们希望保持上面的性质4,即每列中,$[1, N]$ 中每个自然数仍然至多出现一次. Input 第一行一个正整…
题目大意:给n个数字,求子集的异或和的k次方的期望(n<=10^5,k<=5,保证答案小于2^63) 做法:首先如果从集合中拿出a和b,把a和a xor b放回集合,子集的异或和与原来是一一对应的,用高斯消元的思想可以消到只剩log个数,其他都是0,对答案没有影响.然后考虑k次方的期望,我们把二进制下每一位拆开,假设第i位的数字为xi,答案为(x1+x2+...+xlog)^k的期望,展开式子后发现是选k次x1~xlog中的数(可以重复选),每种选法选的位的乘积的期望的和,暴力枚举每种选法,复…
题目大意: 传送门 题解: 神题……Orz. 首先正难则反. 设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数. 设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保证$i<|S|$. 设$e[S,T]$表示从S集合到T集合的边数. 很显然有. 好吧,并不显然……还是来解释一下…… 考虑求$f_S$,我们知道缩点后必然会有一些点环的入度为0,但数量并不确定,我们强制性的让一部分图构成一部分缩点后为i个入度为0的子图.然后将这部分图随意连向剩余子图,至于剩余子图内…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ41.html 题解 首先写个乱搞: 一开始每一行都选择第一个非0元素,然后,我们对这个方案不断做更新,直到任意两行选择的值不同.更新方法:如果有两行选了相同的值,那么让靠前的那行选择后一个有0的值. 交上去. 过了. wtf? 然后发现证明这个结论我花的时间远远大于AC这题QAQ 现在我们来证明一下: 首先,如果这个算法算出解了,那么肯定合法.这个比较显然就不证明了. 然后,我们来分两步证明一定有解.…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ42.html 题解 首先我们把式子改写一下: $$(-1)^{\lfloor a\rfloor} \\=1-2(\lfloor a\rfloor \bmod 2)\\=1-2(\lfloor a\rfloor -2\lfloor \frac a2 \rfloor)$$ 于是问题就变成了求解: $$f(a,b,c,n) = \sum_{i=1}^n \left\lfloor \frac {a\sqrt{r…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ 位为 $1$ ,则对答案的贡献为 $2^i/2$ . k=2 : 发现每个异或和的平方为 $\sum_i\sum_j2^{i+j}bit_ibit_j$.那么考虑第 $i$ 位和第 $j$ 位的积的期望值.如果所有的数中,第 $i$ 位和第 $j$ 位均相等且非全零,那么参考 k=1 的情况,期望为…
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum[i]}$ 减去不为强连通图的方案数得到强连通图的方案数,其中 $sum[i]$ 表示点集 $i$ 中边的数目. 考虑什么样的图不是强连通图:缩点后入度为0的强连通分量对应的点集不是全集. 枚举这些入度为0的强连通分量对应的点集,由于无法保证只有这些点构成的入度为0的强连通分量,因此需要进一步容斥.…
题解 一道,神奇的题= = 我们考虑正难则反,我们求去掉这些边后有多少图不是强连通的 怎么求呢,不是强连通的图缩点后一定是一个DAG,并且这个DAG里面有两个点 我们想一下,如果我们把1当成入度为0的点,随便造出个图,可以是这个图吧 如果把2当成入度为0的点,随便造出个图,也可以是这个图吧 把1和2当成入度为0的点,随便造出个图,还可以是这个图吧-- 那么这像什么,容斥啊 以下的点说的都是缩点后的点 奇数个入度为0的点就是+,偶数个入度为0的点就是- 那么我们就有了一个精妙的容斥! 设\(f[S…
传送门 Sol 考虑对于操作时间建立线段树,二进制分组 那么现在主要的问题就是怎么合并信息 你发现一个性质,就是每个修改只会在整个区间内增加两个端点 那么我们二进制分组可以得到每个区间内最多只有区间长度级别段,每一段的修改都是一样的 那么可以直接一层层归并上来 最后询问就是二分每一个线段树的节点的询问段即可 修改复杂度 \(\Theta(n log n)\) 询问复杂度 \(\Theta(n log^2 n)\) # include <bits/stdc++.h> using namespac…
考虑欧拉函数的性质,60很小,压位存下线段树每个节点出现质数. #include<bits/stdc++.h> ; ; typedef long long ll; using namespace std; ],n,m,vis[]; ll val,p,rev[]; struct Segment_Tree{ #define lson (o<<1) #define rson (o<<1|1) ll sumv[N<<],pri[N<<]; inline…
传送门 不难看出就是要先求区间积,再求这个区间积的\(\varphi\) 因为\(\varphi(x)=x\times\frac{p_1-1}{p_1}\times\frac{p_2-1}{p_2}\times ...\),又因为质数总共只有\(60\)个,我们可以用一个\(long\ long\)来压位,表示某一个质因子是否出现过,那么用线段树维护这个东西,顺便维护区间乘积即可 因为模数是质数,可以预处理逆元 //minamoto #include<bits/stdc++.h> #defin…
传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓扑序最小(也就是入度为\(0\))的强连通分量,然而这种强联通分量可能不止一个,需要容斥,不难发现这里的容斥系数在强联通分量个数为奇数时为正,为偶数时为负(也就是强联通分量为奇数时要减掉方案数,为偶数时要加上方案数) 设\(g_i\)为点集\(i\)中形成奇数个强连通分量的方案数\(-\)形成偶数个…
传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概率就是\(\frac{1}{2}\) 证:把\(a_j\)拿出来,那么剩下的里面选出的子集不管是什么情况,\(a_j\)放进去或不放肯定有一种能使\(x\)的第\(i\)位为\(1\),且另一种使\(x\)的第\(i\)位为\(0\),那么概率就是\(\frac{1}{2}\) 然后是\(k=2\)…