自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Daimayuan Online Judge #731. 数字替换

算法分析模拟+思维倒着更新,如果前后数有关联的话,前面的数一定会被2操作给修改,因此倒着维护数的关系,然后用到了,并查集中f[]的思想,维护当前被修改后最终的结果AC code#include <bits/stdc++.h>using namespace std;const int N = 5e5 + 10;int f[N];struct node{ int op,x,y;};vector<node>v;vector<int>a

2022-04-10 09:29:26 176

原创 Daimayuan Online Judge #665. 数组划分

题目链接算法分析线性dp + 贪心 ?我们若想要每个子数组求和后按与运算的值尽可能的大,按照贪心的思路,我们就从高位上选,若能满足选中这些数位后,还能划分出 k 个字段则说明这个数字可以被选中那么现在需要解决的问题就是如何判断划分 k 个子段的合法性,假设当前需要验证 x 的合法性字段 可以在 处被切割下来,那么说明 这段区间和 & 其他数组的和 是 >= x 的在之前的区间...

2022-03-29 21:15:18 451

原创 Java快读模板

import java.io.*;import java.util.*;class Reader { static StringTokenizer token =new StringTokenizer(""); static BufferedReader reader =new BufferedReader (new InputStreamReader(System.in)) ; static String nextLine() throws IOException { .

2022-03-26 14:56:20 257

原创 Daimayuan Online Judge # 608 字典序最小

算法分析单调栈这题有很特别的需要注意到地方就是,我们要取出 个不同数使得这 个数的字典序最小,但是这 个数,数据保证了 [1,n] 中的数,每个至少出现一次,那么我们最希望看到的其实就是[1,2,3,4,5,6,7,8,9...........n]那么该怎么维护出这样的序列呢为了字典序最小,那么我们一定是希望大的数出现在后面,但是又要保证 这个大的数是会出现在答案中的,那么我们当前错过了这个数,必须保证后边还有这个数的存在才行。比如说10 55 4 3 2 1 4 1

2022-03-22 17:07:26 402

原创 Daimayuan Online Judge #607. 平方计数

算法分析神奇的暴力枚举作为平方数 , 再枚举作为要变成的那个平方数如果 那么这样的 是可能存在的计算就好了优雅的暴力由于数据量大的时候就很容易不会满足条件就直接break掉了时间复杂度是,是一个调和级数所以可以过掉了AC Code#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e7 + 10;ll cnt[N];...

2022-03-21 21:54:24 470

原创 Codeforces Round #770 (Div. 2) F. Fibonacci Additions

算法分析差分变种我真的是T麻了 事实证明关同步 是比scanf快的题解先gugu了 放个代码 明天再来补AC Code#include<bits/stdc++.h>#define int long longusing namespace std;const int N = 3e5 + 10;int a[N],b[N],c[N],d[N],f[N];int zero = 0;int n,q,mod; void inline update(int pos,i

2022-03-19 17:54:34 860

原创 Codeforces Round #459 (Div. 1) B. MADMAX

算法分析博弈论sg函数 + 记忆化搜索 表示为 先手在 u 点 后手在 v 点 上一次操作的权值为 w 时,先手的胜负状况考虑sg函数必胜必败态转移sg的状态转移其实像是图上的dp转移 会转移到哪里呢,当前的先手为 u 后手为 v那么轮到 v 的这一轮时 先手就是 v ,后世就是 u 再往后任意走一个位置(我在这里假设成 e那么就是转移到看 上,因为上一步是 u 走的一步权值为 的一步那么记忆化搜索的过程就出来了bool dfs(int u,int v,int w)..

2022-03-19 14:44:18 81

原创 Daimayuan Online Judge #556. 三进制循环

算法分析树形dp题目要求从第二个结点开始,每个节点的值都等于上一个节点的值 + 1 % 3 的结果,希望这个序列最长,那么树上问题,对于一个结点来说,经过他最长的序列肯定就是,向子树中的某一侧走到底的最佳答案 + 向子树中的另外一侧走到底的最佳答案那么最后的答案就是某一侧长度+ 另外一侧长度 - 1那么按照这个思路思考下去就可以脑补出状态的定义了。状态表示 从 结点向下搜,满足 子节点为父节点 + 1 % 3 后的结果 的最长长度(也可以理解为从上往下是递增的 从 结点.

2022-03-16 19:30:47 390

原创 Daimayuan Online Judge #555. 整齐的数组2

算法分析随机化 + 小学数学???两个数之间若能通过 k 变成一样的数 说明 abs (a[i] - a[j]) % k == 0 即 k 是 abs (a[i] - a[j]) 的因子 那么随机取两个数 a[i] 和 a[j],枚举 abs(a[i] - a[j])的因子作为 k ,判断 k 是否合法,更新答案即可那么随机化如何保证正确性呢 n 个数中至少有 1 / 2 的数属于答案的集合.那么随机取一个数,取到答案数的概率至少为 1 / 2,取出两个数倘若均不为答案的可能性为 3 / .

2022-03-15 08:58:52 210

原创 [USACO09OPEN]Work Scheduling G

算法分析树状数组上二分只要截至日期前的任务数量小于截至日期那么就全都可以做完截止日期前的任务数大于截止日期时,就按照贪心(权重大的)尽可能往后放着,直至塞不进就行那么就是二分在某个截至日期能塞的最后的位置就可以了AC Code#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int n,tr[N];struct node{

2022-03-13 20:49:59 465

原创 Daimayuan Online Judge #504. 连续子序列

算法分析线性dp表示以结尾的最长上升子序列的长度为那么由于限定了公差为 那么答案一定是从 转移而来的维护一个最大长度即可然后要输出方案的话,已经最大长度时对应的,那么就是输出即可AC Code#include<bits/stdc++.h>using namespace std;const int N = 2e5 + 10;int a[N];map<int,int> mp;int main(){ int n;...

2022-03-12 15:18:16 555

原创 namomo 每日一题 207 拆方块

题目链接算法分析思维最后留下来的方块一定是最底层的,因此考虑最底层的怎么跑到白色格子上即可考虑往左边和右边跑,各自来一次,取min求最小的最大,保证每个格子都可以在这些步数内跑出去AC Code#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N],ans1[N],ans2[N];int main(){ int n;cin >> n;

2022-03-11 19:19:41 157

原创 CCPC Harbin 2021 G, Damaged Bicycle

算法分析状压dp + 最短路 ??来自巨巨的思路每次的决策其实很简单1. 直接从起点走到终点2.先从起点走到点,若点自行车完好,就直接骑车到终点3.若点自行车不完好,那么就考虑后续没有被用过的自行车的,走到重复(2,3)的决策那么每次自行车的使用状态,我们用状压给他表示这个集合然后每次都是往各个有自行车的点走(把起点终点视作特殊的有自行车的点那么就对这些自行车所在的点预处理出最短路就可以了(代码附加了详细注释,建议搭配代码食用状态表示及转移...

2022-03-11 16:07:31 281

原创 Daimayuan Online Judge #469. Closest Equals

算法分析ST表 + 思维 ??(只要是能维护区间的数据结构就可以每次就是查询一段区间内相同的数之间最短的距离那么直接一点去思考我们可以将每一对这样的数存下来,然后找最小的那么这样子显然是会有很多对是重叠的比如说 1 1 1 1 1肯定要选择第一个和第二个 1 做匹配才是最短的因此我们以左端点为起始点,只要右端点大于之前已经匹配的位置的对,一定不是最短的那么就可以除去很多对了,左端点不同的则是新的一对区间,保证了左端点有序我们用维护第对区间的端点,然后经典 ST...

2022-03-10 09:19:01 1138

原创 Daimayuan Online Judge #497. XOR Inverse

算法分析Trie + 位运算先挂个代码,明天再写(已经在代码旁边加注释了 可参考AC Code#include<cstdio>#include<vector>#define int long longusing namespace std;typedef long long ll;const int MAXN = 3e5 + 5;int t[32 * MAXN][2];vector<int> g[32 * MAXN];int dp

2022-03-08 21:25:59 302 2

原创 Daimayuan Online Judge #466. 摘桃子

算法分析前缀和 + 双指针由题意可知求的就是经转换可以得到那么就只需要用 map 维护之前出现过的,再用双指针保证,即可AC code#include<bits/stdc++.h>#define int long longusing namespace std;const int N = 2e5 + 10;int a[N],s[N];map<int,int> mp;signed main(){ int n,k;cin &...

2022-03-08 16:18:52 224

原创 Daimayuan Online Judge #468. 函数求和

算法分析知识点:容斥 + 位运算??&意味着在某位上为时,在该位上为。由于的范围极大不可能全部枚举,因此我们从的角度入手(以下指的位都是二进制表示下的位,为了方便说明下标是从 1 开始的)对于每一个的加入都会对的某些位形成限制。那么我们就考虑容斥,即计算出每一次的贡献,即以作为答案的贡献ex.2 22 1当a1 = 2 还没有形成限制时,x 共有两位是可以任意选的(即自由的位置有两位),00,01,10当 ...

2022-03-07 21:31:41 232

原创 Daimayuan Online Judge #467. 路径计数2

算法分析知识点:计数类dp需要注意的点计算阶乘和逆元的时候需要算到,因为有中间过程,会达到的范围而不是取模相减会出现负数记得补上mod (老生常谈了属于是状态表示 表示从左上角位置开始,走到第 个障碍的合法方案数状态转移倘若不考虑是否合法,随便走的话,走到第 个障碍的坐标 ,有 种,但是这期间是存在不合法的方案的,因此考虑容斥,需要去除不合法的方案。对于第个障碍来说,到第个障碍的非法方案,是由先到第个障碍的位置,再任意走到第个障碍的路线...

2022-03-07 21:27:22 290 7

原创 Daimayuan Online Judge #463. 饿饿 饭饭

算法分析二分答案 的数据范围,我们显然是不可能去模拟每一轮的那么其实这一轮一轮的循环,只需要模拟最后一轮就可以了,因为之前每一轮的变化其实就是假设当前轮为 , ,那么前后轮之间其实并没有啥影响,那么我们只需要去二分最后一轮是在什么时候,再模拟一遍最后一轮的过程就可以了。那么这个二分该怎么写呢bool check(ll x){ ll res = 0; for(int i = 1;i <= n;i ++) { res += min(

2022-03-05 11:35:34 407

原创 Daimayuan Online Judge #454. Minimum Or Spanning Tree 3.4 打卡

算法分析知识点 : 并查集 + 贪心最小生成树的代价是或的结果,那么或的结果将由这个边权的最高位决定那么我们当然是希望这个边权的最高位尽可能地小因此我们按位贪心,根据数据范围 ,那么最高位不会超过 ,那么就从高位向下枚举,若不使用在第 位上有权的边可以构成一颗生成树,说明在第位上有权的边,可以被抛弃了,(不使用高位有权值的边答案一定更小那么就基于这个思路,枚举 31 个位,在每一个位上判断是否可以不用该位构建生成树,若可以构建就抛弃这个位上有权的边,若不可以构建,..

2022-03-04 16:40:32 313

原创 Daimayuan Online Judge #464. 数数 3.3 打卡

算法分析树状数组 + 离散化经典的二维数点问题询问之间小于的个数,其实问的就是在 二维坐标下,以为左下角,为右上角的矩形中有多少个点的问题树状数组 一个应用其实就是快速的求出前缀和 那么这个矩形中有多少个点可不就是个二维前缀和嘛因此就是统计出四个矩形中的点数 加加减减就完事了然后注意一下数据范围,离散化一下就好了AC Code#include <bits/stdc++.h>using namespace std;#define int ...

2022-03-03 16:08:43 472

原创 Daimayuan Online Judge #452. 序列操作 3.2 打卡

算法分析本题需要实现两种操作1. 将第 个数修改成 2. 将小于的数都修改成 的数据范围限制了在线的做法(可能有在线的做法 但是我太菜了 我只会离线总体上的思路就是考虑每一个数受操作的影响一个数只会被最后一次 的操作 1 和 最后一次操作 1 后的操作 2 影响操作 2 只会对之前的询问产生影响,且只有最大的值才会产生影响基于这个思路,只需要 将每个位置的最后一次 操作 1 之后的 操作 2 的最大值和最后一次操作 1 的数进行比较 取大就可以了细节上的解释写在注...

2022-03-02 16:28:45 329

原创 Daimayuan Online Judge #456. 选数 3.1 打卡

算法分析抽屉原理 + 前缀和 ??!!首先根据抽屉原理,我们可以保证本题必定有解,因为取个数要么会出现,要么就会出现前缀,所以根据这个原理这题目就很简单了。对这些数字做前缀和,倘若出现了,那么就直接输出前缀的方案就可以了倘若出现了,那么就把和之间的数字给输出就可以了和只需要开一个数组维护一下曾经出现的值就可以了详情见代码AC Code#include<bits/stdc++.h>using namespace...

2022-03-01 09:13:21 291

原创 Daimayuan Online Judge #451. Dis 2.28打卡

题目链接算法分析题面非常简洁,即多次询问两个点简单路径所构成点集的异或和。显然的 LCA 板子题我们开一个数组 DFS 一下记录从根节点到各个结点的异或和,那么询问 两点间的异或和就是while(m --) { int u,v; scanf("%d%d",&u,&v); int lca = LCA(u,v); LL ans = sum[u] ^ sum[v] ^ a[lca];

2022-02-28 20:28:33 187

原创 Codeforces Round #772 (Div. 2) D - Infinite Set

算法分析由题目的数据可以看到 P 是一个非常大的数,题目又涉及到了 ,那么我们不妨从二进制的角度来思考这个问题。ex.10 的二进制表示是 101021 的二进制表示是 1010140 的二进制表示是 101000可以发现 2x + 1 就是在二进制表示的串后添加一个 14x 就是在二进制表示的串后添加两个 0那么当然有的数可以通过不同的办法同时转移得到,因此我们需要先筛选出最初始的那些数,使得所有的数都可以由初始的数转移而来。而现在我们转移的方式已经很清晰了只需要暴力枚举判

2022-02-22 11:06:29 305

原创 Denso Create Programming Contest 2022(AtCoder Beginner Contest 239) E - Subtree K-th Max

算法分析DFS 统计每颗子树的前 20 大的值后合并时,合并所有子树中前 20 大的值,就这样递归处理即可。AC code#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;vector<int>g[N],num[N];int x[N];void dfs(int now,int fa){ num[now].push_back(x[now]); for(auto

2022-02-20 12:30:47 429

原创 智乃买瓜(another version)

算法分析逆向 dp从前个瓜中取出总质量为的瓜的方案数滚动数组优化过后的表示的是总质量为 的方案数已知各种重量的方案数,求这些若干个西瓜的重量是多少。等于就是将背包中的物品给取出来,询问物品的信息。那么我们先看看正向是怎么做的dp[i][j] = dp[i - 1][j] + dp[i - 1][j - w[i]] + dp[i - 1][j - w[i] / 2]那么按照正常的逆向思维就是将式子进行移项dp[i - 1][j] = dp[i][j] - d...

2022-02-19 10:30:33 243

原创 2022牛客寒假算法基础集训营1 - 题解

A .九小时九个人九扇门算法分析dp 0/1 背包 升级版我们可以注意到一点就是 : 一个数的数字根等于这个数对 9 取模的结果(特别地,取模得 0则数字根为9) 为这个数模的结果为数字根 证毕!!!利用这个结论我们就可以方便对问题的求解了状态表示表示从前个数中取得数之和对取模为的方案数状态转移很简单就能想到就是第个数取或者不取这两种情况1. 取的情况...

2022-01-30 17:37:10 1225

原创 2022—SWJTU-寒假ACM校队选拔赛第三场-题解

A - A算法分析要想让 只能是发生在进位的时候,因此每逢尾数为 9 时就会对答案产生贡献。AC code#include<bits/stdc++.h>using namespace std;void solve(){ int n,res = 0; cin >> n; if(n % 10 == 9) res += 1; res += n / 10; cout << res << endl;}

2022-01-25 14:54:57 988 4

原创 蓝桥杯Java 、C ++ 组历年真题题解(包括填空和代码填空)----持续更新

**_为了更好的备战蓝桥杯,笔者将按照每日更新两道题的速度,争取在赛前刷穿真题,同样希望本文也可以帮助到大家。_**### 2017 年 省赛填空题 迷宫[题目链接](https://www.lanqiao.cn/problems/641/learning/)**答案 = 31 **简单 dfs### AC code```#include<bits/stdc++.h>using namespace std;char g[15][15];bool vis[15][1...

2022-01-18 16:04:43 1368

原创 2022—SWJTU-寒假ACM校队选拔赛第二场-题解

A - 傻子楼梯算法分析队列模拟即可要转变方向当且仅当不同方向的人已抵达电梯,且该方向的下一个人还未到达电梯AC code#include<iostream>#include<queue>using namespace std;queue<int> q0,q1;int main(){ int n; cin >> n; while(n --) { int a,b;

2022-01-18 12:23:53 596

原创 2022—SWJTU-寒假ACM校队选拔赛第一场-题解

A - 惠老板观星https://vjudge.net/problem/Gym-103401H算法分析暴力枚举正方形的四个顶点即可,由于正方形的长宽相等,时间复杂度为AC code#include<bits/stdc++.h>using namespace std;const int N = 300 + 10;int a[N][N];int b[5];void solve(){ int n; cin >> n; for(int

2022-01-15 16:39:57 614

原创 Codeforces Round #765 (Div. 2) C.Road Optimization

​题目描述从数轴原点 走到 ,路上的 位置放置有限速牌,则 至 的位置,每走一个单位都需要 的时间。所以需要的总时间是现在撤去至多个限速牌,问所需的总时间最少为多少。错误示范昨天一看到这题第一反应就是个贪心暴力,把每次删牌子的贡献计算出来排序,然后拿总时间去减掉就是答案了。然后就是喜提 WA 5 了。后来仔细思考了一下便发现了暴力解法的错误点,因为暴力解法只考虑了最初始状态相邻路牌删掉以后的情况并未考虑几个区间连着删去,按照最前端那个最小的速度行驶完整个区间,是存在比考虑单独区间

2022-01-13 11:20:55 194

空空如也

空空如也

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

TA关注的人

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