自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(236)
  • 收藏
  • 关注

原创 博客搬迁启事

博客搬迁到博客园了地址

2020-12-29 19:34:34 182 1

原创 CF1438D Powerful Ksenia

题面传送门这个构造还是很巧妙的。有一个显然的性质:序列中所有数的异或和等于最后只有一种数时所有数的异或和。还有一个结论:当有三个数a,b,ba,b,ba,b,b时,只要一次操作就能使其变成三个aaa。那么事实上无解的情况已经呼之欲出了:当n mod 2=1n\bmod 2=1nmod2=1且序列中的所有数异或和不为000即无解。现在主要是三步:处理出所有数得异或和,令其为ana_nan​,将剩余n−1n-1n−1个数两两相等。再用n2\frac{n}{2}2n​次操作将其变为一样。对于nnn为奇

2020-11-15 12:51:10 223

原创 CF431E Chemistry Experiment

题面传送门题解里居然没有写线段树上二分的,来交一发。维护一颗权值线段树,以hih_ihi​为下标,主要维护两个值,是元素个数和元素和。那么当前点mmm可以判断左边的节点数×m−\times m-×m−左边的元素和是否大于当前的水量来考虑走左边还是右边。走到最后一个节点时计算剩下的水量,然后均摊给每一个试管。时间复杂度O(nloga)O(nloga)O(nloga),一点不卡常。代码实现:#include<cstdio>#define l(x) f[x].l#define r(x)

2020-11-03 20:04:03 231

原创 fxtoi zjzj

题面传送门404040分:爆搜,此处不作赘述这道题硬推是很难推的,下面展示一下硬推的过程,以f(4,n)f(4,n)f(4,n)为例我们可以根据题目列出一个式子:∑i=1n∑j=1n∑k=1n∑s=1n1[i+j+k+s=n]\sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{n}{\sum\limits_{k=1}^{n}{\sum\limits_{s=1}...

2020-11-03 18:41:03 135

原创 fxtoi 矩阵乘法

题面传送门这个东西显然不能矩阵乘法(暴论)考虑手推几组数据。比如这组:1999 100000000000000这东西怎么推啊,这不是要死人的节奏吗。别急,推推看就知道了。f0=999f_0=999f0​=999f1=999+9×9=1080f_1=999+9\times 9=1080f1​=999+9×9=1080f2=1080+0×8=1080f_2=1080+0\times 8=1080f2​=1080+0×8=1080你发现了什么?当这个数位中出现000时就一定能无限循环。

2020-11-03 18:40:38 171

原创 CF1444B Divide and Sum

题面传送门考虑一个最朴素的暴力:枚举两个数,再用组合数算答案。考虑算贡献。先排好序。一个数有两个贡献,加的贡献和减的贡献。可以枚举每一个数,钦定这个数一定是降序排序的,结果乘二,然后枚举在这个数之前选几个。代码大概长这样:sort(a+1,a+2*n+1);for(int i=1;i<=2*n;i++){ for(int j=1;j<=min(i,n);j++){ if(i-j-1<=n-j-1) ans-=a[i]*c(j,i)*c(n-j-1,n-i); els

2020-11-02 15:10:37 117

原创 CF1444A Division

题面传送门题意简述:给出aaa与bbb,找到一个最大的数xxx,使得a%x==0&&x%b≠0a\%x==0\&\&x\%b≠0a%x==0&&x%b​=0这样的题目考虑质因数分解。因为bbb分解是在可以接受的范围内,所以分解bbb。设b=a1p1×a2p2×...×anpnb=a_1^{p_1}\times a_2^{p_2}\times...\times a_n^{p_n}b=a1p1​​×a2p2​​×...×anpn​​然后将aaa分解得a

2020-11-02 15:09:15 363

原创 CF342E Xenia and Tree

题面传送门看完了题目你会发现这道题居然没有撤销操作。那么基本上就是某些奇奇怪怪的算法首先我们考虑暴力第一种想法是暴力对于每个红点求lcalcalca第二种想法是对于每个新加进来的红点做一遍bfsbfsbfs然后每次查询直接O(1)O(1)O(1)一般这种有两个暴力然后分别两个操作复杂度大大低于另外一个的就是根号分治。考虑对操作分块,设块长为KKK那么对于每一块的查询,对这一块中的修改取lca然后再和之前bfsbfsbfs的取minminmin,每一块结束后进行bfsbfsbfs,注意这样bf

2020-10-30 22:08:35 114

原创 CCC 2011 Unfriend

题面传送门显然树形dpdpdp转移时直接考虑这颗子树选或不选。dpv=dpv×(dpu+1)[u∈v]dp_v=dp_v\times (dp_u+1)[u∈v]dpv​=dpv​×(dpu​+1)[u∈v]代码实现:#include<cstdio>#define beg int cur=s.h[x]#define end cur#define go cur=tmp.zusing namespace std;int n,m,k,x,y,z,dp[39],in[39];struc

2020-10-27 20:26:33 96

原创 CF1436E Complicated Computations

题面传送门首先考虑一个结论:将一个区间中的数去重后这个区间mexmexmex没有影响。所以我们只要求出那些mexmexmex中有几个数。一个区间mex=kmex=kmex=k的条件是区间没有kkk且区间有111到k−1k-1k−1考虑对于同样的数分段。那么对于每个段这样查询即可。即满足三个条件:[l≤i≤r][l\leq i \leq r][l≤i≤r]和所有不同的1−k−11-k-11−k−1种类等于k−1k-1k−1如果直接像HH的项链HH的项链HH的项链那样那就要二维树状数组维护要两个l

2020-10-25 15:57:07 570

原创 浅谈股票类问题

题面传送门这道题显然是对于每个卖出股票,在前面找到最小的买进,统计答案即可。代码实现:class Solution {public: int maxProfit(vector<int>& prices) { int a[1000039]; int i,j,ans=0,tot=0; int n=prices.size()-1; for(i=0;i<=n;i++) a[i]=prices[i];

2020-10-20 19:35:38 89

原创 CSP-J/S游记

初赛:Day 0考前摸了一下zyqzyqzyq,这样就能考满分了。然后又膜拜了一下touristtouristtourist打了一场vpvpvp就睡觉了。这场vpvpvp真的打击信心,sbsbsbEEE题交了101010发才过。然后喜提切了5题中的最后一名。预祝明天rp++rp++rp++Day 1考前进场前膜拜了机房所有人。考试时发现提高这里一堆sb题前面选择题随便ak了。然后第一题是位运算性质,第二题快排k大模板随便切了。第三题看到90+90+90+行有点怕。怀着虔诚的心态保佑这

2020-10-13 19:01:27 479 2

原创 luogu P5309 [Ynoi2011]初始化

题面传送门不小心抢了个最优解,比第二少了0.6s0.6s0.6s分块+根号分治套路题。看到这种跳着加的就知道是根号分治了。对于x>sx>sx>s的直接加,用分块维护。对于x<sx<sx<s的,维护数组fi,jf_{i,j}fi,j​表示跳iii个,从jjj开始加了几次。为了之后统计方便,还要前缀和。统计时,一部分是分块直接统计。另一部分可以在fi,jf_{i,j}fi,j​上算,考虑整块和零散的情况。直接统计前缀和即可。关于sss我取80左右,实测跑得飞快

2020-10-07 22:04:09 199

原创 CF1408F Two Different

题面传送门一道好题。首先有一个操作:如果有nnn个aaa,nnn个bbb,那么可以通过nnn次变成2n2n2n个ccc那么考虑倍增,每次选取两块拿来合并。然后对于前一部分和后一部分分别倍增就好了。代码实现:#include<cstdio>using namespace std;int n,m,k,z,a[100039],s,head,x[1000039],y[1000039];int main(){// freopen("1.in","r",stdin); register

2020-10-07 21:58:56 1098

原创 luogu P5816 [CQOI2010]内部白点

题面传送门首先有一个结论就是不存在二次变换。如果存在二次变换,那么二次变换那个点的至少一个方向会新出现一个点,但是要新出现一个点那个方向必定原来就存在一个点。所以不成立。那么就可以从上到下做扫描线,当碰到一列最上面的点时给树状数组那个位置加一,最下面减一就好了。代码实现:#include<cstdio>#include<vector>#include<cstring>#include<algorithm>#define max(a,b) ((

2020-10-07 21:56:27 184

原创 luogu P2569 [SCOI2010]股票交易

题面传送门这道题暴力dp是很好想的。就是分别从上一天,最晚可转移的天,凭空买来转移。因为有状态自然叠加所以只要转移最晚可转移的天就好了。然后会发现这个是可以正反两边单调队列优化的。复杂度O(TP)O(TP)O(TP)代码实现:#include<cstdio>#include<cstring>#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,m,w,x,y,z,f[2039][2039],

2020-10-07 21:53:07 416

原创 luogu P4768 [NOI2018]归程

题面传送门一不小心抢了最优解。首先跑出111到所有点的最短路,因为那个梗在先,所以用堆优化dj然后这道题显然要让我们求最小瓶颈路之类的东西。所以就可以建出克鲁斯卡尔重构树。在树上倍增。同时处理子树内距离最小值。倍增到的那个点的值就是答案了。代码实现:#include<cstdio>#include<queue>#include<algorithm>#include<cstring>#define min(a,b) ((a)<(b)?

2020-10-07 21:50:04 97

原创 luogu P3758 [TJOI2017]可乐

题面传送门考虑暴力建分层图dp实际上就是对于每个时间建到下一层的图就好了。然后停留就是自环,爆炸就连向永远走不出来的点。其实这个东西是可以矩乘优化的。然后复杂度就降到O(logtn3)O(logtn^3)O(logtn3)代码实现:#include<cstdio>#define mod 2017using namespace std;int n,m,k,x,y,z,t,anss;struct jz{ long long f[139][139]; jz operator

2020-10-07 21:47:03 95

原创 luogu P4151 [WC2011]最大XOR和路径

题面传送门一道套路题。考虑把图分解成链与环。然后我们会发现其实路径就是一条链加上一堆环。因为从链走到环的路径会被异或两次为000所以就直接上线性基就好了。代码实现:#include<cstdio>using namespace std;int n,m,k,x,y,flag[100039];long long p[10039],z,ans,d[100039];struct yyy{int to;long long w;int z;};struct ljb{ int hea

2020-10-07 21:44:35 115

原创 luogu P5445 [APIO2019]路灯

题面传送门首先用两颗线段树维护每个点所在的亮灯联通块。然后再建一颗二维线段树,每个点表示到当前为止,有多少个时刻能从iii到jjj。对于每次修改,依靠两颗线段树维护的区间,来修改。这里有一个小技巧,在修改时加上q−tq-tq−t,修改时减去,就是答案,还能累加。查询就查当前点就好了。代码实现:#include<cstdio>using namespace std;int n,m,k,x,y,z,tot,root[300039],a[300039];char s;struct

2020-10-07 16:13:40 92

原创 luogu P3792 由乃与大母神原型和偶像崇拜

题面传送门可以算一道线段树维护hash的模板题了吧。hash要满足两个条件:相同的数hash值一定一样与hash冲突尽量少。这道题hash序列可以用幂次方来hash然后用线段树随便维护一下就好了。代码实现:#include<cstdio>#include<algorithm>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;i

2020-10-07 16:04:59 97

原创 luogu P2312 解方程

题面传送门数据太大了,所以要hash。多取几个模数正确性更高。代码实现:#include<cstdio>#define mod 1000000007using namespace std;int x,y,z,n,m,k,head,ans[100039],fff;long long tot,a[100039],now;char _s;int main(){// freopen("1.in","r",stdin); register int i,j; scanf("%d%d

2020-10-07 13:38:50 82

原创 CF1423B Valuable Paper

题面传送门场切的题目,感觉还是很套路的。这种最大最小一看就是二分没跑了。考虑二分分出来后怎么验证。题面已经很明显地提示了我们这是一张二分图。那么跑网络流的二分图最大匹配就好了。时间复杂度O(nmlogai)O(n\sqrt mloga_i)O(nm​logai​)代码实现:#include<bits/stdc++.h>using namespace std;int n,m,k,x[100039],y[100039],z[100039],d[100039],cur,l,r,mi

2020-10-06 10:28:59 312

原创 CF1423K Lonely Numbers

题面传送门场切的题目,感觉不错。首先有一个结论:一个质数xxx,只有出现x2x^2x2是他才不孤独。证明:对于不是xxx的倍数yyy,那么三个值分别为1,x,y1,x,y1,x,y,这样一定无法构成三角形。对于是xxx的倍数kx(k≠x)kx(k≠x)kx(k​=x),那么三个值分别为1,x,k1,x,k1,x,k也构不成三角形。第二个结论:合数一定是不孤独的。证明:如果这个合数是某个质数的平方。那么同上。如果不是,因为合数xxx至少有一个小于x\sqrt xx​的因数yyy,则yz=x

2020-10-06 09:38:09 361

原创 luogu P5305 [GXOI/GZOI2019]旧词

题面传送门你会发现这道题和LNOI2014某题很像。但是那个kkk次方很难处理。考虑k=1k=1k=1的情况,就是那道题。照样差分,但是这次差分不是那么差,而是每个点的权值改成dik−(di−1)kd_i^k-(d_i-1)^kdik​−(di​−1)k这东西就可以实现了。因为加到一个点时这个点到根节点的路径都会被加。而这个值又恰好等于深度的kkk次方。那么把原来的线段树改成带权的就好了。代码实现:#include<cstdio>#include<cstring>

2020-10-06 09:29:32 101

原创 luogu P4211 [LNOI2014]LCA

题面传送门一道典型的树剖题目。这东西如果暴力肯定是没法算的。除非能转化一下,比如算贡献。然后会发现HHHOJ上有一道题和这个很像。这样的话可以把每个点向上算贡献,一直加111到根节点。这样当一个点加到时那么就自然算到了贡献。其实质是差分,只不过没那么明显罢了。这个东西可以用树剖+线段树维护。但是这道题是区间查询。如果每次暴力加进去只有O(mnlog2n)O(mnlog^2n)O(mnlog2n)的复杂度,比那个O(nmlogn)O(nmlogn)O(nmlogn)的暴力还劣。首先这个区间肯

2020-10-06 09:24:02 77

原创 qzezoj 1755 球赛

这道题O(n2)O(n^2)O(n2)的dp是很好想的。设fif_ifi​表示到iii时的队伍小于等于rankirank_iranki​最大的不用移动的个数,那么显然状态转移方程是fi=max⁡j=1j≤i&rankj≤rankif_i=\max\limits_{j=1}^{j\leq i\&rank_j\leq rank_i}fi​=j=1maxj≤i&rankj​≤ranki​​ 就是从小于等于一定不用乱序的转移。然后发现这个东西是个二维偏序,第一维本来有序,那么第二维用树

2020-10-05 16:32:49 155

原创 luogu P3304 [SDOI2013]直径

题面传送门首先你可以把所有直径求出来然后暴力。但是这道题可以把求树的直径的方法。首先求出一条直径,把直径上的所有点点权减一。然后再求一遍,两次相减就是答案。正确性显然。代码实现:#include<cstdio>#include<cstring>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,t

2020-10-05 15:06:04 123 1

原创 luogu P3201 [HNOI2009] 梦幻布丁

题面传送门启发式合并大法好!你会发现这道题可以暴力合并。然而数据稍微用心一点就卡掉了。然后你可以试图优化一下,比如合并时把小的合并到大的上面去。结果就过了。这样复杂度上界是O(nlogn)O(nlogn)O(nlogn),具体证明在这篇题解里有。代码实现:#include<cstdio>#include<cstring>int n,m,k,x,y,z,a[100039],siz[1000039],ans,cur,fa[1000039];struct yyy{in

2020-10-05 15:00:35 349

原创 qzezoj 1754 梦境

用脚找一下规律就会发现可以构成最后一项为全部异或和的循环节。那么前缀异或就好了。代码实现:#include<cstdio>using namespace std;int n,m,k,z;long long a[1000039],q[1000039],ans,x,y;int main(){ register int i; scanf("%d",&k); for(i=1;i<=k;i++) scanf("%lld",&a[i]),a[k+1

2020-10-05 14:54:53 124 1

原创 qzezoj 1752 Vjestica

看到数据范围一眼状压。然后就是怎么转移的问题了。设fif_ifi​为使用状态为iii时所用的节点数。然后你会发现这个用O(2nnk)O(2^nn^k)O(2nnk)的转移不了。那么就可以枚举子集转移。dpdpdp方程为dpi=min{dpj+dpi⨁j−lcp(i)}dp_i=min\{dp_j+dp_{i⨁j}-lcp(i)\}dpi​=min{dpj​+dpi⨁j​−lcp(i)}复杂度O(3n)O(3^n)O(3n)代码实现:#include<cstdio>#includ

2020-10-05 14:52:47 166

原创 qzezoj 1750 国王饮水记

当然这道题可以跑最小生成树。但是那样时间复杂度是O(nmα(n))O(nmα(n))O(nmα(n)),可以被卡掉。这里有一个跑不满O(nm)O(nm)O(nm)的就是每次拿到一条边,就搜索是否联通。不连通就加上去联通就找到最大的那条边,看看能不能替换,能换就换。代码实现:#include<cstdio>#include<cstring>#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,

2020-10-05 14:40:59 58

原创 luogu P5459 [BJOI2016]回转寿司

题面传送门题目要求有多少个i,ji,ji,j使的l≤∑k=ijai≤rl\leq \sum\limits_{k=i}^{j}{a_i}\leq rl≤k=i∑j​ai​≤r用前缀和搞一下,变成l≤qj−qi−1≤rl\leq q_j-q_{i-1}\leq rl≤qj​−qi−1​≤r再变换一下,变成qj−r≤qi−1≤qj−lq_j-r\leq q_{i-1}\leq q_j-lqj​−r≤qi−1​≤qj​−l然后动态开点线段树或者平衡树一搞就好了。代码实现:#include<cstd

2020-08-27 22:12:32 137

原创 luogu P3313 [SDOI2014]旅行

题面传送门显然是树剖题目,关键是怎么维护不同宗教。对于每个宗教可以开一棵线段树,但是空间会爆。所以可以动态开点。代码实现:#include<cstdio>#include<cstring>#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,m,k,x,y,z,tot,root[100039],top[100039],d[100039],fa[100039],idea,id[100039],si

2020-08-27 22:06:52 75

原创 UVA11367 Full Tank?

题面传送门二维djdjdj考虑设di,jd_{i,j}di,j​为到达iii点,还有jjj升油的最小花费。那么可以拓展出两种状态,即加111升油或前往下一个城市。代码实现:#include<cstdio>#include<cstring>#include<queue>using namespace std;int n,m,k,x,y,z,d[1039][139],w[1039],cur;struct yyy{int to,w,z;}tmp;struc

2020-08-27 22:02:26 142

原创 luogu P1402 酒店之王

题面传送门一道二分图的题目。考虑将菜向客人,客人向房间连权值为111的边,但是这样会有重复计算。所以将客人拆成两个点,两点之间连权值为111的边,就可以达到限制流量的目的。代码实现:#include<cstdio>#include<cstring>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,st,t,nows,cur,no

2020-08-27 21:59:50 106

原创 CF1055F Tree and XOR

题面传送门这道题卡空间卡到了丧心病狂的程度。两点间路径可以转化为前缀异或值。对于一般的这样的题目,我们可以直接在一棵trietrietrie上分治,每次选更大的一边,时空复杂度都是O(nlogw)O(nlogw)O(nlogw)但是这道题卡空间,所以只能用滚动trietrietrie何为滚动trietrietrie?可以发现,这道题在某种意义上只有一次查询,即只遍历一遍这颗trietrietrie,所以我们只要保存上一层的节点即可。代码实现:#include<cstdio>#i

2020-08-27 21:56:31 115

原创 luogu P6787 「SWTR-6」Snow Mountain

题面传送门月赛中的简单题。考虑将原数列以能量排序,那么肯定是前一半匹配后一半最优。而匹配时优先取被覆盖次数最大的即可判断无解。但是有一种特殊情况,就是前一半全部指向一个点。那么把这个点特殊处理掉然后正常做即可。代码实现:#include<cstdio>#include<queue>#include<algorithm>#include<cstring>using namespace std;int n,m,k,x,y,z,in[1000

2020-08-24 22:05:29 185

原创 luogu P6786 「SWTR-6」GCDs & LCMs

题面传送门月赛中的简单题。考虑推一波式子。设g=gcd(bi,bj)g=gcd(b_i,b_j)g=gcd(bi​,bj​)那么原式就是bi+bj+g=bi×bjgb_i+b_j+g=\frac{b_i\times b_j}{g}bi​+bj​+g=gbi​×bj​​big+bjg+1=big×bjg\frac{b_i}{g}+\frac{b_j}{g}+1=\frac{b_i}{g}\times \frac{b_j}{g}gbi​​+gbj​​+1=gbi​​×gbj​​换元,设x=big,y

2020-08-24 22:02:44 133

原创 luogu P5236 【模板】静态仙人掌

题面传送门一道圆方树的板子题。对于每个点先让它连到环顶。那么他到环顶的距离就是从两边走的最小值。那么求两点间距离就可以考虑倍增了。但是最后要考虑特殊情况代码实现:#include<cstdio>#include<cstring>#define abs(x) ((x)>0?(x):-(x))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,xs,y,z,fa[10039][

2020-08-24 21:56:36 125

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除