传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标记. 简单合并一下就行了.(细节见代码) 代码: #include<bits/stdc++.h> #define N 100005 #define lc (p<<1) #define rc (p<<1|1) #define mid (T[p].l+T[p].r>>…
题目链接 BZOJ4105 题解 平方操作orz,虽说应该是线段树,但是不会维护啊QAQ 小瞧一眼题解... 平方成环?环长\(lcm\)小于\(60\)? 果然还是打表找规律题.... 那就很好做了,先预处理每个数是否在环上,如果当前区间存在数不在环上,就暴力修改 如果当前区间都在环上了,就处理出环,之后每次修改只在环上走一步即可 每次修改可能会重置\(logn\)个节点的信息,由于重置一次要求出环,是\(O(60)\)的,所以修改总复杂度是\(O(60nlogn)\)的,可以接受 #incl…
填坑 我不知道怎么算的,但是所有环的LCM数不会超过60 然后用线段树维护这个东西,每个节点记录子树内的循环节 没到循环节的暴力枚举 复杂度是nlogn再乘以循环节长度 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<vector> #de…
Description   Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数.   接下来一行N个数代表一开始的序列{X1,X2,...,XN}.   接下来M行,每行三个整数op,l,r.其中op代表本次操作的类型.若op=0,代表这是一次平方操作,平方的区间为[l,r]:如果op=1,代表这是一次询问操作,询问的区间为[l,r].   Output 对于每次的询问操作,输出一行代表这段区间内数的总和.注意:答案没有对任何数取模.…
首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们对每一步建立一颗线段树,那么修改就变成了交换60棵线段树的某个子树.然后我们就可以愉快的写啦~~~ 在想的时候被同学坑了,他说最长的循环不超过60.... 在实现方面,我用一个map+树状数组维护链上的答案,然后用60棵线段树来维护这个环.懂了之后还是很好写哒~~~ Code: #include <cs…
传送门 考虑到模数等于7 * 13 * 17 * 19. 那么只需要维护四棵线段树求出每个数处理之后模7,13,17,197,13,17,197,13,17,19的值再用crtcrtcrt合并就行了. (因为太懒不想写crt改用枚举求解水过) 代码…
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB Description 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串.   比如对于字符串“ABCAAA”,我们可以得到这N+1个串:   ABCAAA.   BCAAA.A   CAAA.AB   AAA.ABC…
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 Description 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串. 比如对于字符串“ABCAAA”,我们可以得到这N+1个串: ABCAAA. BCAAA.A C…
https://www.lydsy.com/JudgeOnline/problem.php?id=4104 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串. 比如对于字符串“ABCAAA”,我们可以得到这N+1个串: ABCAAA. BCAAA.A CAAA.AB AAA.ABC AA.ABCA A.ABCAA .ABCAAA 接着我们对得到的这N+1个串按字典…
题目链接 BZOJ4104 题解 我们将已知字符排序,由循环就可以得到一个对应关系 如样例就是: 0->第5行 1->第1行 1->第2行 1->第3行 1->第5行 2>第6行 3->第4行 按照这个循序加入答案即可 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #inc…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104 想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 . 已知字符集,对它排个序,对应上给出的那些字符,就能知道每个字符前面是哪个字符. 这样得到了一些长度为2的串.这些长度为2的串一定也是这 n+1 行的开头:所以对它们排序后对应上给出的那些字符,就能得到长度为3的串.这样就能得到答案. 但是太慢.考虑已知长度为 k 的串,想一下把它接成 2*k 的串.…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4104 [题解] 脑洞+找规律做出来的.. 我用样例作为说明吧 样例给了我们这个 AAAC.A B 看起来没啥用 这是那个矩阵的最后一列对吧. 第一列是什么呢?我们都知道,按字典序排列. .AAAAB C 由于这是一个环,所以第一个字母和最后一个字母是相邻的.换句话说,我们只要知道第一个字母和最后一个字母的对应关系,我们就能知道环长什么样了. 问题在于.有很多个重复的数,我们怎么知道对应的顺…
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij. Input 第一行包含两个正整数n,m,分别表示两个数列的长度 第二行包含n个非负整数xi 第三行…
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij. Input 第一行包含两个正整数n,m,分别表示两…
题目描述 三体人将对地球发起攻击.为了抵御攻击,地球人派出了 $A × B × C$ 艘战舰,在太 空中排成一个 $A$ 层 $B$ 行 $C$ 列的立方体.其中,第 $i$ 层第 $j$ 行第 $k$ 列的战舰(记为战舰 $d(i, j,k)$)的生命值为 $d_{i, j,k}$. 三体人将会对地球发起 m 轮“立方体攻击”,每次攻击会对一个小立方体中的所有 战舰都造成相同的伤害.具体地,第 t 轮攻击用 7 个参数 $la_t ,ra_t , lb_t ,rb_t , lc_t ,rc_t…
传送门 线段树基本操作 区间加等差数列,维护区间和. 对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题. 代码: #include<bits/stdc++.h> #define lc (p<<1) #define rc (p<<1|1) #define mid (T[p].l+T[p].r>>1) #define N 300005 #define mod 1000000007 #define ll long…
传送门 线段树维护区间取模,单点修改,区间求和. 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个log" role="presentation" style="position: relative;">loglog,所以维护区间最大值剪枝,然后每次单点暴力取模,这样的话时间复杂度为O(nlogn)" role="presentation" style="posi…
传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;">xx坐标为x0" role="presentation" style="position: relative;">x0x0时在最上方的线段的标号(若有多条输出最小的). 线段树好题,这题是李超线段树板子题. 没学过的这道题可以让你很好的理解李超线段树…
传送门 不难看出最后的矩形一定有一条边与凸包某条边重合. 因此先求出凸包,然后旋转卡壳求出当前最小矩形面积更新答案. 代码: #include<bits/stdc++.h> #define N 50005 #define eps 1e-9 using namespace std; struct pot{ long double x,y; inline pot operator+(const pot&a){return (pot){x+a.x,y+a.y};} inline pot op…
题意:给你一棵\(n\)个节点的树,\(q\)个询问,每次询问读入\(u,v,k,op\),需要满足树上有\(k\)对点的简单路径交都等于\(u,v\)之间的简单路径,\(op=1\)表示\(k\)对点中每个点只能存在于一个点对中,否则每个点可以存在于多个点对中,问那k对点有多少种选法,答案对\(998244353\)取模. 数据范围:对于\(100%\)的数据,保证 \(1≤n≤10^5,1≤u,v≤n,u \ne v,1≤k≤min(n,500),op∈{0,1}\),保证每个节点的度数不超…
一句话题意:给你三个数列{a_i},{b_i},{c_i},保证每个数列都恰好是一个排列.你需要求出满足\(a_i<a_j,b_i<b_j,c_i<c_j\)的有序对\((i,j)\)的数目. 提示:为了避免过量的输入对程序的运行效率产生影响,数列为生成的. 数据范围: 对于 100% 的数据,保证\(1≤n≤ 2*10^6\), 看似一个三维偏序,实际上cdq分治只能36分,还得卡常才能获得高于36分的好成绩. 事实上,因为这三个序列是排列,所以我们可以将其转化为3个二维偏序,如下:…
对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+ 然而不用二分,直接1000个点一起在树上跑就可以了... #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> us…
http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 200003; int in() { int k = 0, fh = 1; char c = getchar(); for(; c < '0' || c…
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF 神犇的题解. 题目给出的 n 和 m 的范围差别很大,n 很小,m 很大,因此可以想到 n 的范围是为了直接暴力枚举. 题目要求的就是 A 的一段区间中的数和 B 的一段区间中的数的异或的第 k 大值. 位运算有关的题目,一般是从高位到低位贪心之类的. 区间异或,一般要使用可持久化 Trie. 我…
传送门 组合数学好题. 题目要求输出的结果成功把概率转化成了种类数. 本来可以枚举统计最小值为iii时的概率. 现在只需要统计最小值为iii时的方案数,每一行有不少于iii个1的方案数. 显然一行选i个1的方案数为(mi)∗xm−i∗yi\binom {m} {i}*x^{m-i}*y^{i}(im​)∗xm−i∗yi 于是对于每一行分开考虑最后用快速幂合并就行了. 代码: #include<bits/stdc++.h> #define ll long long using namespace…
传送门 线段树好题啊. 题目要求的是sum−a−b−c+maxsum-a-b-c+maxsum−a−b−c+max{∣a+v∣+∣b+v∣+∣c+v∣|a+v|+|b+v|+|c+v|∣a+v∣+∣b+v∣+∣c+v∣}. 那么后面有几种情况: a+v+b+v+c+va+v+b+v+c+va+v+b+v+c+v a+v−b−v+c+va+v-b-v+c+va+v−b−v+c+v a+v+b+v−c−va+v+b+v-c-va+v+b+v−c−v −a−v+b+v+c+v-a-v+b+v+c+v−…
传送门 旋转卡壳板子题. 就是求凸包上最远点对. 直接上双指针维护旋转卡壳就行了. 注意要时刻更新最大值. 代码: #include<iostream> #include<cstdio> #include<algorithm> #define N 50005 using namespace std; inline int read(){ int ans=0,w=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')w=…
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚至可以每次询问都枚举\(x_i\) 所以我们可以考虑对\(y_i\)建\(trie\),每次询问取出对应区间的\(x_i\)在对应区间的\(trie\)树中跑 多点询问和单点询问时类似的,只不过它们会分开走 我们只需每次记录每个\(x_i\)所在的节点 对于每一层,统计一下能异或出多少\(1\),如…
Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij. Input 第一行包含两个正整数n,m,分别表示两个数列的长度 第二行包含n个非负整数xi 第三行包含m个非负整数yj 第四行包含一个正整数p,表示询问次数 随后p行,每行均包含5个正整数,用来描述一次询问,每行包含五个正整数u,d,l,r,k,含…
我们观察数据:树套树 PASS    主席树 PASS  一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q*30+m*30)是一个可选复杂度. 我们想一下我们正常的时候的01Trie其实是通过在每一层比较大小来确定这一为是0还是1,所以我们从上到下一位一位地走,统计每在这一位异或值为1的数的个数,如果这一位是一的个数大于k那么我们就使这一位为1,那么我们就舍弃这一位为0的状态就是所有的点都走变为1的路,如…