【题解】导弹拦截(求最长不上升子序列·求最长上升)

导弹拦截这道题可以用树状数组、线段树什么的优化但是我一个都不会而这道题的数据范围又很大c++奥赛一本通(meng)上o(n2)的算法过不了所以本蒟蒻来说一个o(nlogn)的算法问题转换第一问很容易就可以想到是求一个最长不上升子序列但是第二问就需要一个转换的思想了引理:Dilworth定理:偏序集的最少反链划分数等于最长链的长度我们可以把问题中需要几组导弹转化成求一个最长上升子...
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】博弈论习题

学习链接:https://blog.csdn.net/jk_chen_acmer/article/details/82082653https://blog.csdn.net/dgq8211/article/details/7602807https://blog.csdn.net/YangHao5/article/details/88972326取石子游戏 2#include <cs...
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】博弈论概念

一般地,我们把满足有两名选手;两名选手交替对游戏进行移动,每走一步,选手可以在(一般而言)有限的合动集合中任选一种进行移动;对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素;如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。的模型叫做公平组合游戏。如果...
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【模板】不定方程ax+by=c的解

先解方程ax+by=gcd(a,b)的特解,再还原到原方程,写出通解方法:拓展欧几里得(递归降系数)首先对于ax + by = gcd(a,b),当b=0时,x=1,y=0是一组解(递归算法出口)对于一般情况:ax1 + by1 = gcd (a, b)bx2 + (a % b) y2 = gcd (b, a % b)系数a,b 降低了(最终a%b为0),注意观察x1,y1,x2,...
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】前缀单词

引理:把这些字符串排序后,对于任意一组j<i且他们不互为前缀,则对于任意一组k<j且他们不互为前缀,则k与i不互为前缀。证明:若k与i互为前缀,则k的长度必然小于i,那么i与k之间必然仅有以k为前缀的字符串,则k必然为j的前缀,矛盾。这个证明与后缀数组求高度数组的O(n)算法的证明有点像于是dp式就显而易见了。dpi表示前i个数选i的方案总数,答案就是加起来后加一就行了。代码如下:#include <cstdio>#include <iostream&gt
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】Cover/绝世好题/挂饰

#4620. Cover题目描述你在一个坐标系中获得N个点,它们需要一个或多个矩形进行覆盖,以满足下面这些条件:·每个矩形的边与坐标轴平行·每个矩形的中心位于原点,即点(0,0)·每个给定的点位于矩形的内部或边界上。当然,你可以使用一个矩形覆盖所有的点,但这个矩形的面积可能非常大。我们的目标是找到所需的矩形,使这些矩形的面积总和最小。题解:本题只需要对问题进行转化即可每个点都可以等效成一象限的点,因为每个矩形对每个象限是等效的考虑点a,b,若a.x<b.x&&a.y
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】[初一编程社暑假集训前难题复习]

A. 扩散解析:二分时间+并查集判连通性*B. 赶牛入圈解析:大概是二维前缀和+离散化C. 老鼠与猫的交易解析:贪心,a[i].s=a[i].p/a[i].va[i].s=a[i].p/a[i].va[i].s=a[i].p/a[i].v,从大到小排序即可*D. 火柴排队E. 旅行家的预算忘了。。找时间再看一下F. [NOIP2004]虫食算咕咕咕G. 马里奥的梯子解析:二分梯子长度,然后BFS,没难度,简单的跑图,边权也没有H. 抓住那头牛解析:BFS即可,边权为1,没难度I
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】区间DP(7.18)

#7095. 删除字符串题目描述给出一个长度为n的字符串,每次可以删除一个字母相同的子串,问最少需要删多少次。 数据规模:n <= 500输入格式第1行:1个整数,表示字符串的长度第2行:n个字符的字符串输出格式第1行:1个整数,表示答案样例样例输入5abaca样例输出3解析:我们考虑割点设dp[i][j]dp[i][j]dp[i][j]表示删去i到j的最小步数若a[i]==b[j],则dp[i][j]=dp[i+1][j−1]a[i]==b[j],则dp[i][j]
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】二叉堆(7.20)

一.概述堆一般有两个重要的操作,put(往堆中加入一个元素)和get(从堆中取出并删除一个元素)。put一般用来建堆和维护堆,get则是得到最小值。堆在NOIP竞赛中应用广泛,常用与快速查询最大(最小值),优化各种算法(如:最短路算法、DP算法),是一种效率高,应用广泛的数据结构。显然,堆只能以一个关键字作为顺序,若一个决策涉及时间和权值,那就必须转换问题,使时间(或权值)的条件弱化,这样就可以愉快地贪心了下面以大根堆为例:void up(node x) { heap[++cnt]=x; in
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】字符串hash(7.25)

一.概述Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。Hash算法还具有一个特点,就是很难找到逆向规律。Hash算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。 [1]Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】树状数组(7.26)

一.概述树状数组,是一个区间查询和单点修改复杂度都为log(n)的数据结构。主要用于查询任意两点之间的所有元素之和。树状数组的题多半要转化,利用差分数组,可以将区间修改变为单点修改,单点查询变为区间查询(即前缀和)。只要满足单点修改,我们总能用树状数组来维护前缀和。bit[i]bit[i]bit[i]数组可以看作一个树形结构,它满足以下三个性质:每个内部节点bit[x]bit[x]bit[x]保存以它为根的子树中所有叶节点的和每个内部节点bit[x]bit[x]bit[x]的子节点个数等于low
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】乌龟跑步(#3397)

一只乌龟由于智商低下,它只会向左或向右走,不过它会遵循主人小h的指令:F(向前走一步),T(掉头)。现在小h给出一串指令,由于小h有高超的计算能力,他可以马上知道乌龟最后走到哪里。为了难倒小h,他的好朋友小c就说,现在让你修改其中n个指令,使得乌龟移动到离起点最远的地方。(修改是指“T”变成“F”,或“F”变成“T”,可以对同一个指令多次修改)。乌龟一开始在0点解析:这道题的错因是没有理解清楚题意,不是做不来,实在是看题不够仔细。。一定要警醒自己!(莫非真的是理解能力不行?)首先,本题有两个操作:向
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】最短路模板+最小路径生成树

Dijkstra#include<bits/stdc++.h>using namespace std;int n,m,st,ed,dis[2505];bool vis[2505];struct edge{ int v,w; edge(){} edge(int V,int W) {v=V,w=W;}};void read(int &x) { int f=1;x=0;char c=getchar(); while(c<'0'||c>'9') {if(c=
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】「NOIP2016」蚯蚓

经典的队列优化题,细节贼多,本人抽时间补一下详解。#include<bits/stdc++.h> using namespace std;const int inf=-0x3f3f3f3f;int n,m,q,u,v,t,in[100005],delta;double p;queue<int> a,b,c;void read() { scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【模板】有向图tarjan

本人只会模板。。。#include<bits/stdc++.h>using namespace std;const int N=10005,M=50005;vector<int> son[N];int dfn[N],low[N],num,s[N],out[N],top,cnt;int scc[N];int sz[N],n,m; void tarjan(int u) { low[u]=dfn[u]=++num,s[++top]=u; for(int i=0;i&
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】初学数论(筛素数)

埃氏筛用素数筛合数,代码简单,拓展性强。复杂度O(n∗loglogn)O(n*loglogn)O(n∗loglogn),可以看作常数较大的n。运用:对于求[l,r]的素数,可以用[1,sqrt(r)sqrt (r)sqrt(r)]的所有素数来筛区间[l,r],相比直接求[1,r]的线性筛更优,因为线性筛对每个数有且仅能筛一个数,而这个数很有可能不在区间内,是无意义的。void work() { for(int i=2;i<=n;i++) { if(!b[i]) { pri[++cn
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】次小生成树/最小度限制生成树

问题描述给定一张NNN个点MMM条边的无向图,求无向图的严格次小生成树。设最小生成树的边权之和为sumsumsum ,严格次小生成树就是指边权之和大于sumsumsum的生成树中最小的一个。引理先建出一棵最小生成树,满足使用的边都是最小的,剩下的边(称为非树边)一定没有树边优。如果我们加入一条非树边,删除最小生成树中的一条边,次小生成树一定是包括在以这种方法建出的树中的。证明:既然次小生成树SSS比某个生成树大,不妨设这个生成树是TTT。TTT一定可以用SSS替换一条边得到(否则说明SSS是MS
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】道路航线

#include <bits/stdc++.h>using namespace std;const int N = 2.5 * 1e4 + 5;const int M = 5 * 1e4 + 5;struct rec { int x, y, z;} e[M];struct edge { int v, w;};void read(int &x) { int f = 1; x = 0; char c = getchar();
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【题解】可爱路径【第四周】

请勿抄袭~#include<bits/stdc++.h>#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize("Ofast")#pragma GCC optimize("inline")#pragma GCC optimize("-fgcse")#pragma GCC optimize("-fgcse-lm")#pragma GCC optimize("-fipa-sra")#pragma GCC
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0

【总结】欧拉回路

A.原始生物一句话题意:给定一个连通块,求其经过所有边的节点数量最少和(不一定是一笔画,可以多笔划)。于是我们可以统计每个点在路径中出现的次数,累加即可可以这样想:对于节点i的入度为ininin,出度为outoutout,则出现次数为max(in,out)max(in,out)max(in,out).因为数量少的一类边一定先被遍历完,所以最后还要单独构造abs(in−out)abs(in-out)abs(in−out)个点。题目并没有告诉你整个图联通,我们可以推广,分别求出每个连通块的答案,累加即可
分类: 其他 发布时间: 09-26 11:46 阅读次数: 0