top

2019牛客多校训练第四场C.sequence(线段树+单调栈+前缀和)

自作多情 提交于 2019-11-28 15:59:20
题目传送门 题意 输入整数n,给出两个包含n个整数的序列a和b,找到一个区间[l,r],使在该区间内a序列最小值×b序列区间和的值最大。 题解 遍历a序列,维护单调栈求以当前值a[i]为最小值时的最大可达区间[ L[i],R[i] ](即最大左右边界); b序列先预处理其前缀和pre_sum,后用线段树维护pre_sum数组的区间最值;所以答案就是a[i]×b序列在[ L[i],R[i] ]区间内的和的最大值,不断更新最优解求最大结果即可。 当a[i]≥0时,b序列在[ L[i],R[i] ]区间内的和的最大值为b序列前缀和数组后半部分最大值-前半部分最小值,即: max( [pre_sum(i),pre_sum(R[i])] )-min( [pre_sum(L[i]-1),pre_sum(i-1)] ); 当a[i]<0时,b序列在[ L[i],R[i] ]区间内的和的最大值为b序列前缀和数组后半部分最小值-前半部分最大值,即: min( [pre_sum(i),pre_sum(R[i])] )-max( [pre_sum(L[i]-1),pre_sum(i-1)] ); 时间复杂度O(nlogn)。 Code 1 /*2442ms*/ 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll;

【模板】树链剖分(Luogu P3384)

佐手、 提交于 2019-11-28 10:31:56
题目描述 众所周知 树链剖分是个好东西QWQ 也是 一个代码量破百的算法 基本定义 树路径信息维护算法。 ž将一棵树划分成若干条链,用数据结构去维护每条链,复杂度为O(logN)。 其实本质是一些数据结构/算法在树上的推广 华丽的分割线----------------------------------------------------------------------------------------------------------- 具体步骤 预处理 第一遍dfs求出树每个结点的深度deep[x],其为根的子树大小size[x] 以及祖先的信息fa[x][i]表示x往上距离为2^i的祖先 第二遍dfs ž根节点为起点,向下拓展构建重链 选择最大的一个子树的根继承当前重链 其余节点,都以该节点为起点向下重新拉一条重链 ž给每个结点分配一个位置编号,每条重链就相当于一段区间,用数据结构去维护。 把所有的重链首尾相接,放到同一个数据结构上,然后维护这一个整体即可 修改操作 ž1、单独修改一个点的权值 根据其编号直接在数据结构中修改就行了。 2、修改点u和点v的路径上的权值 (1)若u和v在同一条重链上 直接用数据结构修改pos[u]至pos[v]间的值。 (2)若u和v不在同一条重链上 一边进行修改,一边将u和v往同一条重链上靠,然后就变成了情况(1)。 具体代码

【洛谷P1262】间谍网络

橙三吉。 提交于 2019-11-28 09:48:20
Description 给定n个点 其中p个点可以被贿赂, 被贿赂的金额为x,如果一个点被贿赂,他所指向的点也会被贿赂 求:如果不能全部被贿赂 输出NO以及不能被贿赂的点 否则输出YES和需要支付的金额的最小值 Solution 我们可以通过tarjan缩点,最后扫一遍dfn,若果有一个点并没有被访问过,说明这个点肯定不会被贿赂 直接输出并结束程序 那么如果全部可以贿赂呢?我们想,一个强联通分量里面随便贿赂一个点,其他的全部都会被贿赂 那么我们是不是只在需要在进行tarjan的时候进行比较,求出最小值即可 然而 如果一个强联通分量指向另一个强联通分量,我们就可以用指向另一个的强联通分量里的最小值就可以了 有同学问:如果被指向的强联通分量里面有一个比指向的最小值还小的值,是不是可以用呢? 答案是不可以的 如果选择了指向的强联通分量,我们的花费是x,此时因为他指向另一个强联通分量,所以另一个不需要花钱,所以我们只需要统计入度为0的强联通分量,并且累加答案就可以了 注意:在进行tarjan的时候while(stack[top]! = u)前面后面都要有一个更新答案 因为有2中种特殊情况:u在栈顶和栈尾,当然你也可以不这么写,直接将top+1即可while(stack[top + 1] != u) Code #include <bits/stdc++.h> const int INF =

汇编push,pop

删除回忆录丶 提交于 2019-11-28 08:58:11
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-24,00:40:12 作者By-----溺心与沉浮----博客园 1、BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址). 2、BASE里面存储了一个地址,记录的起始地址. 3、TOP里面也存储了一个地址,记录的是结束的地址. 4、存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节) 5、释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节) 6、如果要读取中间的某个数据的时候可以通过TOP 或者 BASE 加上偏移的方式去读取 7、这种内存的读写方式有个学名:堆栈 堆栈的优点:临时存储大量的数据,便于查找. 在OD中红框位置,随机选取一个内存地址作为我们的栈底与栈顶,我已0x18FFD0为例,用EDX,EBX仿ESP,EBP   MOV EDX,0x18FFD0  TOP   MOV EBX,0x18FFD0  BASE 1、压入数据    压入数据的方法很多 方式一、   MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA   SUB EDX,4 版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-24,00:40:12 作者By-----溺心与沉浮----博客园 代码执行后: 后面的就不上图了

剑指offer 数据流中的中位数

99封情书 提交于 2019-11-28 08:53:01
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 思路:利用两个优先队列,最大堆始终保存前一半数据,最小堆始终保存后一半数据,当两个优先队列长度一样时,将数压入最小堆。 1 class Solution { 2 priority_queue<int, vector<int>, less<int> > p; //最大堆 3 priority_queue<int, vector<int>, greater<int> > q; //最小堆 4 public: 5 void Insert(int num) 6 { 7 //偶数个,应该压入最小堆 8 if (((p.size() + q.size()) & 1) == 0) { 9 if (p.size() > 0 && num < p.top()) { 10 int temp = p.top(); 11 p.pop(); 12 p.push(num); 13 q.push(temp); 14 } else { 15 q.push(num); 16 } 17 } else { //奇数个

程序员,你应该知道的数据结构之栈

眉间皱痕 提交于 2019-11-28 07:59:59
数据结构中的栈不要与 Java 中的栈混淆,他们俩不是一回事,数据结构中的栈是一种受限制的线性表,栈具有先进后出、后进先出的特点,因为栈只允许访问最后一个数据项,即最后插入的数据项。也许你会有疑问,栈既然有这么多限制,为什么不用数组或者链表而使用栈?在开发中,我们有特定的场景,根据特定的场景去选用数据结构,栈的适用场景非常多,比如浏览器的前进与后退、字符串括号的合法性等,我们使用栈来实现就比较好,因为栈相对数组、链表来说对外提供的接口要少很多,接口少了,出错的概率就减少了,对风险的可控性就提高了。 实现一个栈 从栈的定义中可以看出,栈主要有两个操作,一个是新增一条数据,我们叫做入栈,另一个是获取一条数据,称为出栈,下面两张图是入栈出栈示意图。 栈的实现有两种方式,一种是基于数组实现的,我们叫作顺序栈,另一种是基于链表实现的,我们叫作链式栈。下面是两种栈的实现代码 基于数组的顺序栈 /** * 基于数组的顺序栈 */ public class ArrayStack { // 栈最大容量 private int maxSzie; // 存放内容 private String[] array; // 栈顶元素 private int top; public ArrayStack(int size){ this.maxSzie = size; this.array = new String

Linux 性能优化排查工具

♀尐吖头ヾ 提交于 2019-11-28 06:47:35
下图1为 Linux 性能优化排查工具的总结 图1 诊断 CPU 工具 查看 CPU 核数 总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu cores"| uniq 查看逻辑CPU的个数 cat /proc/cpuinfo| grep "processor"| wc -l 或者 top 后按 1,第三行开始数有几个CPU 就是几个逻辑CPU 如图2只有一个逻辑CPU0 图2 top top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。 语法 top [选项] 选项 -b:以批处理模式操作; -c:显示完整的治命令; -d:屏幕刷新间隔时间; -I:忽略失效过程; -s:保密模式; -S:累积模式; -i<时间>:设置间隔时间; -u<用户名>:指定用户名; -p<进程号>:指定进程; -n<次数>:循环显示的次数。 图3 在 Linux 命令终端输入 top

nignx日志实时分析工具 - ngxtop

不想你离开。 提交于 2019-11-28 05:43:25
ngxtop是一款python模块,可实时展示nginx的日志情况,支持自定义日志格式、过滤。 官网: https://github.com/lebinh/ngxtop (2015年之后就没有再更新了,有些可惜) 安装: # pip install ngxtop 使用方法 # ngxtop --help ngxtop - ad-hoc query for nginx access log. Usage: ngxtop [ options ] ngxtop [ options ] ( print | top | avg | sum ) < var > .. . ngxtop info ngxtop [ options ] query < query > .. . Options: -l < file > , --access-log < file > access log file to parse. -f < format > , --log-format < format > log format as specify in log_format directive. [ default: combined ] --no-follow 默认情况下ngxtop只会分析新增日志 ( 类似tail -f ) ;使用这个选项使ngxtop分析日志文件中的已有日志 -t < seconds

FLask的偏函数应用

血红的双手。 提交于 2019-11-28 04:32:50
偏函数 import functools # 偏函数 def func(a1,a2): print(a1,a2) new_func = functools.partial(func,123) new_func(2) Flask中的偏函数应用: def _lookup_req_object(name): top = _request_ctx_stack.top if top is None: raise RuntimeError(_request_ctx_err_msg) return getattr(top, name) def _lookup_app_object(name): top = _app_ctx_stack.top if top is None: raise RuntimeError(_app_ctx_err_msg) return getattr(top, name) request = LocalProxy(partial(_lookup_req_object, "request")) session = LocalProxy(partial(_lookup_req_object, "session")) g = LocalProxy(partial(_lookup_app_object, "g")) 第一个参数:自定义函数或者是python内置函数 第二个参数

悬浮广告特效

谁都会走 提交于 2019-11-28 03:58:05
<!DOCTYPE html> <html lang=" en"> <head> <meta charset=" UTF-8"> <title>悬浮的小广告 </title> <style> .left{ width: 100px; height: 150px; background-color: orange; position: absolute; top: 250px; left: 0; } .left span{ position: absolute; top: 0; right: 0; display: block; } .right{ width: 100px; height: 150px; position: absolute; background-color: orange; top: 250px; right: 0; } .right span{ position: absolute; display: block; top: 0; left: 0; } .center{ position: absolute; left: 12%; } </style> <script src=" js/jquery-1.11.3.min.js "> </script> <script> $(function(){ var num = $('.div1').offset()