Luogu
11
*DDL_GzmBlog
再见锋芒,准备启程
展开
-
[luogu] AT2264 [AGC008B] Contiguous Repainting 前缀和
前言传送门 :题意给定nnn,kkk和一个a[]a[]a[]一开始这个数组都是白色的,我们可以令任意个连续的kkk区间进行染色,黑->白,白->黑最后使得黑色的格子和最大思路我们会发现 只有最后的那个长度为kkk的区间以外的所有格子,都是可以自由染色的因此我么可以两侧区间涂色,然后慢慢的往中间挪Mycodeconst int N = 1e5+10;int a[N],n,k;ll pre[N],suf[N],sum[N];void solve(){ cin>&g原创 2022-04-17 17:36:06 · 164 阅读 · 0 评论 -
[luogu] CF16E Fish 状态压缩+概率dp
前言传送门 :思路题目描述显然使用状态压缩表示每条鱼是否被吃,然后再使用概率dpdpdp计算即可状态表示 :dp[state]dp[state]dp[state] 表示当前statestatestate的存活概率状态转移 :dp[i]=dp[i∣(1<<j−1)]∗p[k][j]/(1.0∗(cnt+1)∗cnt/2.0)dp[i] = dp[i|(1<<j-1)]∗p[k][j]/(1.0∗(cnt+1)∗cnt/2.0)dp[i]=dp[i∣(1<<j−原创 2022-04-17 15:45:42 · 184 阅读 · 0 评论 -
[luogu]P1272 重建道路 树形dp+背包问题
前言传送门 :思路状态表示:f[u][k]f[u][k]f[u][k]表示以uuu为根的树中保留kkk个点需要删除的最小边数状态转移f[u][k]=min(f[u][k],f[u][j]+f[k−j]−2)f[u][k] = min(f[u][k],f[u][j]+f[k-j]-2)f[u][k]=min(f[u][k],f[u][j]+f[k−j]−2)显然我们可以将第二位想象成 背包问题来解决因为我们在f[u]=1f[u]=1f[u]=1的时候已经计算了一次111,第二次再计算f[x]f原创 2022-04-17 15:11:49 · 127 阅读 · 0 评论 -
[luogu] P5854 【模板】笛卡尔树 笛卡尔树
前言传送门介绍什么是笛卡尔树笛卡尔树是一种二叉树,每一个结点由一个键值二元组(k,w)(k,w)(k,w)构成。要求 kkk 满足二叉搜索树的性质,而 www 满足堆的性质。建树给定一个序列A[]A[]A[]我们考虑建立的树节点为(i,Ai)(i,A_i)(i,Ai)即iii对应kkk,AiA_iAi对应www因为kkk是数组下标,因此我们直接从左到右直接插入即可现在我们许哟啊维护的是满足二叉树的性质首先我们维护二叉树的性质,肯定每次都是往右链进行插入,但是同时我们还需要满足堆的性原创 2022-04-16 16:25:56 · 279 阅读 · 0 评论 -
[luogu] AT2060 [AGC005B] Minimum Sum 单调栈_乘法原理
前言传送门 :题意给定n,a[]n,a[]n,a[]求∑l=1N∑r=lNmin(al,al+1...ar)\sum_{l=1}^N\sum_{r=l}^Nmin(a_l,a_{l+1}...a_r)∑l=1N∑r=lNmin(al,al+1...ar)思路一开始想到线段树,但是还是避免不了第二层循环的优化因此考虑使用单调栈+乘法原理解决这种类型的题我们可以先预处理出来a[i]a[i]a[i]有效的区间[L,R][L,R][L,R]因此对于当前的a[i]a[i]a[i]所能提供的原创 2022-04-16 14:02:45 · 152 阅读 · 0 评论 -
[luogu] P1370 Charlie的云笔记序列 线性dp+离散化
前言传送门 :题意给定n,a[]n,a[]n,a[],对于a[l,r]={al....ar}a[l,r]=\{a_l....a_r\}a[l,r]={al....ar}定义Fl,r=a[l,r]中不同子序列的数量F_{l,r}=a[l,r]中不同子序列的数量Fl,r=a[l,r]中不同子序列的数量特别的 空串也算一种 (子序列不一定要连续求∑l=1n∑r=1nF[l,r]\sum_{l=1}^{n}\sum_{r=1}^{n}F[l,r]∑l=1n∑r=1nF[l,r]思路这种题我原创 2022-04-14 21:40:33 · 164 阅读 · 0 评论 -
[luogu] P3469 [POI2008]BLO-Blockade Tarjan判断割点
前言传送门 :思路对于当前删除的点, 如果这个点不是割点的话,那么这个点给出的贡献就是2∗(n−1)2*(n-1)2∗(n−1)否则如果是割点的话 ,删除这个点,整个图将会变成多个连通块因此对于每一个连通块的贡献又是sz[i]∗(n−sz[i])sz[i]*(n-sz[i])sz[i]∗(n−sz[i])因此计算即可 [判断割点传送门]Codeconst int N = 1e6+10;int n,m;int h[N],e[N*2],ne[N*2],idx;ll ans[N];int原创 2022-04-13 18:15:55 · 177 阅读 · 0 评论 -
[luogu] P2127 序列排序 思维题
前言传送门 :非常好的一个思维题题意给定a[],a[i]∈(0,1e9)a[],a[i]\in(0,1e9)a[],a[i]∈(0,1e9),每次你可以交换数组中的两个数,花费a[i]+a[j]a[i]+a[j]a[i]+a[j]问使得升序排序的最小花费思路一开始用树状数组写 ,TTT飞了,看到题解中竟然用并查集维护集合Orz例如 :32 3 1 显然,2和1交换一次,2再和3交换一次,我们会发现所有的操作构成了一个环因此刚刚那个操作可以的贡献如下 :(sz[i]−1)∗minn原创 2022-04-07 21:38:53 · 167 阅读 · 0 评论 -
[luogu] CF455A Boredom 值域dp
前言传送门 :思路值域动态规划Mycode// Problem: CF455A Boredom// Contest: Luogu// URL: https://www.luogu.com.cn/problem/CF455A// Memory Limit: 250 MB// Time Limit: 1000 ms// // Powered by CP Editor (https://cpeditor.org)#include <iostream>#include <原创 2022-04-04 17:51:40 · 448 阅读 · 0 评论 -
[luogu] P1269 信号放大器 树形结构+贪心
前言传送门 :思路一开始考虑是从哪个节点开始跑 , 结果没跑出来仔细考虑一下,发现从哪个节点开始其实不重要 , 我们其实可以从叶子节点走到根节点记录一下所走的距离,如果走的距离大于了当前的kkk,那么ans++ans++ans++并且重置一下当前节点的disdisdis即可Mycodeconst int N = 2e4+10;struct node{ int to,val;};vector<node> g[N];int n,k;int total[N];int ans原创 2022-04-04 16:05:00 · 259 阅读 · 1 评论 -
[luogu] P1858 多人背包 01背包求前k优解
前言传送门 :思路状态表示f[i][j][k]f[i][j][k]f[i][j][k]表示从前iii个 物品里面选,体积是jjj的第kkk优解状态计算 :f[j][k]=max(dp[j−1][k],dp[j−v][k]+v)f[j][k] = max(dp[j-1][k],dp[j-v][k]+v)f[j][k]=max(dp[j−1][k],dp[j−v][k]+v)f[j][k]=max(dp[j][1...k])f[j][k] =max(dp[j][1...k])f[j][k]=max(原创 2022-04-04 14:43:01 · 172 阅读 · 0 评论 -
[luogu] P1682 过家家 并查集
前言传送门 :并查集过程不怎么难,难的是如果处理两个集合之间的关系就是普通的并查集也没带权什么的思路题意大致看完之后,会发现其实我们需要维护的是所有集合之中含有最少男孩的数量+k但是我们怎么样维护 一个集合中既有男孩又有女孩的数量呢 ,我们不妨尝试使用vis[x][y]vis[x][y]vis[x][y]表示男孩xxx,女孩yyy,在合并的时候虽然男孩和女孩节点名字相同但是我们任然可以直接合并,因为在我们计算的时候,我们只是使用女孩的而已其实这题还是挺简单的(bushi但是我选择的是原创 2022-03-30 17:16:42 · 251 阅读 · 0 评论 -
[luogu] CF342A Xenia and Divisors 数学+思维
前言传送门 :思路这题是在nnn个<=7<=7<=7的数中,找到n/3n/3n/3个三元组使得 a<b<c&&a∣b,b∣ca<b<c \&\& a|b,b|ca<b<c&&a∣b,b∣c首先这题第一个思维难点就是,模拟出只有三种方案满足该条件第二个思维难点就是 如果有 5,75,75,7 那么就无解,因为问题转为在没有5,75,75,7的数中找到nnn个数Mycodeint dp[7];原创 2022-03-19 11:39:12 · 207 阅读 · 0 评论 -
[luogu] CF243A The Brand New Function 或二进制,剪枝暴力
前言传送门:思路题意 : 给你一个数组,询问有多少个区间[l,r]或出来的值,不同于给的值本来看上区间问题就没想到使用暴力的,而是想到了线性基但是没想到还是可以使用暴力过的而且我们可以使用a[j]∣a[i]=a[j]a[j]|a[i] = a[j]a[j]∣a[i]=a[j] 剪枝这样子在我们倒序枚举jjj的时候,如果出现了这个既能保证不出现又可以保证…Mycode'const int N = 1e6+10;int a[N];void solve(){ int n;cin&g原创 2022-03-18 17:07:55 · 1734 阅读 · 0 评论 -
[luogu]CF191A Dynasty Puzzles dp
前言传送门 :思路字符串拼接 首尾相连 问最大长度直接dpMycode// Problem: CF191A Dynasty Puzzles// Contest: Luogu// URL: https://www.luogu.com.cn/problem/CF191A// Memory Limit: 250 MB// Time Limit: 2000 ms// // Powered by CP Editor (https://cpeditor.org)//��һ�δ��Ϻ�վ֮��原创 2022-03-17 14:33:52 · 173 阅读 · 0 评论 -
[luogu] CF128A Statues dfs
前言传送门 :思路本题和普通的图论问题 就多一个会下落的因素因为石头最多掉落8层, 因此我们考虑使用dfsdfsdfs进行操作对于每次移动 需要判断头上是否有石头掉下来,然后即可Mycodeconst int N = 9;char g[N][N];int st[N][N];int sx = 0 , sy = 0 ; int dx[9]={-1,-1,-1,0,0,0,1,1,1};int dy[9]={-1,0,1,-1,0,1,-1,0,1};int dfs(int s原创 2022-03-16 12:37:38 · 361 阅读 · 0 评论 -
[luogu] CF56B Spoilt Permutation 暴力*1300
前言传送门 :思路虽然知道是暴力,但是还是不够优雅显然答案区间就是最大的不同 和 最小的不同然后枚举一下即可Mycodeconst int N = 1e3+10;int n;int a[N];void solve(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } int l = 0x3f3f3f3f , r = 0 ; for(int i=1;i<=n;i++){ if(a[原创 2022-03-15 14:36:03 · 149 阅读 · 0 评论 -
[luogu]CF19B Checkout Assistant 01背包变式
前言传送门 :思路一件商品 iii 扫描需要tit_iti时间扫描这件物品,我们可以偷走tit_iti个物品扫描物品iii,一共可以获得ti+1t_i+1ti+1个物品因此问题转换 :一共nnn个物品,第iii件物品的体积为ti+1t_i+1ti+1,价值为ccc好魔幻Mycode// Problem: CF19B Checkout Assistant// Contest: Luogu// URL: https://www.luogu.com.cn/problem/CF19B原创 2022-03-14 12:44:58 · 181 阅读 · 0 评论 -
[luogu]CF4D Mysterious Present
前言传送门 :思路看上去是含捆绑关系的LISLISLIS,但是其实只要对一个关键排序,然后另一个跑一遍LISLISLIS即可至于这题比较难的是输出路径我们可以使用preprepre数组进行转移,每当其转移的时候 我们更改即可Mycodeconst int N = 5e3+10;struct node{ int w,h,id;};vector<node> a;bool cmp(node t1,node t2){ return t1.w < t2.w; }i原创 2022-03-13 16:41:50 · 221 阅读 · 0 评论 -
[luogu]P4054 [JSOI2009]计数问题 树状数组解决二维前缀和
前言传送门 :思路题目要求,单点修改,并且区间求和,显然我们可以联想到树状数组因此我们可以使用tr[i][j][k]tr[i][j][k]tr[i][j][k]来记录,一个坐标上的状态剩下的就和一维树状数组差不多了,不多做解释Mycodeconst int N = 310;int tr[N][N][110];int a[N][N];int n,m;int lowbit(int x){ return x & -x;}void add(int x,int y,int原创 2022-03-02 14:16:07 · 103 阅读 · 0 评论 -
[luogu]P6225 [eJOI2019]异或橙子 树状数组
前言因为过样例但是暴0的屑传送门 :思路观察题目所给的2−42-42−4,不难发现利用a xor a=0a\ xor\ a=0a xor a=0,最后只剩下了a2a4a_2 a_4a2a4因此再手推几组样例会发现只有当奇偶性相同的时候才有答案,而答案就是l,l+2,...rl,l+2,...rl,l+2,...r但是这里需要注意修改操作对于异或树状数组的修改 ,我们仍然可以使用上面那个性质,这样子我们再modifymodifymodify的时候,原创 2022-03-02 12:51:41 · 174 阅读 · 0 评论 -
[luogu] P3801 红色的幻想乡 树状数组
前言传送门 :思路观察题目之后,如果将矩阵看成一个 010101矩阵,不难发现其实最终答案 就是求 二维前缀和只是对于每次操作都是 行列的 取反操作想到前缀和我们就联想可以使用树状数组维护,因此我么可以创立两个树状数组,从而进行维护区间的值下面的操作就是二维前缀和的操作了MyCodeconst int N = 1e5+10;int Tx[N],Ty[N];int n,m,q;int stx[N],sty[N];int lowbit(int x){ return x &原创 2022-03-01 22:12:17 · 141 阅读 · 0 评论 -
[luogu]P4570 [BJWC2011]元素 线性基排除0
前言传送门 :思路因为没注意范围1e181e181e18,循环任然用555555然后就WAWAWA了这题和上一题一样,同样使用了线性基排除了集合中异或和为000的情况然后再贪心的从大到小排序即可MyCodeconst int N = 1e5+10;ll p[N];ll ans;bool XXJ(ll x){ for(int i = 62;i>=0;i -- ){ if(!(x>>i)) continue; if(!p[i]){ p[i] = x;原创 2022-03-01 21:15:03 · 127 阅读 · 0 评论 -
[luogu] [CQOI2013] 新Nim游戏 线性基,排除异或为0的情况
前言传送门 :思路根据 wiki,中所说的第三条线性基性质可知线性基没有异或和为 0 的子集。又因为NimNimNim游戏的先手获胜情况是a[i]⨁a[i+1]....=0a[i] \bigoplus a[i+1].... = 0a[i]⨁a[i+1]....=0因此我们可以将所有数都加进线性基,当出现x==0x ==0x==0的情况就说明可以取走这个xxx这样子就会使得原来的集合中不存在异或和为0的子集异或和为0的子集异或和为0的子集正好对应性质但是题目中还需要使得第一次取走的最少由于异原创 2022-03-01 21:01:12 · 2961 阅读 · 0 评论 -
[luogu] P3857 [TJOI2008]彩灯 线性基,异或最大种类
前言这是除了,线性基求最大异或值之后的第二个板子传送门 :思路根据 OI Wiki(可点击转向网址)线性基具有以下性质 :线性基的元素能相互异或得到原集合的元素的所有相互异或得到的值。线性基是满足性质 1 的最小的集合。线性基没有异或和为 0 的子集。线性基中每个元素的异或方案唯一,也就是说,线性基中不同的异或组合异或出的数都是不一样的。线性基中每个元素的二进制最高位互不相同。根据第444条可知,线性基中的元素异或方案唯一,也就是可以将这题的字符串转换为十进制原创 2022-03-01 20:35:40 · 128 阅读 · 0 评论 -
[luogu] P4151 [WC2011]最大XOR和路径 dfs+线性基
前言传送门 :题意给你一个无向有权图(含环),求一条从1−N1 - N1−N的路径上,异或和最大思路这道题,虽然看完题解之后感觉异常简单,但是撸起来还是非常困难的首先 :如果没有环,那么只需要求 v[1]xor.....v[N]v[1] xor.....v[N]v[1]xor.....v[N]即可但是因为有环的参与,导致答案会被环更新,由于到环的距离来回一次所以不考虑因此答案最后是v[1]xor...v[N]v[1] xor ...v[N]v[1]xor...v[N]但是可能存在多条直达原创 2022-02-28 22:42:28 · 99 阅读 · 0 评论 -
[luogu] P3812 【模板】线性基
前言传送门 :思路目前 这是求异或最大值的模板, 具体线性基还有什么其他用处待开发具体步骤 :从高位向低位扫每一个数a[i]a[i]a[i] , 如果是000则继续扫,否则如果当前线性基p[i]p[i]p[i]不存在,那么就让这个数当p[i]=xp[i] = xp[i]=x, 否则异或上当前的线性基怎么求最大值呢 ? 贪心的做法 , 我们从高到低位扫,如果异或之后比原来的大,那么就让他异或回去MyCodeconst int N = 110;ll a[N],p[N];int n;原创 2022-02-28 21:35:29 · 153 阅读 · 0 评论 -
[luogu] P1441 砝码称重 dfs+01背包
前言传送门 :思路先dfsdfsdfs出所有选法,再根据010101背包跑出方案数但是010101背包优化值得借鉴MyCodeconst int N = 2010, M = 30;int n,m;int a[M],st[M],ans,sum,tot;bool f[N];void dp(){ memset(f,0,sizeof f); f[0] = 1; sum = tot = 0 ; for(int i= 0 ;i<n;i++){ if(st[i]) c原创 2022-02-28 14:44:03 · 120 阅读 · 0 评论 -
[luogu] P1385 密令 背包dp记录方案数
前言传送门 :思路状态表示 : f[i][j]f[i][j ]f[i][j]前iii个字母里面,和为jjj的方案数状态计算 : f[i][j]+=f[i−1][j−k]f[i][j] += f[i-1][j-k]f[i][j]+=f[i−1][j−k]初始化 : f[1][0−26]=1,f[i][0]=1f[1][0-26] = 1 ,f[i][0]=1f[1][0−26]=1,f[i][0]=1然后我们预处理出来所有的方案数即可,最后直接输出CODE// Problem: P1385原创 2022-02-25 16:46:18 · 195 阅读 · 0 评论 -
[luogu] P1336 zuijia课题选择 线性dp
前言传送门 :思路状态表示 : f[i][j]f[i][j]f[i][j]前iii门课程,完成jjj次其中w=A[i]∗pow(k,B[i])w = A[i]*pow(k,B[i])w=A[i]∗pow(k,B[i])状态计算 : f[i][j]=min(f[i−1][j−k]+w,f[i][j])(0<=k<=j)f[i][j] = min(f[i-1][j-k] + w , f[i][j]) (0<=k<=j)f[i][j]=min(f[i−1][j−k]+w,f[i原创 2022-02-25 16:18:05 · 362 阅读 · 0 评论 -
[luogu] CF515B Drazil and His Happy Friends 背包方案数
前言传送门 :思路一个不超过的背包计数问题 组合上一个 二维费用CODEconst int N = 510;int a[N],f[N][N];int n,m,b,mod;int ans;void solve(){ cin>>n>>m>>b>>mod; //总共写m行 //不超过b个 for(int i=1;i<=n;i++) cin>>a[i]; //一个 f[0][0] = 1; for(int原创 2021-12-25 18:57:34 · 232 阅读 · 0 评论 -
[luogu] P2954 Grazing2 S DP
前言题是好题题解也是非常好的题解,所以在转载在这,如果侵权了必删传送门 :思路CODEconst int N = 1510;int f[N][N];int a[N];int n,s;void solve(){ memset(f,0x3f,sizeof f); cin>>n>>s; for(int i=1;i<=n;i++){ cin>>a[i]; } int d =(int)((s-1)/(n-1));原创 2021-12-22 12:16:07 · 95 阅读 · 0 评论 -
[luogu] P2949 Work Scheduling G 优先队列+反悔贪心
前言传送门 :思路我们先把所有利润都拿然后我们将时间从小到大排序如果当前的时间不在某个时间段内 , 贪心的想这个 时间节点 的价值要被考虑如果当前的时间在某个时间段内,说明区间重合,必然有一个是要被放下,所以我们通过小根堆维护最小的值,每次贪心的减去即可CODEtypedef priority_queue<int,vector<int>,greater<int>> Pri_m;typedef pair<int,int> pii;ty原创 2021-12-22 11:47:11 · 333 阅读 · 0 评论 -
[luogu]P2879 [USACO07JAN]Tallest Cow S 差分+前缀和
前言传送门 :思路因为没有给定a,ba,ba,b之间的关系,所以我们需要判断一下并且为了使得, 满足整个数组的条件,显然每条 关系 ,我们只可能运行一次[a,b][a,b][a,b]内,所有的高度都比aaa小,因此从差分的角度看,num[a+1]−−num[a+1]--num[a+1]−−又因为bbb的高度一定大于aaa的高度,所以num[b]++num[b]++num[b]++最后只需要统计一下前缀和输出答案即可CODEint sum[N],num[N];int n,i,h,r;ma原创 2021-12-16 13:37:57 · 753 阅读 · 0 评论 -
P4677 山区建小学
前言传送门 :原创 2021-12-15 17:30:38 · 237 阅读 · 0 评论 -
[luogu] P2498 [SDOI2012]拯救小云公主 二分答案+bfs
前言以为二分的是人到BOOS的距离没想到可以直接二分BOOS的攻击距离传送门 :思路BFS待研究CODEtypedef pair<int,int> pii;map<int,int> mp;int cal(int x1,int y1,int x2,int y2){ return pow(x1-x2,2)+ pow(y1-y2,2);}bool check(int d,double r){ return r * r * 4 >d;}const i原创 2021-12-12 12:58:27 · 319 阅读 · 0 评论 -
[luogu] P1246 编码 dfs打表
前言dfsdfsdfs是真的好难传送门 :思路因为数据长度只有666 ,所以我们可以直接打表出来时间复杂度O(226∗6)O(2^{26} *6)O(226∗6)显然是可行的所以我们可以对于每一个长度,我们都dfsdfsdfs一遍,然后用map<String,int>map<String,int>map<String,int> 来记录位置CODEvoid dfs( int l,int x,string temp){ if(x > l ) {原创 2021-12-11 15:52:02 · 213 阅读 · 0 评论 -
[luogu] P1638 逛画展 二分答案||尺取法
前言一开始就有点歪,尺取法待补传送门 :思路一开始以为是二分答案,二分左端点毕竟如果是二分金钱的话时间复杂度(logn∗m∗nlog_n*m*nlogn∗m∗n) 感觉会超时结果二分左端点没二分出来,实践证明没有单调性所以又乖乖滚回去二分金钱,显然对于已有金钱,我们只需要判断左右两边是否有满足答案的即可,所以我们直接按照这个模拟即可CODE#include <iostream>#include <vector>#include <map>#in原创 2021-12-11 12:41:33 · 401 阅读 · 0 评论 -
[luogu] P4047 [JSOI2010]部落划分 最小生成树||二分答案
前言这也可以歪成这个hh二分答案待补传送门 :思路如果这个题,每个点看作一个部落的话 , 我们贪心的根据边排序, 将最大的边的部部落算成一个集合,那么我们就可以跑一遍kruskalkruskalkruskal算法,那么这题的答案就是求第n−k+1n-k+1n−k+1条边,总之抽象有点喜感,CODEconst int N = 1e6+10;int p[N];int wx[N],wy[N];int idx ;int n,m,k;struct node{ int a,b原创 2021-12-10 18:20:44 · 436 阅读 · 0 评论 -
[luogu] P1182 数列分段 Section II 二分答案
前言很基础的一个二分答案( 但是还是WA了传送门 :思路二分答案基本步骤 :确定上下界确定checkcheckcheck我们先确定上下界 , 因为是和的最大值最小, 所以我们的r=sum(a[i])r = sum(a[i])r=sum(a[i]) 显然但是我们的下界不能是从111开始,为什么呢? 因为不管是分为一个单独的集合 还是和其他集合再一团,我们的最小值都只可能是max(a[i])max(a[i])max(a[i]) ,所以这就是上下界然后我们确定checkcheckche原创 2021-12-10 17:56:39 · 220 阅读 · 0 评论