题解
文章平均质量分 67
HHeyanjie
抱怨没有用,一切靠自己
展开
-
数列分块整理..
先分块,把n个数分成根号n个块,每个块根号n个数,(如果不是完全平方数区间个数就+1)num数组记录每个数lef数组维护当前这个数所在区间的左边界rig数组维护当前这个数所在区间的右边界blo数组维护当前这个数属于哪一个块lazy数组维护每个块增加的数思路:修改1.对于每次修改,找到L所在的块和R所在的块2.如果L和R在相邻块或者同一块,直接枚举区间num[i]+C;3.否则,枚举第L和R中间的块,lazy[i]+C,并且枚举L所在的块和R所在的块的num[i]+C;查询第i个数的.原创 2021-07-22 09:57:51 · 177 阅读 · 0 评论 -
2021年度训练联盟热身训练赛第一场 —— C
链接: link.题意:给你一个数n,求最小的数x使得x的平方等于n,运算过程中只以个位作为有效数字,比如正常情况4×4=16,在这里4×4=6;正常情况17×17=289,在这里17×17=149.思路:首先写一下乘法竖式。1、首先可以发现,得到的答案的位数一定是一个奇数,而且是x的位数乘2加1,所以答案位数一定是偶数。那么如果n的位数+1是一个奇数,一定找不到x。2、再来看能找的情况,我们假设n有p位,那么x就有k = (p+1)/2位,可以发现通过枚举n的最高位(称它为第1位)可以找到原创 2021-03-10 14:29:36 · 258 阅读 · 0 评论 -
关于单调栈...
单调栈:单调递增或单调减的栈,主要通过push和pop两个操作巧妙的解决一些有关序列的问题。===================================================================================放一道题目:牛客链接: link.题意:有n个小于k的数,不改变数组的顺序,求字典序最小的1到k的子序列。#include <bits/stdc++.h>#define ll long long#define T int T;sc原创 2021-03-08 21:39:13 · 106 阅读 · 0 评论 -
Educational Codeforces Round 102 (Rated for Div. 2) A-D
链接: Educational Codeforces Round 102 (Rated for Div. 2).A题意:输入n,d,有n个数,可以选择互不想等的i,j,k,使得ai=aj+ak。问最终能否使得数组的每个数字都小于等于d思路:求出数组最小的两个数的和,小于d就YES,否则NO代码#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#include <math.h>#in原创 2021-01-15 14:15:59 · 687 阅读 · 0 评论 -
Codeforces Round #693 (Div. 3) A-E
链接: Codeforces Round #693 (Div. 3).A题意:有宽度w和长度h,如果w是偶数,可以切成两片,h同理,问能否切成至少n片思路:求出w和h最多切成多少片,最后总片数等于他们的乘积。代码#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <vecto原创 2021-01-05 15:41:29 · 272 阅读 · 0 评论 -
Hdu 3974——Assign the task dfs序+线段树
题目: link.题意:公司里有一堆人,然后对于每个人(除了公司老板)每个人都有上属和下属,他们恰好构成一棵树,每当把任务分给某个人时,若他有下属,则他的所有子树全部做这个任务,对于每次查询输出某个节点正在做什么任务。输入有2种操作:1、C x 输入x这个人在做的任务编号 如果没工作输出-12、T x y 让x和x的下属做编号为y的工作思路:先跑一边dfs序,每个节点记录一个in和out表示时间戳,对于每个人p,in[p]到out[p]这段区间就是p的下属,dfs序完了之后用线段树维护每个人的原创 2020-11-05 15:19:21 · 107 阅读 · 0 评论 -
线段树 HDU—4027 Can you answer these queries?
链接: link.题意:输入一个n表示n个数,然后输入n个数,输入m表示m个操作,有2种操作:1、0 x y 表示x到y这个区间到数都开根号2、1 x y 求出x到y区间和思路:毫无疑问利用线段树求区间和,但是每次都把一个区间的每个数都开根号就会超时,我们知道一个数一直开根号,到最后一定变为1,所以我们同时记录一下一个区间内的最大值,如果这个区间的最大值是1,那么就不用给这个区间的数开根号,就不用继续往下找,降低时间复杂度。代码:#include <iostream>#incl原创 2020-11-04 18:09:28 · 77 阅读 · 0 评论 -
线段树维护最长连续区间 hdu 1540 Tunnel Warfare
链接: link.题意:输入n表示n个城市,输入m表示m个操作,有3中操作:1、D x 表示摧毁第x个城市2、Q x 表示查询包括x村庄的连续的没被摧毁的城市个数3、R 表示修复上一个被摧毁的城市思路:对于每个,1表示城市没被摧毁,0表示摧毁,对于每个区间lmax表示从区间最左边开始的连续城市,rmax表示从区间最右边开始的连续城市数量,maxx表示该区间的最大连续区间。每次摧毁城市的时候,找到那个城市,改为0,然后pushup。pushup函数中当前区间的lmax=左儿子区间的lmax,原创 2020-11-04 17:54:00 · 146 阅读 · 0 评论 -
欧拉函数
欧拉函数:就是对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。欧拉函数的通式:φ(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn)其中p1, p2…pn为n的所有质因数。φ(1)=1(唯一和1互质的数就是1本身)。我也不知道通式怎么来的,记住吧。单个欧拉函数代码ll oula(ll n){ ll ans = n; for(int i=2; i*i <= n; ++i) { i原创 2020-11-01 18:03:45 · 365 阅读 · 2 评论 -
最短路正反建图
链接: 题目.题意:输入n m x 表示有n个点 m条边 终点是x,要求输出每个点到终点然后回来的最大值。思路:如果正向跑,每个点开始跑一变dij求出每个点到终点距离和终点到每个点距离,肯定会T,所以改变一下思路,存一个正向图和一个反向图,正向图从x点跑一边最短路,可以得出终点到每个点的最短路,反向图也从x点跑一边最短路,因为反向图,所以可以得出每个点到终点的最短路。最后取两个dis相加的最大值。代码#include <iostream>#include <cstdio>原创 2020-10-30 12:00:04 · 242 阅读 · 0 评论 -
逆向并查集
题目: 题目.题意:有n个战舰(0~n-1),每个战舰有一个战斗力,然后输入一个m表示m对战舰联合,然后输入一个q表示q次查询。接下来q行有两种输入:1、query x 表示查询和x战舰联合对战舰中攻击力最大的战舰的编号(如果战斗力相同输出小的编号),如果没有就输出-1. 2、destroy x y 破坏x战舰和y战舰的关系,不改变其他战舰关系。知道这题的思路的时候感觉发现了新大陆,太强了。。。思路:如果直接先把m组关系处理完然后正向的操作q次操作,会很难处理destroy的操作,因为既要保持已有的关原创 2020-10-28 19:28:59 · 296 阅读 · 0 评论 -
简单并查集
链接: 题目.题意:有1到n台坏电脑,每台电脑可连接半径是d,有两个操作:1、O p,表示修复第p台电脑。2、S p q,判断p和q两台电脑能不能连接(直接或间接连接)。能连输出SUCCESS,否则输出FAIL思路:直接连接很好判断,间接连接就判断在不在同一个集合里。代码:#include <iostream>#include <cstdio>#include <map>#include <set>#include <cmath>原创 2020-10-27 11:29:22 · 110 阅读 · 0 评论 -
带权并查集
题目: link.题意:输入n和m 表示有n个数和m行输入,接下来m行,每行输入x,y,w表示第x个数到第y个数的和是w,如果与之前的相矛盾,答案加+1,不矛盾则作为之后的条件。比如1 10 10,1 5 4,6 10 5,前两条正确,第三条与则与之前的矛盾,因为1到10的和是10,1到5的和是4,6到10的和应该是6,而不是5,所以有一条是错误的,输出1。思路:很难想到这是一个并查集的题。开一个sum数组存第i个点到根结点的和,初始化为0(自己是自己的根结点),每次find的时候更新到根结点原创 2020-10-23 13:19:16 · 162 阅读 · 1 评论 -
并查集练习
题目: link.题意:有n个龙珠,第i个在第i个城市,有两种操作:1、T x y , 把第x个龙珠所在城市的所有龙珠转移到第y个龙珠的所在城市。(题目保证所在城市不同)2、Q x ,输出第x个龙珠所在城市,该城市的龙珠数量和该龙珠转移的次数。思路:一看就是个并查集的题目,城市的龙珠的所在城市以及城市的龙珠数量很好求,龙珠的转移次数要处理一下。龙珠的转移次数等于该龙珠的转移次数+他的所有父亲的转移次数。用递归即可解决,好好理解。#include <iostream>#includ原创 2020-10-22 20:02:14 · 134 阅读 · 0 评论 -
2019 山东省省赛 题解
A - Calandar.题意:给两个日期,规定每年12个月,每月30天,已知第一个日期是星期几,求第二个日期是星期几;分析:水题。#include <iostream>#include <cstdio>#include <map>#include <cmath>#include <queue>#include <set>#include <cstring>#include <algorithm&g原创 2020-10-03 16:50:24 · 340 阅读 · 0 评论 -
2020 Multi-University Training Contest 10
A.题意:跟节点是1.第一行输入一个n,代表n个节点,第二行输入n-1个数,代表2~n节点的父亲。如果节点x能走到节点y,点对数+1,只能走向自己的儿子,不能走向父亲。(即单向边)你可以增加一条双向边,求增加一条边后可到达的最大点对数。思路加边后构成的环肯定可以两两到达,所以肯定是选一个叶子节点连接跟节点,在原有点对数的基础上加上增加的点对数。转化为求哪个叶子节点连跟节点后增加的点对数最多。步骤1、dfs记录每个节点的叶子节点2、dfs2遍历树,记录当前路径增加的对点数==n-该节点儿子原创 2020-08-22 10:58:50 · 274 阅读 · 0 评论 -
新冠病毒要回家(次短路)
见了这么多最短路题,来一道次短路!!!新冠病毒要回家.题意:n个点,m条边,求0到n-1的次短路。分析:在最短路的基础上开一个dis2数组记录次短路长度,当需要更新最短路时,把当前最短路的值赋给次短路,然后再更新最短路的值,另外,当前的值比最短路长且比次短路短时,更新次短路的值。基本代码与最短路一致。代码#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define ll long long原创 2020-08-18 09:52:52 · 175 阅读 · 0 评论 -
2020牛客暑期多校训练营(第九场) The Flee Plan of Groundhog
传送门.题意:有一棵树A 在点 1,B 在点 nA的移动速度是每秒走过一条边,B的移动速度是每秒走过两条边(也可以只走一条)前 t 秒 A 在不断的走向 B,B 不动,之后A还是逃,B开始追,问最迟什么时候追上思路:1、dfs找到t秒后A的位置node2、dfs1求出B到追到每个点的时间3、dfs2遍历A逃到每个点的时间,如果小于B追到的时间就继续逃,否则就更新ans代码#include <bits/stdc++.h>#define inf 0x3f3f3f3f// #i原创 2020-08-09 10:23:24 · 880 阅读 · 0 评论 -
大佬题解
TP.转载 2020-07-30 20:37:05 · 263 阅读 · 0 评论 -
dfs + 最短路
传送门 TP.题意阿达莱王国有n座从1到n的城市。由于交通便利,任何两个城市之间都有一条双向公路。东京泽住在第一城。魔术师克拉丽斯住在n市,由于考试马上就要举行了,东京希望尽快营救CJB,所以她会选择最短的路径到达n市。克拉里斯也听到了这个消息,害怕受到惩罚,所以他决定通过在他选择的k条道路上进行爆炸,使这些道路失去双向运输的能力,从而使德川泽慢下来,因为这可以为他有足够的时间准备对付东崎的强大魔法铺平道路。德松子知道一些道路会被摧毁,并能立即识别出它们在哪里,但她没有办法阻止这次爆炸,所以她选择在原创 2020-07-29 18:37:41 · 552 阅读 · 1 评论 -
思维题 循环数组
思维题.题意输入一个n,输入n个数可以进行两个操作第一个操作: 把倒数第二个数放到第一个第二个操作:把第一个数放到最后一个注意连续进行同一个操作算操作一次问把原序列变成1到n的序列最少进行多少次第一个操作分析首先把序列看成一个环,指针指向最后一个数,第一个操作相当于把除了指针所指的数旋转,第二个操作相当于把整个序列旋转,指针指向的数会改变样例1 如果所示,我们可以发现,先找到最长上升子序列,操作1的数量就等于数列长度–最长上升子序列。#include <bits/stdc++.原创 2020-07-25 20:26:08 · 197 阅读 · 0 评论 -
搞不懂的暴搜
暴搜优化.分析:令第 i 种装备的数量为sum[i],显然如果 sum[i]不为 0 那么这种装备必选一件,在这时需要考虑的总方案数为 ∏max(sum[i], 1),其中 ∑sum[i] ≤ 50。最坏情况下所有sum 的值都相同,令它们都等于 k,则方案数为 kn/k ,当 k 取 3 时取到最大值 3n/3 ,在 n = 50 时并不算太大,因此可以直接爆搜所有方案得到最优解。需要注意的是,sum[i] = 0 的部分应该直接跳过,以保证搜索树上每一层的节点数至少是上一层的两倍,使得时间复原创 2020-07-24 10:45:41 · 177 阅读 · 0 评论 -
牛客多校第四场 H 贪心+埃氏筛
Harder Gcd Problem.题意1到n个数,取两个不互质的数配对,求最多能配几对。分析根据题意易得偶数肯定能互相配对,但是像10,14这种偶数也能跟5,7这种素数配对,所有要用贪心的思想,如果单纯的让偶数和偶数配对,那么素数就用不到了,结果可能就不是最优的,如果让把一些偶数取出来去和素数配对,结果就是最大的。所以先让素质去找他的倍数配对,用过的数用vis标记一下。比如n=10 的时候,1到10个数。如果单纯偶数和偶数配: 2和4 , 6和8, 5和10 ,这样3就没有用上,而且才3对原创 2020-07-22 17:11:50 · 161 阅读 · 0 评论 -
贪心BFS
题目 Tractor.代码很好写,就是在经典bfs基础上加一个贪心的思想从起点开始,往四个方向走,碰到有草的且没有走过的就放在最前面优先搜索(可以用双端队列或者优先队列实现);到原点就输出草的数量;优先队列代码#include<bits/stdc++.h>#define ll long long#define T int t;scanf("%d", &t);while(t--)using namespace std;int dx[]={0,0,-1,1};int dy原创 2020-07-22 11:42:11 · 200 阅读 · 0 评论 -
扩展欧几里得 基础
先放一下欧几里得(辗转相除法)求最大公约数int gcd(int a,int b){ return b == 0 ? a : gcd(b,a % b);}学扩展欧几里得之前,先了解一下贝祖定理:如果a、b是整数,那么一定存在整数x,y使得ax+by=gcd(a,b)。换句话说In a way,如果ax+by=n有解,那么n一定是gcd(a,b)的若干倍。(可判断一个这样的式子有没有解)常用 如果ax+by=1有解,那么gcd(a,b)=1也就是说如果gcd(a,b)!=1 无解…在原创 2020-07-19 21:36:43 · 174 阅读 · 0 评论 -
简单dp
题目.Problem Description初始有a,b 两个正整数,每次可以从中选一个大于 1 的数减 1,最后两个都会减到 1,我们想知道在过程中两个数互质的次数最多是多少。Input第一行一个正整数 test(1 <= test <= 1000000)test(1 ≤ test ≤ 1000000) 表示数据组数。接下来 test 行,每行两个正整数 a, b(1 <= a, b<= 1000)a,b(1 ≤ a,b ≤1000)。Output对于每组数据,一行一原创 2020-07-19 20:14:20 · 380 阅读 · 0 评论 -
整除分块——牛客青铜白银局
整除分块.找规律太难了最简单当然暴力求解,但数据是1e13, 必T;所以另寻他法:有许多n/i的值是一样的,而且它们呈一个块状分布以10为例,先打个表i12345678910n/i10532211111n/(n/i)123551010101010我们可以发现n/(n/i)相同的一段n/i也相同,且n/(n/i)的值是n/i相同的一块的最后一个i的下标,所以i=7~10这一段其实不用暴力求一变n/i,只需要(n原创 2020-07-19 09:23:26 · 179 阅读 · 0 评论 -
ST表(倍增)
功能它是解决RMQ问题(区间最值问题)的一种强有力的工具它可以做到O(nlogn)O(nlogn)预处理,O(1)O(1)查询最值原理利用倍增思想,以最大值为例用maxx[i][k]表示区间(i,i+2k)最大值;显然maxx[i][0]=本身;2k=2*2k-1=2k-1+2k-1;所以区间(i,i+2k)=(i,i+2k-1)+(i+2k-1,i+2k)所以可以运用动态转移方程maxx[i][k]=max(maxx[i][k-1],maxx[i+2k-1][k-1]);//预处理f原创 2020-07-17 11:48:30 · 396 阅读 · 0 评论 -
[网络最大流模板题](https://www.luogu.com.cn/problem/P3376).
网络流的相关定义:源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点。汇点:另一个点也很特殊,只进不出,叫做汇点。容量和流量:每条有向边上有两个量,容量和流量,从i到j的容量通常用c[i,j]表示,流量则通常是f[i,j].通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量。很显然的,流量<=容量。而对于每个不是源点和汇点的点来说,可以类比的想象成没有存储功能的货物的中转站,所有“进入”他们的流量和等于所有从他本身“出去”的流量。最大流:把源原创 2020-07-17 10:48:39 · 1543 阅读 · 0 评论 -
二分答案(技巧)
牛牛爱学习.题目描述疫情期间,牛牛宅在家里无事可做,于是就在网上买了n本书,每本书都有一个知识值为ai。每读一本书,牛牛的知识力就会上升ai点。当然了,因为牛牛的精力也是有限的,如果同一天连续读k本书,获得的知识力只能增加ai-k+1点。比如第一天看了知识值为5的书,那么牛牛会获得5点知识力,如果这一天在继续看另一本知识值为5的书,只能获得4点知识力,如果看了前面两本书后在继续看一本知识值为2的书,就只能获得0点知识力。牛牛想知道如果他要获得m点知识力,最少需要看几天。注意:看书不需要按顺序,一本书只原创 2020-06-21 13:00:20 · 711 阅读 · 0 评论 -
恶魔果实
组合题(牛客): 恶魔果实.题目描述牛牛得到了一堆神奇的恶魔果实,每个恶魔果实都给了牛牛一个改变数字的能力,可以把数字a变成数字b,现在牛牛有一个数字x,他想知道吃完这n个恶魔果实后,他可以把数字x变成多少种的数。注:每一个恶魔果实的能力可以重复使用多次,当然也可以不用,存在相同能力的恶魔果实.输入描述:第一行输入一个正整数x(1≤x≤109),和一个正整数n(1≤n≤106),接下来n行,每行一个a(0≤a≤9 )和一个b(1≤b≤9)。输出描述:表示可以变的数字种类数,答案对104+7取模原创 2020-06-21 12:36:00 · 279 阅读 · 0 评论