题解 P3378 【【模板】堆】】的更多相关文章

概念: 堆就是一颗二叉树,满足父亲节点总是比儿子节点大(小).因此,堆也分为大根堆和小根堆,大根堆就是父亲节点比儿子节点大,小根堆正好相反.注意加粗的地方,是每一个节点哦!!!!! 还是直接看例题吧,这样讲起来更加生动. 上题:[模板]堆 解析: 这道题明显就是一个小根堆,那,怎么实现呢?热爱数组的我选择了数组实现明明就是指针不会. 操作1:添加一个数字 这里需要用到两个函数,一个insert函数,用来插入,一个ufix函数,用来更新. void ufix(int i){ if(i <= 1)…
Update 18.2.27----想当年我还用着C..... 看到题解里一堆用C++ STL库中的优先队列,身为C语言选手心里不是滋味 故手打一个优先队列献给坚守在C语言的选手 #include <stdio.h> #define maxn 1000050 int que1[maxn]; int head=1,tail=0; int n; int get() { short int neg=0;int a;char c; while((c=getchar())>'9'||c<'0…
Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f3f3f3f; struct edge { int v, w, next; } e[MAX_M]; int p[MAX_N], eid, n; void mapinit() { memset(p, -1, sizeof(p)); eid = 0; } void insert(int u, int v…
题目链接: https://www.luogu.org/problemnew/show/P1552 分析: 一开始愣是没看懂题,后面发现就是你要找一个树上点集使得各点权值之和小于\(M\),并且找一个点集的公共祖先\(Anc\)(管理者),使\(Anc\)的领导力乘以点集大小最大 一开始想DP,一看数据范围,我们可以稍微暴力一点,枚举每个点作为管理者的答案最大值,我们只要在子树中权值最小的点选起使权值之和小于\(M\)就可以了,一下问题简单了许多. 再暗中观察分析,发现这个信息是可以维护转移的,…
题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include <stdio.h>using namespace std;const int maxn=1000;char str[maxn],pattern[maxn];int Next[maxn];int cnt;int getFail(char *p,int plen){    Next[0]=0;    Nex…
题目链接 题目大意:求序列内长度在$[L,R]$范围内前$k$大子序列之和. ---------------------- 考略每个左端点$i$,合法的区间右端点在$[i+L,i+R]$内. 不妨暴力枚举所有左端点,找到以其为左端点满足条件的最大子序列. 用贪心的思想,这些序列一定是满足题意的.统计后将该序列删除. 但这样直接删除肯定会丢失一部分有用的序列.一些也在前$k$大范围内的序列可能跟删除部分有交集. 所以我们不妨设$maxi$指以$i$为左端点的子序列,以$maxi$为右端点时能取得最…
题目大意:在一个长度为$n$的环型序列中取出$m$个数使这$m$个数的和最大,且要求这$m$个数互不相邻. ---------------------- 考虑维护$nxt$和$lst$,即一个数的前驱和后继.如果此数被选中,那么$a[now]=a[lst]+a[nxt]-a[now]$并且更新前驱和后继,再将更新过后的数扔入堆中. 即反悔机制. 操作$m$次后输出$ans$即可. 代码: #include<bits/stdc++.h> using namespace std; const in…
简单的替换一下字符串. 注意数组开大点. #include<bits/stdc++.h> const int maxm = 100; const int maxn = 100; using namespace std; char buf[maxm + 10][110]; struct tNode { char var[110]; char value[110]; }; tNode node[maxn + 10]; int main() { int m, n; scanf("%d%d&…
];]; void dijkstra(int s) { memset(dis,0x7f,sizeof(dis));ma(v); priority_queue<pair<int,int> >q; dis[s]=; q.push(make_pair(,s)); while(q.size()) { int x=q.top().second;q.pop(); if(v[x])continue; v[x]=; for(int i=f(x);i;i=n(i)) if(dis[v(i)]>…
题目链接:https://www.luogu.org/problemnew/show/P3378 是堆的模板...我懒,STL da fa is good #include <iostream> #include <cstdio> #include <queue> #include <algorithm> using namespace std; priority_queue<int,vector<int>,greater<int&g…