笔记
夏水天国
需要学的还有很多
展开
-
Codeforces Global Round 17 A-C (思维题,模拟,二分)
A:思维题,观察后很容易发现最难猜的情况是所有点都被电脑选定了(也就是不会提供额外信息)所以以下的所有分析都是基于所有点都是可疑点当n==1&&m==1,显然不需要探测就能知道目标点在哪当n==1||m==1我们只需要探测这一条线上的一段,即可得知目标点其他情况:均为2,只需要将两个点放在矩形的左上角与右下角,此时两圆相接确定一个点#pragma GCC optimize(3,"Ofast","inline")#include <bits/stdc++.h>#de原创 2021-11-25 10:45:00 · 438 阅读 · 0 评论 -
第23次CCF计算机软件能力认证 A B(思维题X2)
(还没找到题面,代码是靠记忆写出来的,也没地方交题不知道对没对,大体思路对了就行)A题:假设有一个数组a[N],构造一个数组b[N]使得b[i]是a[1]到a[i]中的最大值,现给出b数组,让你构造a数组,a数组可能性有很多,只需要数组总和最大的a数组的值和总和最小的a数组的值其实这题面向样例编程就能解出来了,但其实还是用的贪心思想b数组就像是对a数组每一位上限的一个限制想要构造出来的a最大,就是让a顶着b的上限去搞(说白了就是b)想要构造出来a最小,只需要在每次上限发生变化时,在那个位置放一个原创 2021-09-19 22:56:41 · 528 阅读 · 3 评论 -
Codeforces Round #743C Book(搜索)
#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;int n;vector<int>g[N];//读完i号书后可以解锁哪些书int d[N];//一个书的前置数量int f[N];//某本书读到第几轮才学会void solve() { cin >> n; for (int i = 1; i <= n; i++) g[i].clear(), f[i] = 0原创 2021-09-19 10:34:31 · 98 阅读 · 0 评论 -
Codeforces Round #743B Swaps(思维)
cf变成oi赛制了想要让a数组比b数组小,其实只需要让a数组第一位比b数组小由题目数据特性可知,如果对a,b两数组按值大小进行排序,那么在同一下标下,a数组必定是小于b数组的所以只需要开一个结构体,储该点的值和原本位置。然后按值的大小sort一遍,然后找出下标最靠前的那一对就好#include <bits/stdc++.h>#define int long longusing namespace std;const int N = 1e5 + 10;int n;struct原创 2021-09-19 10:09:49 · 196 阅读 · 0 评论 -
csp202104-4 校门外的树(60分)
满分的做法设f[i]为前i个障碍物所能生成的最多可能性设 cnt[i][j]为从第i个障碍物到第j个障碍物的可行方案数想要求cnt[i][j]只需从位置i枚举所有间隔的可能性,看是否能在不触碰到i,j之间的障碍物的情况下到达j很显然,如果知道了前3个障碍物生成的最多可能性并暴力处理cnt数组,那么当求f[4]时f[4]=f[1]*cnt[1][4]+f[2]*cnt[2][4]+f[3]*cnt[3][4];由于暴力处理cnt时间复杂度过大,所以只有60分#include <bits/原创 2021-09-15 22:58:59 · 321 阅读 · 0 评论 -
AcWing 344. 观光之旅(floyd求最小环)
原题开始口胡:用类似dp的方法,对图中所有环进行分类分类标准是环中编号最大的点for(int k=1;k<=n;k++)由floyd的原理可知当floyd的第一重循环执行到K时(还没开始执行K),所有路径都是进过1到k-1号点所形成的最短距离当进行到K时,枚举i和j,在之前的计算中包含i,j的环的距离是d[i][j]+d[j][i],先插入K点,使式子变成w[i][k]+w[k][j]+d[j][i]取两者最小值,当把所有i,j枚举完,就能求出第K类环的最小值#include <b原创 2021-09-13 21:54:01 · 89 阅读 · 0 评论 -
Educational Codeforces Round 113C Jury Meeting(求组合数)
题目大意:给定一个数组,从左往右对数组中每个数减1,如果当前数为0就不对其操作对这个数组有多少种排列方式,使得一个数不会被连续减两次分类讨论:1:如果数组中最大的数远远大于其他数(最大数–次大数>=2),就没有任意一种排列方式满足题意2:如果数组中的最大数>=2(最大数不止一个)那么无论怎么排列都是满足题意的,答案就是数组数量的阶乘3:存在一个最大数,至少存在一个次大数使得最大数-次大数==1此时判断有哪些非法排列情况:显然,当次大数全部位于最大数的左边时,该排列是非法的不理解的原创 2021-09-10 17:19:09 · 72 阅读 · 0 评论 -
Codeforces Round #742C Non-Decreasing Dilemma(思维题)
题目大意:正常的加法进位:1+9=10,99+1=100alice的加法进位1+9=100,99+1=190正常进位会把进位的数加在前面一位,alice会把数加在前面两位现在给一个数n,要求你找到有多少不同的数对以alice的加法相加时,结果为n可以注意到,正常的加法是将奇数位进位到偶数,偶数位进位到奇数位但alice的加法是奇数位进位到奇数位,偶数位进位到偶数位也就是说,偶数位与奇数位是互不影响的所以可以把一个数按奇偶数位进行拆分,分别计算拆分出的两个数有多少个组合方式,一个k的组合方式有原创 2021-09-07 21:29:20 · 122 阅读 · 0 评论 -
Codeforces Round #742E Non-Decreasing Dilemma(线段树)
题目大意:给一个数组,有两种操作1:改变数组中的一个值2: 求区间中成非递减的子序列有多少个刚开始拿到题感觉:这不就是个板子吗?然后这道板子题就卡了我两天,直到看了别人的代码才知道错哪儿了节点需要维护的信息:左右区间范围当前区间中,合法子序列的数量包含左端点的最长合法子序列的长度(llen)包含右端点的最长合法子序列的长度(rlen)让我们合并两个区间的时候,需要分情况讨论如果左儿子最右端的数大于右儿子最左端的数:父区间的合法子序列的数量就是两个子区间合法子序列的数量如果左儿子最原创 2021-09-07 21:08:37 · 95 阅读 · 2 评论 -
hdu7116 lowbit (线段树+lowbit的性质)
大意:两种操作1给区间内所有ai加上lowbit(ai)操作2:区间问询总和lowbit的性质:lowbit(ai)会取ai二进制下的最高位的1,例如5的二进制是101,lowbit(5)=1,4的二进制是100,lowbit(4)=4;用以下代码可以快速算出lowbitint lowbit(int x) { return x & (-x);}另一个性质:一个数最多进行加log次lowbit,二进制就会变成1000……000的形式,此时再加lowbit就是这个数乘2.用线段树+懒.原创 2021-09-05 10:52:50 · 338 阅读 · 0 评论 -
AcWing 918 软件包管理器 (树链剖分+线段树)
Linux 用户和 OSX 用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu 使用的 apt-get,Fedora/CentOS 使用的 yum,以及 OSX 下可用的 homebrew 都是优秀的软件包管理器。你决定设计你自己的软件包管理器。不可避免地,你要解决软件包之间的依赖问题。如果软件包 A 依赖原创 2021-09-03 14:09:53 · 127 阅读 · 0 评论 -
2021ccpc网络赛06(hdu7106) Function(数学+三分)
原式:f(x)=A(x^2)*g(x)+Bx^2+C*x*(g(x)^2)+D*x*g(x)经过变换后f(x)=(A*g(x)+B)*x^2+(C*(g(x)^2+D*g(x))x假设,我们把g(x)看作一个常数那么原式就会变成Nx^2+Mx就成了一个一元二次方程但是,g(x)是会随着x的变化而变化的但值得注意的是:由于1<=x<=1e6所以1<=g(x)<=54 (g(99999)=54)所以我们可以把x根据其g(x)的值分成54个互相独立的部分,每个部分原创 2021-08-29 20:15:50 · 390 阅读 · 1 评论 -
2021百度之星复赛03 Subtraction (贪心)
#include <bits/stdc++.h>#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)using namespace std;typedef long long ll;const int N = 2e5 + 10;int b[N], p[N];vector<int>g[N];ll ans, bas;int n;int dfs(int u, int fa) { vector&l.原创 2021-08-23 09:55:47 · 178 阅读 · 0 评论 -
2021百度之星复赛02 Add or Multiply 1 (第二类斯特林数)
#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long LL;const int N = 3050, MOD = 1e9 + 7;int n, m;int f[N][N];int A[N];int mul(int a, int b, int c, int d) { int res = 1; res = a * b % MOD; res = res * c % M.原创 2021-08-22 11:15:53 · 71 阅读 · 0 评论 -
程序自动分析 (离散化并查集)
原题需要离散化的并查集题,留作个笔记#include <bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 1e5 + 10;int n, cnt;vector<PII>eqs;//可以相等的两个数vector<PII>uneqs;//不可相等的两个数unordered_map<int, int> H;int p[N * 2];原创 2021-08-20 19:53:11 · 60 阅读 · 0 评论 -
2021牛客多校5B Boxes (数学期望)
大意:给n个盒子,每个盒子里有一个有,为黑白的概率各为1/2,每打开一个盒子要花费w,或者获得一个提示,得知当前未开的盒子里黑球有多少,花费c,要求知道所有盒子中球的颜色的最低数学期望花费开盒子有两种开法:1:全开,花费为盒子权值之和2:在游戏开始时获得提示,此后在一整局里都能知道接下来还有多少黑球(如果开出白球,剩余黑球数量不变,开出黑球,剩余黑球数量-1)如果选择提示,有两种情况可以提前结束游戏:剩余黑球数量为0,或者剩余黑球数量等于当前剩余盒子数量首先对盒子的权值排序,保证最先开盒子的是权值原创 2021-08-19 20:01:50 · 78 阅读 · 0 评论 -
笔记 费马小定理
(a/b)%mod=a*pow(b,mod-2);例题:给定一个数组,多次问询,求区间乘积取余#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;long long a[N], b[N], f[N];long long ans;long long mod = 1e9 + 7;int n, m;long long qmi(long long x, long long y) { long lon原创 2021-08-18 10:45:35 · 70 阅读 · 0 评论 -
2021牛客多校1G Game of Swapping Numbers (思维题)
开始补题QWQ题意:给两个数组AB,任选A中任意两个数交换,共进行K次,求结束后|a[i]-b[i]|总和的最大值易知:|ai-bi|=max(ai,bi)-min(ai,bi)所以可以让c数组取较大值,d数组取较小值c[i] = max(a[i], b[i]);d[i] = min(a[i], b[i]);此时ci>di,cj>dj当di>cj时|ci-di|+|cj-dj|=ci+dj-ci-dj交换di和dj时|ci-dj|+|cj-di|=ci-cj+di-原创 2021-08-18 10:22:27 · 80 阅读 · 0 评论 -
2021牛客多校10F Train Wreck (贪心,思维题)
题意,给一个堆,只支持push和pop,有n个点,每个点都有颜色(可能相同可能不同),现给出push和pop的顺序,让你分别push时放入哪个点,保证此次push后点组成的颜色序列与之前某次push后形成的颜色序列不同如果我们将push当作是创建一个新节点,pop是回溯到上一个节点的话,我们很容易将序列入 入 出 入 出 出 入 出构建成一棵树进过观察可发现,如果仅2,3的颜色相同:设1号颜色为红,23号为橙,4号为黄入 红入 红橙出 红入 红橙出 红出入 黄出可以看到第二行的原创 2021-08-17 16:19:12 · 106 阅读 · 0 评论 -
2021牛客多校9E Eyjafjalla (主席树+倍增法)
调了很久的树套树,最后华丽丽的tle了题目大意:给定一个树形结构,1号点是树根.越接近树根温度越高,现有一种生存温度在[L,R]区间病毒在点X处出现,如果某个节点的温度在[L,R]区间,且与其相邻的点感染了病毒,那么这个点也会感染病毒有很多询问,每次询问在X点爆发一种生存温度[L,R]的病毒,最多能感染多少个点先想想暴力做法:暴力dfs,必然会TLE考虑到题目中给出的是一个树形结构,且温度的增长是有单调性的,病毒传染的过程就可以分成两步:先从当前点出发,找到温度小于等于R且最接近源点的点(找祖先)原创 2021-08-15 12:31:18 · 289 阅读 · 6 评论 -
搜索 模拟退火
例题在二维平面上有 n 个点,第 i 个点的坐标为 (xi,yi)。请你找出一个点,使得该点到这 n 个点的距离之和最小。该点可以选择在平面中的任意位置,甚至与这 n 个点的位置重合。输入格式第一行包含一个整数 n。接下来 n 行,每行包含两个整数 xi,yi,表示其中一个点的位置坐标。输出格式输出最小距离和,答案四舍五入取整。数据范围1≤n≤100,0≤xi,yi≤10000输入样例:40 00 1000010000 1000010000 0输出样例:28284总之原创 2021-08-13 10:53:45 · 201 阅读 · 0 评论 -
2021牛客多校8F Robots(离线分治)
题目大意:在nXm的图上有些障碍物,有三种机器人1:只会往下走2:只会往右走3:又会右走又会下走现给出Q个机器人,已知其起点,终点,类型,问机器人能否到达终点机器人数量很多(5e5),而地图很小(500*500)这就可以考虑离线做法,维护终点,判断哪些起点可以到达该终点用一个结构体来储存这些机器人问询t代表机器人类型,id代表机器人编号,x,y为起点编号struct node { int t, x, y, id;};vectorq[i][j];储存终点为i,j的问询接下来就是如原创 2021-08-10 17:11:58 · 154 阅读 · 0 评论 -
2021牛客多校8D OR(思维题)
补这道题的时候差点死在这上面了orz题目大意:给一个数字n给两个长度为(n-1)的数组b[N],c[N],下标从2开始要求你找到一个长度为n,下标从1开始的数组a[N]满足:b[i]=a[i] | a[i-1] c[i]=a[i-1]+a[i]求这样的数组有多少个2<=n<=1e51<=bi<=2^301<=ci<=2^31由c[i]=a[i-1]+a[i]可知,当我们确定了a[1]后,整个a数组都被确定了所以我们只需要确定有多少个a[1]满足条件原创 2021-08-09 23:49:50 · 149 阅读 · 0 评论 -
2021牛客多校4J 二分最大区间平均数
(差点WA死在这里了)大意:给两个序列a[n],b[m],组成一个矩阵W[n][m],其中w[i][j]=a[i]+b[j],求矩阵中平均数最大的子矩阵刚开始做的时候准备直接前缀矩阵打暴力,但是范围1e5,前缀矩阵暴力是O(n^4),铁tle。后来看w[i][j]特殊的构造方式,于是算了一通设最大平均数区间是a1<=i<=b1 a2<=j<=b2由于w[i][j]=a[i]+b[j],由下图不是很严谨,七分算三分猜。所以问题就变成了分别求两个序列最大平均数区间,然后原创 2021-07-26 17:00:15 · 115 阅读 · 0 评论 -
2021牛客多校6F Hamburger Steak
就是个贪心题,把我卡死了orz算出每个锅煎的最长时间:max(煎全部用的时间-1/锅的数量 +1,煎一个汉堡排用的最长时间)这样能保证当一个汉堡排在当前锅时间不够用,放在下一个煎锅时,不会与上一个煎锅安排的时间出现重叠然后就是贪心往锅里填就行了 #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; struct node { int id;//每个计划的编号 long long l,原创 2021-08-02 22:43:08 · 73 阅读 · 2 评论 -
2021牛客多校7J xay loves Floyd (图论)
题目大意正确的floyd写法for k from 1 to n for i from 1 to n for j from 1 to n dis[i][j] <- min(dis[i][j], dis[i][k] + dis[k][j])错误的floyd写法for i from 1 to n for j from 1 to n for k from 1 to n dis[i][j] <- min(dis[i][j], dis[i][k]原创 2021-08-08 22:46:14 · 180 阅读 · 0 评论 -
2021牛客多校7F xay loves trees (线段树+括号化区间)
拒绝中国大学生英语阅读理解大赛!打得最快乐的一场,因为没有谜语人出题题目大意:给两个有n个节点n-1个边的有向树,让你选择一些点,使得1:在第一个树上,这些点是连通的,而且一个点必定是另一个点的祖先2:在第二个树上,任意两个点互相都不是祖先第一个树就要求了这些点刚好刚好构成一个链,而这些点在第二个树中不能在同一个链里思路是:从第一个树上的某个点开始深搜,当新搜索到的点与当前已搜索到的某个点在第二棵树中位于同一个链上,就返回搜索其他边.所以我们可以用线段树来维护来维护括号化序列首先对第二个树进原创 2021-08-08 12:51:07 · 166 阅读 · 0 评论 -
计算几何 扫描线 矩形面积并
#include <iostream>#include <cstring>#include <algorithm>#include <vector>#define x first#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 1010;typedef long long LL;int n;PII l[N], r[N];原创 2021-08-05 15:20:11 · 66 阅读 · 0 评论 -
2021牛客多校6K Starch Cat(点分治+猫树)
目前的水平还不能独立写出来这道题,所以只好看着标程用自己的码风写了一遍QWQ(不得不说大佬们的代码简直如同加密文件)本题是猫树+点分治+DP 猫树和淀粉质都加了注释,但是DP还没有看懂所以没注释,等以后水平提升了再回来完善DP的部分QWQ#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 5e5 + 10;const int LOGN = 22;struct Rand {原创 2021-08-04 21:55:20 · 562 阅读 · 1 评论 -
数颜色 带修改莫队
添加链接描述墨墨购买了一套 N 支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令:Q L R 代表询问你从第 L 支画笔到第 R 支画笔中共有几种不同颜色的画笔。R P Col 把第 P 支画笔替换为颜色 Col。为了满足墨墨的要求,你知道你需要干什么了吗?输入格式第 1 行两个整数 N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第 2 行 N 个整数,分别代表初始画笔排中第 i 支画笔的颜色。第 3 行到第 2+M 行,每行分别代表墨墨原创 2021-07-22 22:17:28 · 102 阅读 · 0 评论 -
一个简单的整数问题2 ——分块思想
分块本质上是一种暴力算法,是将一个N长的数列分成sqrt(N)块。当有区间操作覆盖了完整的一个块时,就可以只对块进行操作,而不是具体操作到点。这样就能节省下许多时间。给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问数列中第 l∼r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,原创 2021-07-22 11:17:39 · 71 阅读 · 0 评论 -
笔记 数据结构 莫队
#include <iostream>#include <cmath>#include <algorithm>using namespace std;const int N = 50010;const int M = 200010;int n, m;int ans[M];//记录每次问询的答案int cnt[1000010];int cur_ans;int a[N];struct node { //记录问询 int l, r; int id;原创 2021-05-20 16:33:05 · 56 阅读 · 0 评论 -
笔记 数据结构 平衡树
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int N = 100010, inf = 1e8;int n;struct node { int l, r;//左右儿子在tr上的坐标 int key;//二叉搜索树的权值 int val;//堆的权值,让搜索树变得随机,防止退化成一条链原创 2021-05-13 20:31:02 · 57 阅读 · 0 评论 -
公交线路 题解——floyd算法图文详解
#include<stdio.h>#include <algorithm>#include<string.h>#include<queue>using namespace std;const int maxn = 1005;const int inf = 0x3f3f3f3f;int n, m, s, t, tot;int mp[maxn][maxn];int main(){ //freopen("C://input.txt", "r",原创 2021-05-11 22:48:02 · 637 阅读 · 0 评论 -
你能回答这些问题吗
原题链接给定长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:1 x y,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y{∑i=lrA[i]}。2 x y,把 A[x] 改成 y。对于每个查询指令,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行每行 3 个整数 k,x,y,k=1 表示查询(此时如果 x>y,请交换 x,y),k=2 表示修改。输出格式对于每个查询指令输出一个整数表示答案。原创 2021-04-27 23:48:41 · 91 阅读 · 0 评论 -
最强对手矩阵
链接:https://ac.nowcoder.com/acm/contest/13493/G来源:牛客网这一天你来到了蓝桥杯的考场,你发现考场是一个N*M的矩阵。因为你的群友很多,你知道考场内每个人有多强,并且把实力换算成了数值。(因为有的人太弱了,所以可能出现实力值是负数的可能)你想知道考场内实力总和最大的矩阵区域的实力和是多少。(注意:区域是按照矩形划分的)输入描述:第一行两个整数 N M \left(1\leq N \times M \leq 2e5\right)(1≤N×M≤2e5)原创 2021-04-12 20:36:50 · 224 阅读 · 0 评论 -
小明的作业
链接:https://ac.nowcoder.com/acm/contest/13493/D来源:牛客网小明同学最近喜欢上了排列组合,但是现在有这样的一道题把他难住了,已知有一组数字(2,5,3,6,3,6,7,3,7,8)共10个,对于这组数字进行排列后,可以将排列好的数字分为三个部分,且三个部分都是分别有序的(升序或逆序),小明想知道能够有满足条件的多少种排列方式?输入描述:无输出描述:无备注:例如对于重新排列后的一种序列(2, 3, 3, 3, 5, 6, 6, 7, 7, 8)可以分原创 2021-04-12 20:03:56 · 124 阅读 · 0 评论