- 博客(191)
- 资源 (3)
- 收藏
- 关注
原创 《学chen_zhe叫》
我们一起学chen_zhe一起QAQAQchen_zhe面前撒个娇哎呦QAQAQ看见chen_zhe哇哇叫迷恋chen_zhe的坏笑我看见chen_zhe就要QAQ每天都需要你QAQ珍惜QAQ的每分每秒chen_zhe有多重要我想在座的都知道chen_zhe是洛谷男一号有时候chen_zhe像一只猫AK比赛无聊来撒撒娇chen_zhe是温柔的能把我的心融化掉我想要听...
2019-05-21 21:45:36
2781
7
原创 有趣的数
我们定义qsm函数是用来转进制的,枚举一下我们选的整数,从小到大枚举,然后用qsm把这个数转B1B2进制然后判断是否相等,每次取个min就行了,注意这里题目中虽然说是所有不超过101810^{18}1018但是在计算过程中是有可能爆long long的,这是要注意的#include<bits/stdc++.h>using namespace std;const long lo...
2019-04-25 14:07:40
314
原创 数
一开始的思路是:枚举每一个序列,并用sort找出最大值和最小值,然后相加正确的思路:使用区间 dp, fi,j 表示坐标被 [i, j] 完全包含 的区间最小值。则可以用暴力时候的思想,最大权值的区间需要单独的,且值为该权值的元素去消除。则枚举该元素的坐标 x, 则子问题变成了 fi,x−1, fx+1,j。因为跨过 x 的区间一定都会被打掉,因为我们使用的是最大权值。剩余的区间被 [i, ...
2019-03-29 21:51:21
217
原创 糖
带一点dp思想吧,每次看第i个小朋友的时候看一下给不给他要不要紧#include<bits/stdc++.h>using namespace std;int main(){ int n,m,a[100001]={0}; long long ans=0,sum=0; scanf("%d%d",&m,&n); for(int i=1;i<=n;i++...
2019-03-29 21:43:57
195
原创 吃
直接暴力枚举每次选的序号#include<bits/stdc++.h>using namespace std;const int maxn=100005;int A[maxn],B[maxn];int n;pair<int,int> ans;void check(int type){ int len=0; for(int i=1;i<=n;i+...
2019-03-29 21:35:18
167
原创 Domino
设f[i][j][k]为第i行状态为j用了k个骨牌覆盖到的最大权值注意这里可以有负数,而且这道题用贪心是不多对的(就是排个序取k*2个,应为你每次选的不一定是相邻的)#include<bits/stdc++.h>using namespace std;const int maxn=1005;int n,k;int A[maxn][3],dp[maxn][maxn][8];...
2019-03-18 20:56:36
126
原创 Trie
首先题目的名字都告诉你了这题是一道关于字典树的题目(我一开始就没用这个。。。所以GG了30分为什么要用trie树呢?Trie 的强大之处就在于它的时间复杂度。它的插入和查询时间复杂度都为 O(k) ,其中 k 为 key 的长度,与 Trie 中保存了多少个元素无关。Hash 表号称是 O(1) 的,但在计算 hash 的时候就肯定会是 O(k) ,而且还有碰撞之类的问题;Trie 的缺点...
2019-03-12 22:01:12
148
原创 图
做题的时候想到了:我们注意到一定会存在d1=0,dn=k。对于di>k的值,我们不关心它到底是多少,可以直接用k+1表示。对于2~n-1的点,我们也不需要它们具体的最短路是多少。我们只需要知道对于最短路是j的点的个数就可以了。这样我们就可以从小到大枚举所有点的最短路x,再枚举满足最短路是x的点的个数,并计算方案总数,但是没有打出来。只打了一个暴力最后WA了。后来看了题解后知道:因...
2019-03-12 21:16:07
171
原创 道路建造
我们注意到一定会存在d1=0,dn=k。对于di>k的值,我们不关心它到底是多少,可以直接用k+1表示。对于2~n-1的点,我们也不需要它们具体的最短路是多少。我们只需要知道对于最短路是j的点的个数就可以了。这样我们就可以从小到大枚举所有点的最短路x,再枚举满足最短路是x的点的个数,并计算方案总数,就可以啦。#include<bits/stdc++.h>using na...
2019-03-12 21:09:20
301
原创 倒水
应为看到题目上提到代价啊,数量啊,所以可以想到状压 DP , 设f[s] 表示当前还剩 s 集合的开水瓶的最小代价。每次用for循环枚举i的开水到j算出代价,然后选取最优的代价实际合并到j上去。这个式子就是普通的 f[i^(1<<j)]=min(f[i]+c[j][k],f[i^(1<<j)]);#include<bits/stdc++.h>using ...
2019-03-12 21:01:23
209
原创 矩阵
如果没有相同字符,每次选向下和向右中较小的方向走。如果有相同字符,我们可以枚举当前所有可能的位置,然后每次先算出答案中最小的字符是哪一个,然后用这个去更新所有可能的位置就行了。#include<bits/stdc++.h>using namespace std;int rd(){ int x=0; char c=getchar(); bool f=false; w...
2019-03-12 20:57:10
212
原创 Conference
这道题我一开始的思路是枚举这个i和当前是第k年(倒着枚举k),用b数组记录每个荷叶上青蛙分到的食物,如果当前的这个bkb_kbk是和i相等的那么就说明我们找到了满足条件且是最早的一年,如果一直枚举完都没有找到满足题意得则输出-1.时间复杂度为 O(n*aia_iai),超时。我们把所有的floor(a[k]/i)的所有取值区域都拿出来,把所有区域划分为111~10810^8108 ,这样...
2019-03-06 22:07:21
877
原创 B. Fight
这道题直接用一个比较暴力的算法枚举当前这个是否为同一阵营的人可以加一点并查集来寻找他们的祖先是否为同一阵营的人,然后判断1…ans中的边是否是一个二分图,#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;int n,m,fa[2*maxn];inline int find(int x){ r...
2019-03-03 23:20:02
251
原创 A. Gene
枚举起始位置,然后向后面贪心匹配,因为T是S的子串,所以从前往后以此判断当前的T[i]是否等于当前的S[i],如果不等则直接加上T[i]的代价加入除了当前字符以外的字符是没有意义的,如果相等则下一个。#include<bits/stdc++.h>using namespace std;const int maxn=10005;int dp[maxn][maxn/2];in...
2019-03-03 23:06:28
184
原创 Path
这道题需要建一个图,有点类似于第三题吧,建完图之后跑两遍dfsSR 最近在研究如何让他的树变得优美。他的树是一棵 n 个节点有根树,其中 1 号节点为根节点,其中每条边上有个权值 ex,y 。经过 SR 潜心的研究,他认为一棵优美的树需要满足从根节点出发到任意一个节点䐟径上的权值SR 励志要把自己的树变得更加优美。他拥有两种魔法,第一种魔法可以花费 1 的代价让任意一条边的权值 +1 ,...
2019-01-25 21:40:00
190
原创 Dist
这道题只要找到我们距离的规律就行了,我们可以发现,当行数小于列数时,列数=(列数-1)/k,否则,行数=(行数-1)/k,没记算一次我们的距离就会增加1,应为行数一减你就往下了一个,所以这个要加1.#include<bits/stdc++.h>#define i64 long longusing namespace std;i64 n;int k,q;i64 x,y;...
2019-01-25 20:33:17
1942
原创 And
这道题大暴力就行了我们枚举每一个空,并判断是不是满足题目的条件x i,j=Ai and Aj,就行了,如果是的话,就把他加入数组,如果不是就继续下一个#include<bits/stdc++.h>using namespace std;int n,x[1001][1001];int a[1001][1001];int ans[1001];int main(){ sc...
2019-01-25 20:19:36
133
原创 Scape
这道题是一个贪心题我们只需要看我们当前经过这家店是否要吃掉食物,吃掉食物是否划算,把我们认为我们需要吃掉的食物加到sum就行了#include<bits/stdc++.h>using namespace std;int n,c,w[1001];int sum,ans;int main(){ scanf("%d%d",&n,&c); for (int ...
2019-01-25 20:09:38
586
原创 Preorder
我的思路:对于每次询问把那条边删掉跑一遍最短路和原最短路比较一下就行了,O(qm log n)只有5分。。。2333正确的思路考虑S到T的最短路图,即所有dist(S,u)+dist(v,T)+w的边组成的有向图。这一定是一个有向无环图(DAG)。那么一个S到T的最短路是且仅是一条最短路图上S到T的路径。如果一条边不在最短路图上,则这条边删掉一定不会对最短路产生任何影响。如果一...
2019-01-18 22:59:20
1869
原创 Pacifist
我一开始的思路是:期望=总和/个数,所以枚举每种可能的竞赛图,Tarjan 求出强连通分量O(n^2 2^n(n-1)/2),时间复杂度超标正确的是设 a[i]表示 i 个点的强连通的竞赛图个数。枚举缩点+拓扑排序后最后一个新点包含的点数,可列出式子:将 a[n]移至左边,得到 a[n]递推式为:显然每个点是等价的。设每个点的点权为所在强连通分量大小对应的 d,则所有图权值的...
2019-01-18 22:02:44
292
原创 Protocol
考虑以 1 为根时,路径两个端点的 LCA 是谁。对于每个点,计算出它到子树内点期望距离的最大值 a[i]和子树内点到它期望距离的最大值 b[i]。假设 LCA 是 i,枚举起点在以 i 的哪一个孩子为根 的 子 树 内 , 设 是 j , 那 么 路 径 长 度 的 最 大 值 就 是b[j]+f[<j,i>]+max{a[k]+f[<i,k>]}(k 是 i 的孩...
2019-01-18 21:30:07
169
原创 Pendulum
b[(a[(xi+i)%m]+i/m)%m]=yi设 j 和 k 满足 yj=yk,则将两个方程合并得:b[(a[(xj+j)%m]+j/m)%m]=b[(a[(xk+k)%m]+k/m)%m]a[(xj+j)%m]+j/m≡a[(xk+k)%m]+k/m(mod m)a[(xj+j)%m]-a[(xk+k)%m]≡k/m-j/m(mod m)这样就将两个方程合并为 a[i]-a[j]≡k(...
2019-01-18 21:13:24
1584
原创 排序
类似倍增SA, 一轮把A[1,2], A[3,4], …, A[2^k-1 , 2^k]每两个数合并成为一个数使得串长减半, 减半k次就做完了具体怎么做?暴力就好了,主席树整个拔掉一层叶子aloga+blogb+clogc….=sumlogsum然后类似的一层一层把叶子拔光就行了,复杂度nlogn。#include<bits/stdc++.h>#define ll long ...
2019-01-17 18:04:28
169
原创 最小生成树
Boruvka’s Algorit给每个点先找一个最小的边染色一定是若干个树,每个树里有一个重边每个联通块缩点n至少/2做log次对这个问题套用Boruvka算法会变成什么?每个点有一个颜色,询问每个点和不同颜色的边权最小值同样用扫描线加线段树处理这个事情, 不过怎么处理不同颜色这个限制,记录最优值的时候顺便记录一个和最优值不同颜色的次优值时间复杂度nlog^2n, 要卡常#incl...
2019-01-17 17:46:16
203
原创 那棵树
这道题我一开始没有任何思路,后来看了题解后发现题目可以化解,就变成了求每个颜⾊的虚树⼤⼩虚树一开始听的时候觉得很高深,其实也是一个比较容易的东西。可以称它是个数据结构,也可以称它是个算法,反正比较好用啦~假设颜⾊为 c 的点按 dfs 序排序后为 p1,p2…pk那么这棵虚树的边数=(dis(p1,p2)+dis(p2,p3)+…dis(pk,p1))/2开 n 个 set 维护⼀...
2019-01-16 17:38:31
198
原创 那个序列
⼆分 c[i]=mid>b[i]Check ⼀下 c 剩下的和 b 剩下的,能不能达到 f(c,b)-1⼆分 c[i]=mid<=b[i]Check ⼀下 c 剩下的和 b 剩下的,能不能达到 f(c,b)考虑( b[i+1…n] 和剩下的 n-i+1个 a) 的最⼤的 f 值为 p排序后,肯定是 a 的最⼤的 p 个匹配 b 最⼩的 p 个考虑我们要选的 a 在不在...
2019-01-16 17:22:27
180
原创 字符串拼接
考虑 dp,f[i][c] 表示考虑了字符串前 i 个字符,当前结尾为c 的合法⼦序列个数假设第 i+1 个字符为 tf[i+1][c]=f[i][c]f[i+1][t]=( sum(f[i][c])-f[i][t] ) + (f[i][t])=sum(f[i][c])其他的记⼀个 g[i]=sum(f[i][c])转移就是:f[i+1][t]=g[i]g[i+1]=g[i]f[...
2019-01-16 17:16:33
123
原创 New Set
我的思路:因为题目中说是⾄少⼀个 Ai 能分离 (X,Y),我们容斥枚举⼀个 A 的集合S,然后计算能被 S 中每⼀个分离的 (X,Y) 的个数如何计算 (X,Y) 的对数呢,根据题⽬条件,A 能分离 (X,Y),当且仅当X,Y 中⼀个是 A 的⼦集,另⼀个跟 A 没有交我们在枚举 S 中每个 A 是 X 的超集还是 Y 的超集然后就可以⼤⼒统计了O(3^m*n),吼啊,20分...
2019-01-15 19:37:22
1390
原创 New Rank
相当于要对⼀个模 2 下的矩阵,求出每个位置取反后矩阵新的秩显然只修改⼀个位置的话秩只有可能+1,-1,不变分类讨论就行了,30分⾸先我们假设 A 是⾏⼤于列的我们把 A ⾼斯消元成最简形式,假设消完后是 BA显然rank(BA)=rank(A)且对 A(i,j) 取反相当于 BA 的第 j 列加上 B 的第 i 列还是分类讨论,100分#include&lt;bits/s...
2019-01-15 19:22:34
698
原创 New Order
实际上就是要维护,⼀个数放最左和最右的话要交换⼏次,a[i] 移动到最左边要交换的次数,就是左边⽐他⼤的数的个数⽤个树状数组维护⼀下注意 a[i] 相同的情况#include <cstdio>#include <iostream>using namespace std;typedef long long LL;const int N = 2e5 + 5;i...
2019-01-15 19:02:05
310
原创 Seq
s即是t的前缀也是t的后缀就意味着s是t的前缀,rev(s)是rev(t)的前缀(rev(s)就是s倒过来),于是用[(s[i], rev(s)[i]) for i=1…n]插进Trie里。在 Trie 上每个节点上维护一个 DP 值表示当前以这个节点为结尾的最长序列即可。#include <iostream>#include <algorithm>#define...
2019-01-15 18:20:07
281
原创 Chess
设第i行上所有车的权值异或和为Ai,第j列上所有车的权值异或和为Bj ,一个格子(i,j)是否被控制就是Ai xor Bj>0,即 Ai != Bj 。于是只要减去 Ai=Bj 的情况就行了。一个车的移动只会导致两个 Ai 和 Bj 的改变维护一下答案就行了。用map维护cntA[k]表示Ai=k的i有多少个。#include<bits/stdc++.h>#defin...
2019-01-15 18:06:13
593
原创 Seq
mean(A[l…r])>=P当且仅当sum[r]-sum[l-1]-(r-l+1)P>=0即(sum[r]-rP)-(sum[l-1]-(l-1)P)>=0。令 B[i]=sum[i]-iP ,即为求 B[r]>=Bl,即求B的逆序对个数。#include <iostream>#include <algorithm>#define int...
2019-01-14 22:36:55
411
原创 Part
从前往后扫,加进来一个数x的时候,如果当前有以x+1为结尾的序列就接过去,否则新开一个序列[x]。#include<bits/stdc++.h>using namespace std;const int MAXN=1e6+10;int read(){ int q=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if...
2019-01-14 21:38:50
150
原创 优美的串
50分:fi,S 表示长度为 i,按照 ABAB… 方式排列结尾情况为 S 的串的个数。S 记录当前串的结尾有连续多少个 A 或连续个多少个T。那 S 的状态数一共为 2n 个。对于 K ≤ 500 直接 dp,对于 K ≤ 109 矩乘 + 前缀和。100分:fi,SA,SB 记录长度为 i 的,所有以结尾为 A 子串的分割方式中最短的子串状态为 SA(若不存在以 A 结尾的...
2019-01-14 17:50:43
191
原创 优美的树
一开始的思路:设开始所有边权的权值的集合为 S,那必然存在一种最优解使得调整后的所有边的边权也在 S 集合中。O(n2) 40 分,时间复杂度最高是2*105*2 * 105,太高了正确的:ai 表示 i 号节点到 i 号父亲的边的权值。fi,j 代表到了以 i 为根的子树已经处理完毕,末端权值均不小于 j 的最小代价。gi,j 代表到了以 i 为根的子树已经处理完毕,且 i 节点...
2019-01-12 20:02:32
95
原创 优美的闪电
一开始的思路是:当前剩余权值最大的那个区间一定要被一发能量为该区间权值的导弹打掉,所以我们枚举该导弹击打位置,同时我们删除所有能被该导弹击打掉的区间,但是这只针对样例,对于题目的其他数据就是不成立的。正确的是使用区间 dp, fi,j 表示坐标被 [i, j] 完全包含 的区间最小需要花费的能量。则可以用暴力时候的思想,最大权值的区间需要一发单独的,且能量为该权值的导弹去消除。则枚举该...
2019-01-12 19:41:48
181
原创 简单MST
n=1时,显然答案与顺序无关。现在假设size<n的树的答案与顺序都无关,我们来证明size=n的树的答案与顺序无关。若根的儿子只有一个,那么得证。现假设根的儿子至少有两个。我们用ANS(x)表示只有根和根的儿子x以及x的子树的子问题的答案,即从根出发,巡游完x的子树并回到根的答案。我们用SZ(x)表示以x为根的子树的大小的两倍(即从根开始巡游x这个子树再回到根的天数)。我们假定...
2019-01-07 20:05:18
223
原创 简单函数
可以枚举每一个数,更新它的倍数,这个要是放到B的话,那原来的B放到哪里#include<bits/stdc++.h>using namespace std;const int maxn=1e7+10;long long a,b,f[maxn];long long s;int main(){ scanf("%d%d",&a,&b); for(long...
2019-01-07 19:57:34
113
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人