摘要:首先我们可以二分一个答案时间T,这样就将最优性问题转化为了判定性问题。下面我们考虑对于已知的T的判定对于矩阵中所有的空点bfs一次,得出来每个点到门的距离,然后连接空点和每个能在t时间内到达的门一条边,容量为1,之后连接源和每个空点一条边,容量为1,门连接汇边,容量为t。判断最大流是否满流就好了。/**************************************************************Problem: 1189User: BLADEVILLanguage: PascalResult: AcceptedTime:24 msMemory:20080 kb****
阅读全文
摘要:比较裸,可以有好多的优化,比如根本没有删除的点没有加在树套树中的必要,预处理出来每个不会被删除的值可以减少不少时间,也可以写成树状数组套平衡树,都会快很多/**************************************************************Problem: 3295User: BLADEVILLanguage: PascalResult: AcceptedTime:11088 msMemory:52180 kb****************************************************************///By BLA
阅读全文
摘要:莫队算法,具体的可以看10年莫涛的论文。大题思路就是假设对于区间l,r我们有了一个答案,那么对于区间l,r+1,我们可以暴力的转移一个答案,那么对于区间l1,r1和区间l2,r2,需要暴力处理的部分就是|r1-r2|+|l1-l2|如果将l看成x,r看成r,得到的暴力部分就是manhattan距离那么我们将所有的询问,构成一张二维图,可以从一个点转移到另一个点,且总manhattan距离尽可能的小,所以可以建立一颗manhattan mst,这样的话就可以得到最优的转移,但是实际来说搞定一个manhattan mst需要的时间不小,我们可以不要最优解,将询问按l分块,只需要做到在每个块中尽可能
阅读全文
摘要:w[i,j]代表高度j,第i颗树的时候的最大值那么w[i,j]:=max(w[i,j+1],w[k,j+heigh])+sum[i,j];但是这样枚举是n^3的,我们发现转移的第二个选择w[k,j+heigh]与当前第I颗树没有关系,所以记录一个高度为H的时候时的最大值直接O(1)转移就行了我也不知道咋回事儿,pascal一直RE,一年前能A的代码现在还是RE,然后向管理员联系了下,他们说数据没有问题,还把数据发过来了,一共5个点,最后一个点的in竟然30MB。。。,挂接都挂不了。。。/******************************************************
阅读全文
摘要:大题思路就是分块,将n个数分成sqrt(n)个块,然后处理出一个w数组,w[i,j]代表第i个块到第j个块的答案那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了如果不在同一个块中,l,r区间中整块的部分可以直接由w数组得到答案然后多出来的部分暴力处理下出现次数,然后再预处理一个b数组,代表没个数出现的位置,且每个数都连续,那么我们可以二分的找出在多余部分出现的每个数在整区间内出现多少次,然后和多余部分出现的累加,判断奇偶更新答案看了lyd的题解,写的挺好(其实这个题就是他出的。。),然后我写的pascal,他的C++的代码30s+A了,我就TLE了。。。话说今儿LYD生日,然后S
阅读全文
摘要:首先将坐标系顺时针旋转45度,得到一个新的坐标系,这个坐标系对应的坐标的manhattan距离就是原图中的距离,然后快排,利用前缀和数组O(N)求所有的答案,然后找最小值就行了,总时间O(NlogN),今天体力不足,在此不再赘述。。。/**************************************************************Problem: 3170User: BLADEVILLanguage: PascalResult: AcceptedTime:860 msMemory:19756 kb***********************************
阅读全文
摘要:我们先二分一个答案,对于每个答案,先加一级公路,如果不够k直接break,然后再加二级公路,加的过程类似Kruskal。/**************************************************************Problem: 1196User: BLADEVILLanguage: PascalResult: AcceptedTime:444 msMemory:732 kb****************************************************************///By BLADEVILvarn, m, k :long
阅读全文
摘要:裸地平衡树,只需要用到find操作/**************************************************************Problem: 2761User: BLADEVILLanguage: PascalResult: AcceptedTime:1884 msMemory:1788 kb****************************************************************///By BLADEVILvartt, n :longint;tot, t :longint;left, right, size, key
阅读全文
摘要:和1045一模一样,找到这道题的时候还愣了下神,最后发现样例都是一样的,直接粘了1045的代码,具体题解看http://www.cnblogs.com/BLADEVIL/p/3468729.html/**************************************************************Problem: 3293User: BLADEVILLanguage: PascalResult: AcceptedTime:296 msMemory:15852 kb*****************************************************
阅读全文
摘要:我们可以对于消费和盈利的点建立二分图,开始答案为所有的盈利和,那么源向消费的点连边,流量为消费值,盈利向汇连边,流量为盈利值中间盈利对应的消费连边,流量为INF,那么我们求这张图的最小割,用开始的答案减去最小割就是答案,因为最小割的存在不是左面就是右面,割左面,代表建这条路,需要对应的消费,那么割右面代表不要这项盈利,那本来加进去的盈利应该减掉,所以可以这样更新答案。/**************************************************************Problem: 1497User: BLADEVILLanguage: PascalResult: A
阅读全文
摘要:我们直接暴力的深搜怎么切就行了,每一刀切的方案只有横着和竖着,横竖又分在几等分点切,因为要保证每个人的面积相同,所以比较好处理了,第几个几等分点就分给这边几刀。/**************************************************************Problem: 1024User: BLADEVILLanguage: PascalResult: AcceptedTime:608 msMemory:224 kb****************************************************************///By BLAD
阅读全文
摘要:首先预处理每个F点左右,下一共有多少个F点,然后对于每个为0的点(R),从这个点开始,一直到这个点下面第一个R点,这一区间中的min(左),min(右)更新答案。ps:我估计这道题数据有的格式不对,开始过不去,后来改了读入就能过了/**************************************************************Problem: 3039User: BLADEVILLanguage: PascalResult: AcceptedTime:808 msMemory:17252 kb*************************************
阅读全文
摘要:逆向思维,先将整张图以最后所有要求的点毁掉的状态建图,然后倒着加点就行了,用并查集维护连通块/**************************************************************Problem: 1015User: BLADEVILLanguage: PascalResult: AcceptedTime:2588 msMemory:16340 kb****************************************************************///By BLADEVILvarn, m, k :longint;flag :a
阅读全文
摘要:我们可以贪心的分析,每个点的入度如果是0,那么这个点不可能被用来更新答案,那么我们每次找入度为0的点,将他去掉,如果他连的点没有被更新过答案,那么更新答案,去掉该点,环的时候最后处理就行了/**************************************************************Problem: 3037User: BLADEVILLanguage: PascalResult: AcceptedTime:1672 msMemory:12920 kb*********************************************************
阅读全文
摘要:具体可以见漆子超的论文/**************************************************************Problem: 2599User: BLADEVILLanguage: PascalResult: AcceptedTime:16052 msMemory:16928 kb****************************************************************///By BLADEVILvarn, m :longint;pre, other, len :array[0..400010] of longint
阅读全文
摘要:我们按照询问的右端点排序,然后对于每一个位置,记录同颜色上一个出现的位置,每次将上上位置出现的+1,上次出现的-1,然后用树状数组维护就好了/**************************************************************Problem: 2743User: BLADEVILLanguage: PascalResult: AcceptedTime:11072 msMemory:70540 kb****************************************************************///By BLADEVILva
阅读全文
摘要:用树套树来解决这个问题,存储每个节点的数值是多少,然后交换对于答案的变更可以讨论下,假设交换的是x,y位置的数xb_size[b_right[t]] thenright_rotate(t) elseif b_size[b_right[b_left[t]]]>b_size[b_right[t]] thenbeginleft_rotate(b_left[t]);right_rotate(t);end else exit; end elsebeginif b_size[b_right[b_right[t]]]>b_size[b_left[t]] thenleft_rotate(t) el
阅读全文
摘要:每个格拆成两个点,出点连能到的点的入点,如果是箭头指向方向费用就是0,要不就是1,源点连所有出点,所有入点连汇点,然后费用流/**************************************************************Problem: 3171User: BLADEVILLanguage: PascalResult: AcceptedTime:32 msMemory:1180 kb****************************************************************///By BLADEVILvarn, m :longi
阅读全文
摘要:首先我们知道,对于所有种情况,我们可以将每一位可以放的数的值加起来,所有位置的乘起来,等于的就是最后的答案,具体为什么正确,可以根据乘法分配律来想一想。那么对于所有不做要求的,快速幂直接算就行了,然后快排下,就知道每个位置不放那些值,减掉后乘进去就行了。/************************************************************** Problem: 2751 User: BLADEVIL Language: Pascal Result: Accepted Time:344 ms Memory:1008 kb**...
阅读全文
摘要:首先对于答案ΣΣ(n mod i)*(m mod j) ij也就是Σ(n mod i)Σ(m mod j)-Σ(n mod i)(m mod i)将mod展开,我们可以得到有floor的式子,对于这种式子,我们可以利用分段的思想,将O(N)的简化为sqrt(n)的/************************************************************** Problem: 2956 User: BLADEVIL Language: Pascal Result: Accepted Time:388 ms Memory:224 ...
阅读全文
摘要:我们根据欧几里得定理可以知道(a,b)=(b,a mod b)也可以得到(a+b,b)=(b,(a+b) mod b)=(b,a)=(a,b)直观点说就是两个数a,b的gcd,和a+b,b的gcd是相等的那么我们可以知道phi(m!)也就是与1-m!中与m!互质的数,那么对于每个互质的数,我们加上m!,就可以得到一个新的和m!互质的数,所以对于每个1-m!与m!互质的数n!范围内一共可以得到n!/m!组解,那么一共也就是phi(m!)*(n!/m!)可以将phi(m!)用公式展开化简,在此不再赘述/************************************************
阅读全文
摘要:我们知道,对于每一行来说,交换行,是不改变这行的状态的,交换列只是改变颜色的顺序,对于颜色的个数也没有改变,列也同样存在这一性质那么最后我们要求的是主对角线上都是黑色,也就是每行选一个黑色的,且任意两行选的黑色的不在同一列,我们构造一张二分图,图的一边是行,另一边是列,所以对于每个黑点连边,二分图匹配即可//By BLADEVILvar t :longint; i :longint; pre, other :...
阅读全文
摘要:我们可以先DP预处理出W[I]代表买I的东西,每种钞票的个数不做限制的方案数,那么对于每一组数据的限制,我们可以知道W[S-C[I]*(D[I]+1)]C为面值,D为数量,这个代表第I种钞票一定超了的方案数,那么假设我们用二进制来表示对于四种钞票的限制情况0000表示都不限制,1000代表第一种必须用超,其余没有限制我们要求的是都限制的请款那么根据容斥原理,我们可以知道答案是都不限制的-有奇数个1的情况+偶数个1的情况dfs处理16种情况就好了/**************************************************************Problem: 1042
阅读全文
摘要:我们根据能否看见建图,有向图边权设成1,然后我们转成无向图,对于每条有向边连一条反边,边权是-1,然后从每个块中任意一个点开始dfs,每个点有一个值,经过一条边到另一个点之后,用原来的点值和边权更新新的点的点值,那么如果我们访问到了一个原来已经走过的点,那么我们找到了一个环(可能是非环,就是一个点出两条有向边,然后又交在一点了),由于数据是合法的,所以这样的非环的现在应该更新成的点值和原有的点值相等,如果不相等的话,取差值的绝对值,就是这个环的长度。那么我们对于所有块,每个块的环的长度都是种类数的倍数,所以取gcd就好了还有一种情况就是没有环,全都是以链的形式存在的,对于这种形式,我们每个块染
阅读全文
摘要:将每个石柱拆成两个点,分别是进入的和出去的,两个点之间连石柱的高度然后每个出去的点连别的石柱的进去的点,源点连所有蜥蜴所在柱子,每个能跳出去的连汇点,然后最大流就行了/**************************************************************Problem: 1066User: BLADEVILLanguage: PascalResult: AcceptedTime:48 msMemory:2748 kb****************************************************************///By B
阅读全文
摘要:比较裸源点连人,每个人连自己的工作,工作连汇,然后因为人的费用是分度的,且是随工作数非降的,所以我们拆边,源点连到每个人s+1条边容量是每段的件数,费用是愤怒/**************************************************************Problem: 2245User: BLADEVILLanguage: PascalResult: AcceptedTime:1532 msMemory:8048 kb****************************************************************///By BLA
阅读全文
摘要:首先因为N很大,我们几乎不能筛任何东西那么考虑设s(p)为 gcd(i,n)=p 的个数,显然p|n的时候才有意义因为i与n的gcd肯定是n的因数,所以那么可得ans=Σ(p*s(p))那么对于s(p),我们有gcd(i,n)=p即gcd(i/p,n/p)=1,也即phi(n/p)所以枚举因数求phi就好了/**************************************************************Problem: 2705User: BLADEVILLanguage: PascalResult: AcceptedTime:12 msMemory:228 kb*
阅读全文
摘要:类似于2820,贴上内个题的题解吧 http://www.cnblogs.com/BLADEVIL/p/3486834.html另:强制转int64比普通int64运算快好多,本来TLE了,改了就A了。。。/**************************************************************Problem: 2301User: BLADEVILLanguage: PascalResult: AcceptedTime:34964 msMemory:1204 kb************************************************
阅读全文
摘要:我们发现对于一个点(x,y),与(0,0)连线上的点数是gcd(x,y)-1那么这个点的答案就是2*gcd(x,y)-1,那么最后的答案就是所有点的gcd值*2-n*m,那么问题转化成了求每个点的gcd值的Σ也即:Σim then swap(n,m);phi[1]:=1;for i:=2 to n dobeginif mindiv[i]=0 thenbegininc(prime[0]);prime[prime[0]]:=i;mindiv[i]:=i;phi[i]:=i-1;end;for j:=1 to prime[0] dobeginif i*prime[j]>m then break
阅读全文
摘要:学了一晚上mobius,终于A了一道了。。。。假设枚举到i,质数枚举到p(程序里的prime[j]),要更新A=i*p的信息。1.p|i 这时A的素数分解式中,p这一项的次数>=2。考虑g(A)的求和式:如果枚举的质数p'不等于p,A/p'就也会有p这一项,次数>=2,这时候miu(A/p')=0如果枚举的质数p'=p,A/p=i,这一项就是miu(i)因此g(A)=miu(i)2.p!|i(即i%p!=0)这时候A比i多一个质因子p,对miu(i)分情况讨论。2.1miu(i)==0(即i有大于1次的项)这时A除去任何一个p'都会留下i的那
阅读全文
摘要:设w[i]为1-i中gcd(i,j)=1的数对数,那么w[i]:=2*Σphi[i]+1,欧拉函数线性生成就行了然后ans=Σw[n/prime[i]]是比较显然的事。。/**************************************************************Problem: 2818User: BLADEVILLanguage: PascalResult: AcceptedTime:2672 msMemory:156476 kb****************************************************************/
阅读全文
摘要:首先考虑(0, 0)到(p, q)这条直线。y=q/p*x。sum{k=0to(p-1)/2}[q/p*k] 就是直线下方的点数。sum{k=0to(q-1)/2}[p/q*k] 就是直线左方的点数。如果gcd(p,q)=1的话,这条直线上没有整点,所以不会重复计算。相等的时候的数恰好是p*q矩形的1/4。答案当然是(p-1)*(q-1)/4。//转自叉姐的话。。/**************************************************************Problem: 2659User: BLADEVILLanguage: PascalResult: Acc
阅读全文
摘要:问题转化成求C(N,M) mod P p为非素数,那么我们可以将P分解质因数,也就是 π pi^ci的形式,因为这些pi^ci是互质的,所以我们可以用crt将他们合并那么问题就转化成了快速求C(N,M) mod pi^ci那么我们看下c的形式,为N!/(M!(N-M)!) mod pi^ci因为mod的数不是质数,所以分母没法正常求逆元,那么我们可以将分子分母中的pi的值挑出,那么我们先求N!,可以发现,N!mod pi^ci可以分段,每段是pi^ci长,这一段的值是0--(pi^ci-1),那么因为我们需要将N!中pi|I的挑出来剩下一些数,那就是好几段这个数相乘,用快速幂解决就行了,设cn
阅读全文
摘要:首先假设输入的是n,m我们就是要求m^(Σ(c(n,i) i|n)) mod p那么根据费马小定理,上式等于m^(Σ(c(n,i) i|n) mod (p-1)) mod p那么问题的关键就是求Σ(c(n,i) i|n) mod (p-1)了那么如果P是素数的话,我们可以用lucas定理来快速求出来组合数,这道题的p-1是非素数,那么我们分解质因数pi,假设c(n,i) i|n为X,那我们求出来X mod pi=ai,这个是符合lucas定理的,那么我们可以得到质因子数个式子(本题有4个质因子),然后我们用中国剩余定理合并这4个式子就行了/***************************
阅读全文
摘要:详见BYV的博客,写的非常全面https://www.byvoid.com/blog/noi-2008-employee/**************************************************************Problem: 1061User: BLADEVILLanguage: PascalResult: AcceptedTime:1496 msMemory:1028 kb****************************************************************///By BLADEVILvarn, m :longi
阅读全文
摘要:首先我们可以将这张图转化为一棵树,其中可能有好多环,肯定是从1走到N,其中可能经过好多环,因为我们不走N在的一支,最后还是会走回来,因为a xor b xor b=a,所以相当于没走,就是走了个环,那么我们这个题可以转化成有若干个环的值,还有1-n的值,在环中全任意个,xor起来再xor 1-n的,使最后最大。求环的时候我们可以记下每个点的一个值,代表从1到这个点的路径值xor,用size表示(我英语不好。。。)那么我们做一遍dfs,如果X访问到已经走过的点P了,那么就出现了环,环中的值就是SIZE[p] xor size[x] xor len[q]这样我们就得到了环的值。这里的环不一定是所有
阅读全文
摘要:我们用dis[i,j]代表到i这个点,用j张票的最短路程,那么我们只需要在SPFA更新的时候,用dis[i,j]更新dis[p,j]和dis[p,j+1]就行了/**************************************************************Problem: 2662User: BLADEVILLanguage: PascalResult: AcceptedTime:4 msMemory:376 kb****************************************************************///By BLADEV
阅读全文
摘要:我们用DP来解决这个问题W[I,J]表示准考证的第I位,和不吉利的数匹配到了第J位的方案数,这个状态的表示也可以看成当前到第I位了,准考证的后J位是不吉利的数的前J位,的方案数那么我们最后的ans=ΣW[N,I] 0s[j+1]) and (j0) do j:=pre[j];if s[i]=s[j+1] thenbegininc(j);pre[i]:=j;end;end;for i:=0 to m-1 dofor j:=0 to 9 dobeginstr(j,c);k:=i;while (s[k+1]c) and (k0) do k:=pre[k];if s[k+1]=c then inc(k
阅读全文
摘要:首先我们有一颗树每个点(或者边)有权值,我们要做的就是询问两个点之间路径上各点(边)权值的最大、最小,权值和(就是线段树能干的),然后我们还要支持在线更改任意节点(边)的权值。 我们要做的是轻重链剖分,首先我们看几个定义 size:和SBT里的一样,size[i]为以该点为根节点的子树一共有几个节点。 重儿子:一个节点当不为叶子节点的时候有且只有一个重儿子,重儿子为该点的儿子中size最大的,有多个最大时任选一个。 重链:由根节点开始,每个点每次都访问自己的重儿子,一直访问到叶子节点,就组成了一条重链 那么对于一个点的非重儿子来说,以他为根节点,可以重新访问出一条重链 如图所示...
阅读全文
摘要:对于二分图,我们可以用匈牙利来求出来最大匹配,但是如果给定每条边一个权值,我们要求这张图的最大匹配最大(小)权,单纯的用匈牙利就没法解决了,当然用费用流也可以做,但是代码较长,在处理完全二分图的时候时间也较长。 我们这时引入一个新的算法,就是KM。 对于KM算法,我们引入顶标概念,规定每个点都有顶标,且左面的点(二分图的左右)的顶标设成X[I],右面的设成Y[I],w[i,j]代表i-->j这条边的权值(我们这里求最大权值和),那么满足对于任意边,x[i]+y[j]>=w[i,j],那么,我们最后肯定可以找到一种匹配方式(完备匹配),使得这种方式中的每一条边都满足x[i]+y[j]
阅读全文
摘要:我们可以先将无根树变成有根树,随便选一个点当根就行了,我们选1,bfs求出来每个点的size值,代表以它为根节点的子树中有多少个节点,(dfs可能会爆栈),然后再对于每一条边算就好了我tle了,也不知道咋会事儿,可能是pascal的int64的运算有些耗时。。。。/************************************************************** Problem: 2435 User: BLADEVIL Language: Pascal Result: Time_Limit_Exceed*********************...
阅读全文
摘要:首先我们可以将这道题看成一个数轴,数轴其中的某些点存在一些颜色,我们要选取最短的一段,使这段存在所有颜色,那么我们使用指针i,j表示在j-i位置中包含的颜色,那么初值是0,0,我们先i++,同时添加i位置的颜色,直到j-i中存在所有颜色,然后j++,同时删除颜色,直到不存在所有颜色,然后更新答案,重复这过程,因为i,j只增不减,所以是o(n)的,但是要离散化,还是nlogn的,也算是贪心吧/************************************************************** Problem: 1293 User: BLADEVIL La...
阅读全文
摘要:这道题根据群论的基础知识,我们可以转化成将n拆分成若干数,求这些数的lcm的方案数先筛下素数表prime那么我们可以用DP来解决这个问题,用W[I,J]代表I这个数,拆成若干个数,其中质因数最大的不超过prime[j]的方案数那么我们可以得到转移W[I,J]:=W[I,J-1]+ΣW[I-prime[j]^k,j-1] (I>=prime[j])/**************************************************************Problem: 1025User: BLADEVILLanguage: PascalResult: AcceptedT
阅读全文
摘要:我们可以把一件装备看成一条边,两个属性看成两个点,那么这就相当于读入了一张图当读入每一个x,y时,我们找到两个点的祖先节点,fx,fy,我们保证祖先节点在该连通块中编号(装备属性)最大,用flag数组记录能否过第I关,那么两种情况fx=fy 这种情况就是加入这条边之后,图中成了一个环(可能这个环之前就存在),那么对于 一个环,假设是1-x节点的环,我们肯定可以全选择(题目中的选择),之前假设是一颗树 的话,X个节点,我们可以选择x-1个,也就是只有一个点选不了,我们肯定让最大的 点没法选,所以除了祖先以外应该全都是true,那么加上这条边之后,祖先也可以选了,所以 将祖先也就是fla...
阅读全文
摘要:我们可以发现所有的情况(除n=1时),都可以找到两个交叉的直线,就是第一层的那两个线段所在的直线如图中左那么我们以这个为准,两边对称着加直线,会得到右图,每一层是折线,且每加一对儿就多两条线段,一共要加k对儿,所以答案是2*k,由于图是对称的,就是这张图从上往下看和从下网上看是对称的,所以上面第k个是下面第n-k+1个,所以比较下这两个大小,k取min然后输出2*k就行了/**************************************************************Problem: 1432User: BLADEVILLanguage: PascalResult:
阅读全文
摘要:题的大概意思就是给定一个无向图,边有权值,现在你有k个人在0点,要求走到n点,且满足1:人们可以分头行动,可以停在某一点不走了2:当你走到x时,前x-1个点必须全部走过(不同的人走过也行,即分两路走,其中一路走过1-x-1点,另一路可以走x点)3:道路可以多次走,点在满足2的情况下可以多次经过求所有人走过的总路程最短这道题历尽挫折。。。首先我们知道想要走到x点,一定是从前x-1个点走过来,假设我们从y走过来,yb then min:=b else min:=a;end; procedure connect(a,b,c,d:longint);begin inc(l); pre...
阅读全文
摘要:首先对于矩阵乘法的功能有很多,记得有篇论文叫矩阵乘法在信息学竞赛中的应用,里面详细介绍了矩阵的作用其中一个就是求图的固定时间方案数,也就是给定一张图,每两个点之间由一条边长为1的边相连,求任意两点之间的路径和为x的方案数论文很详细,这里只做简要的说明对于矩阵乘法,具体代码为for i:=1 to n do for j:=1 to n do for k:=1 to n do a[i,j]:=a[i,j]+b[i,k]*c[k,j];那么如果b矩阵,b[i,j]代表I到J,路径长为x的方案数,c[i,j]代表I到J,路径长为Y的方案数,那么k相当于中转点c[i,j]...
阅读全文
摘要:首先明确一个概念左面内个叫上凸壳,右面那个叫下凸壳然后我们只需要维护一个上图壳就行了,先按着斜率排序,每次加进来一条边,判断tot边和这个边与tot-1边的交点横坐标,如果这条边的横坐标小就一直弹栈就好了/**************************************************************Problem: 1007User: BLADEVILLanguage: PascalResult: AcceptedTime:360 msMemory:3352 kb***************************************************
阅读全文
摘要:应该比较好看出来是费用流,那么就考虑怎么构图首先我们把一天拆成两个点,XI,YI,分别代表这一天买了多少和洗多少,再加入源和汇S,T1.每一天我们可以买新的毛巾,所以连接一条从S到XI的边,流量为正无穷(因为可以买好多),费用为f2.然后我们对于买来的毛巾可以洗,每天都产生need[i]的毛巾可以洗,那么连一条从S到YI的边,流量为need[i],费用为0(因为只决定要洗,没有确定洗的方案,所以先不算费用)3.每一条要用a方法洗的毛巾,我们连一条从YI到X(I+a+1)的边,流量为正无穷(下文解释),费用为fa的4.每一条要用b方法洗的毛巾,我们连一条从YI到X(I+b+1)的边,流量为正无穷
阅读全文
摘要:裸地匈牙利或者最大流,直接匹配就行了需要注意的是(我就没注意细节WA了好多次。。。)每个人和自己之间的边是0,但是应该是1不是在校生是没有床的。。。。/**************************************************************Problem: 1433User: BLADEVILLanguage: PascalResult: AcceptedTime:84 msMemory:268 kb****************************************************************///By BLADEVILva
阅读全文
摘要:首先我们知道,正方形内个是对称的,关于y=x对称,所以只需要算出来一半的人数然后乘2+1就行了,+1是(1,1)这个点开始我先想的递推那么我们对于一半的三角形,一列一列的看,假设已经求好了第I-1列的,那么第I列加上之后,不会影响前I-1列能看见的人,那么第I列一共加上I个人,设坐标是(I,Y),我们可以发现如果gcd(I,Y)1的时候这个点是看不见的,因为横纵坐标存在约数,也就是前面有一个整点点和这个点还有原点在同一直线上(三角形相似),那么我们要找第I列I,Y互质的点,也就是和I互质的点的个数,也就是phi(i),那么就不用递推了,我们每个I都要累加phi,也就是生成1-n-1的欧拉函数表
阅读全文
摘要:内个我也不知道哪儿不对,TLE了,说说思路吧其实思路也没什么说的,就是裸的splay,对于最后一个操作我们记下每个区间的最长前缀,最长后缀,那么最长子序列就是前缀,后缀,左子树的后缀+右子树的前缀+自己的值,里取max就行了更新的时候前缀由左子树的前缀,左子树sum+右子树前缀转移靠!!!!!!到底哪儿错了!!!!!TLE 你妹啊!!!!!/************************************************************** Problem: 1500 User: BLADEVIL Language: Pascal Result:...
阅读全文
摘要:首先我们假设平均数为ave那么对于第1个人,我们假设他给第N个人K个糖果,第2个人给1,第3个人给2,第n个人给第n-1个人那么对于第1个人给完n,第2个人给完1,第一个人不会再改变糖果数了,所以应该是ave那么第一个人原来是a1,给n之后是a1-k,代价是k,第2个人给1,使1的糖果数是ave,所以应该给ave-a1+k个,代价是abs(ave+k-a1)=abs(a1-k-ave),那么第2个人变成了a2+a1-k-ave个第3个人需要给2个人ave-a2-a1+k+ave=2*ave-a1-a2+k个,那么代价是abs(2*ave-a1-a2+k)=abs(a1+a2-k-2*ave),
阅读全文
摘要:裸的线段树,注意标签下放就行了多么痛的领悟,一定要开int64/************************************************************** Problem: 1798 User: BLADEVIL Language: Pascal Result: Accepted Time:24168 ms Memory:11948 kb****************************************************************/ //By BLADEVILtype rec ...
阅读全文
摘要:我们根据高度建图,将无向边转化为有向边首先对于第一问,直接一个bfs搞定,得到ans1然后第二问,我们就相当于要求找到一颗最小生成树,满足相对来说深度小的高度大,也就是要以高度为优先级假设现在有一种添边的方案(一共添ans1-1条,类似于Kruskal的过程)那么对于添边,我们可以看做是现有一颗树,通过连接一条边将一个点加入到树里的过程那么对于添加一个点,假设有一种方案先加入X,然后加入Y,HIGH[X]Y,说的是Y点)的高度为第一关键字,边长为第二关键字就好了。后来看了网上别人的思路,上面我写的加边的那一部分,可以通过prim来理解,prim就是现在有一个点的集合然后在剩下的点里找到距离集合
阅读全文
摘要:先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心。。。。。首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有,但是能给我们一个思路的启发我们先考虑没有修改,只有区间询问内个我下面的糖果是画笔的意思。。。我也不知道咋着题就读错了。。。。那么对于一个糖果i,假设他的颜色是col,那么我们找到col颜色上一次出现的位置,为color[i],那么对于一个区间L R里的color值,我们要找不同的颜色,那么假设一种颜色在L R里出现多次那么这些糖果的color值除了最先出现的以外,剩下的color值都大于等于L,也就是我们要找在区间
阅读全文
摘要:裸平衡树,恢复手感用的//By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, left, right :array[0..50010] of longint; ft :longint; a, b :lo...
阅读全文
摘要:挺好想的,就是一直没调过,我也不知道哪儿的错,对拍也拍了,因为数据范围小,都快手动对拍了也不知道哪儿错了。。。。我们定义w[i]代表深度1) do delete(mul,1,1);end; function mi(x:ansistring):ansistring;var p :longint; ans, sum :ansistring;begin ans:='1'; sum:=x; p:=n; while p0 do begin if p mod 2...
阅读全文
摘要:就根据题目中给的约束条件建图就行了需要注意的是,我们要做的是最长路,因为需要约束每个点都是大于0那么可以建一个超级源指向所有点,超级源的dis是1,边长为0那么这样做最长路就可以了好了我们这么写完了,之后发现re了,然后改大了点数组发现tle了。。。。然后我也不知道怎么改,超级源连接所有点的时候,是for i:=1 to n do 的,这样建完图之后,再做spfa相当于直接将n-1的点放入队列中,然后我改了下连接的时候for i:=n downto 1 do 那么相当于将1-n放入队列中,然后这样就A了,但是内存太大(之前RE开的),后来干脆把超级源去掉,直接将1-n放入队列,就可以直接A了P
阅读全文
摘要:首先来说是splay是二叉搜索树,它可以说是线段树和SBT的综合,更可以解决一些二者解决不了的问题,splay几乎所有的操作都是由splay这一操作完成的,在介绍这一操作前我们先介绍几个概念和定义 二叉搜索树,即BST(binary search tree),这样的树有一个关键字,满足对于每个...
阅读全文
摘要:本来想写2120的,结果想起来了这个我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母,第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色后面第一个和他相同颜色的位置然后扫询问,对于一个询问直接输出区间和,然后假设当前询问是l1,r1,下一询问是,l2,r2,我们把l1到l2区间内的每个位置颜色的后一颜色赋值成1,然后继续处理下个询问就好了。/************************************************************** Problem: 1878 User: BLADEVIL Language: Pas...
阅读全文
摘要:比较裸的树套树,对于区间K值bz上有一道裸题,详见题解http://www.cnblogs.com/BLADEVIL/p/3455336.html(其实题解也不是很详细)//By BLADEVILtype rec =record left, right, root :longint; end;var n, m :longint; a :array[0..100100] of longint;...
阅读全文
摘要:就是裸地splay,然后自己写的不是特别好,tle了,最近时间比较紧迫,有时间了改下,在此记录另附转载pascal AC代码最下面/************************************************************** Problem: 1861 User: BLADEVIL Language: Pascal Result: Time_Limit_Exceed****************************************************************/ //By BLADEVILconst ...
阅读全文
摘要:只需要做一遍匈牙利,只要有一个没法匹配上就break就行了/************************************************************** Problem: 1191 User: BLADEVIL Language: Pascal Result: Accepted Time:12 ms Memory:256 kb****************************************************************/ //By BLADEVILvar flag ...
阅读全文
摘要:首先对于结束时间排序,然后贪心就可以了,建立一个大根堆维护一个当前结束时间,每次扫描到一个房屋,如果当前结束时间+time[i]x do dec(j); if ilow then qs(low,j);end; procedure init;var i :longint;begin read(n); for i:=1 to n do read(time[i],fin[i]); qs(1,n);end; procedure up(x:longint);begin while (x>1) and (hea...
阅读全文
摘要:裸的splay今儿写的splay,由于自己刚开始学,发现几个容易漏掉的地方1:开始给所有的儿子赋值为-12:给max[-1]赋值为-maxlongint3:开始father[root]:=sroot4:在find和rotate中的push_down5:数组的下边界为-16:push_down中要给标签清空7:build中要给tree数组赋值8:rotate操作不熟悉由于不熟悉,发现的问题有很多,以后多加练习就好了/**************************************************************Problem: 3223User: BLADEVILLa
阅读全文
摘要:裸的splay,只需要注意 max[-1]:=-maxlongint 就行了,否则在update的时候子节点的max值会在max[-1]里选/**************************************************************Problem: 1251User: BLADEVILLanguage: PascalResult: AcceptedTime:16008 msMemory:3448 kb****************************************************************///By BLADEVILcon
阅读全文
摘要://By BLADEVIL#include #include #define inf 1bt; bt.insert(inf); bt.insert(-inf); scanf("%d",&n); for (int i=1;ib then min:=b else min:=a;end; procedure left_rotate(var t:longint);var k :longint;begin k:=right[t]; right[t]:=left[k]; left[k]:=t; size[k]:=s...
阅读全文
摘要:裸的平衡树,可以熟悉模板用,写题写不出来的时候可以A以下缓解下心情。/************************************************************** Problem: 3224 User: BLADEVIL Language: Pascal Result: Accepted Time:660 ms Memory:15852 kb****************************************************************/ //By BLADEVILvar n ...
阅读全文
摘要:对于这道题,我们看数据范围应该是费用流(起码我的第一反应是。。。)然后仔细想想发现可做,那么就开始构图对于第I个修理工,我们可以让他修好多辆车,那么假设一个人修了J辆车,在他修他修的第K辆车的时候,会让后面的j-k辆车的每个人多等他修k车的时间那么我们设每个人一共修了n辆车,他倒数第j个修的车的代价就是j*time(修这辆车的代价)那么我们就对于每个人拆点,拆成N个点,代表他倒数第J个修的哪个车,然后求最小费用最大流就行了数据范围开始看成60,60了,数组开的不合适,后来懒得改了。。。。/*****************************************************
阅读全文
摘要:我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案,查询每个二分到的mid在这个区间里的rank,然后就行了/************************************************************** Problem: 1901 User: BLADEVIL Language: Pascal Result: Accepted Time:3220 ms Memory:6592 kb********************************************************...
阅读全文