nod

前端笔记之NodeJS(一)初识NodeJS&内置模块&特点

夙愿已清 提交于 2019-12-05 14:21:17
前端笔记之NodeJS(一)初识NodeJS&内置模块&特点 一、 NodeJS 简介 NodeJS 是开发服务器后台的东西,和 PHP 、 JavaEE 、 python 类似,和传统的浏览器的关注 DOM 的 JS 完全不同,将 JavaScript 触角伸到了服务器端。内核是 Chrome 浏览器的 V8 引擎,解析 JavaScript 的效率是非常快的。 创始人。 在不升级服务器配置的情况下,如何用软件手段来提升服务器性能: Ryan Dahl 大致的感觉到了解决问题的关键是要通过 事件驱动和异步 I/O 来达成目的。 传统的服务器模型:当我们做 I/O 操作的时候( I 表示读, O 表示写), CPU 被磁盘操作阻塞了,此时我们称这叫做“同步 I/O ( synchronous I/O ),阻塞 I/O ( blocking I/O )”。 CPU 会经常对磁盘驱动发出 I/O 命令 此时磁盘特别忙,CPU 就歇着了。造成了资源浪费。上图这种模式叫做“同步 I/O ”。 同步(synchronous):当系统遇见了一个需要耗费大量时间的事情的时候,选择死等。 异步(Asynchronous):当系统遇见了一个需要耗费大量时间的事情的时候,不死等,先做后面的事情,耗时事情做完之后,执行回调函数。 用 PHP 做一个例子:下面程序中红色部分是 I/O 操作,此时 CPU

求出被矩形覆盖过至少两次的区域的面积(扫描线 + 线段树)

北慕城南 提交于 2019-12-02 06:34:45
题目链接: https://vjudge.net/contest/332656#problem/J 思路: 这道题的大体的思路其实还是扫描线的思路。 就是我们要清晰之前我们所说的len 代表的是被覆盖了一次及以上次数的线段长度 为叙述方便,我们假设len[2]为当前线段被覆盖了两次的长度,len[1]为当前线段被覆盖了一次的长度,而len[0]就是这条线段的长度,并且满足len[2]+len[1]=len[0]。 首先,如果当前这条线段已经被覆盖了两次了,那么这条线段的len[2]就应该等于len[0],而len[1]就应该等于0。 其次,如果当前这条线段被覆盖了一次,那么这条线段的len[2]就应该是,左右子线段的len[2]的和加上左右子线段的len[1],当然,前提是当前线段不能是线段树中的叶子结点,否则它就没有左右子线段不是吗?这时候,当前线段的len[2]就应该等于0。而len[1]就等于len[0],最后要注意当前线段的len[1]要减去len[2],以满足len[1]+len[2]=len[0]。 最后,如果这条线段没有被覆盖过,并且当前线段不是线段树里的叶子结点,那么它的len[1]和len[2]都应该从它的左右子线段的len[1]和len[2]得到,如果是叶子结点,那么len[1]和len[2]都等0。 因为采用的是魔改的线段树 所以叶子结点需要多开一个标记 1

Hotel (线段树求解连续区间)

前提是你 提交于 2019-12-02 03:35:08
题目链接: https://vjudge.net/problem/POJ-3667 题目大意:n个连续的房间m个操作。操作分两种, 第一种以1 x形式给出,找到最左的能连续容下x个人的连续房间,并输出左端点的编号,如果找不到就输出0. 第二种以2 l x的形式给出,表示以l为起点的x个房间都清空。 思路: 采用线段树去维护最大连续区间。具体的讲解可以看: https://www.cnblogs.com/lonely-wind-/p/11667471.html 1 #include <math.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <iostream> 5 #include <algorithm> 6 #include <string> 7 #include <string.h> 8 #include <vector> 9 #include <map> 10 #include <stack> 11 #include <set> 12 //#include <random> 13 14 #define ll long long 15 #define ls nod<<1 16 #define rs (nod<<1)+1 17 const int maxn = 1e5 + 10; 18 19 20 struct

洛谷P3826/LOJ2306/UOJ318/BZOJ4946[NOI2017]蔬菜

。_饼干妹妹 提交于 2019-11-26 00:31:51
首先想一想只有一组询问该怎么做。 菜烂掉比较不好处理,考虑反着来,每天都有菜变多,那么就可以贪心地每天选择收益最高的$m$份菜卖掉。具体实现的话,记录每样菜在什么时候烂光,在相应的一天以$a_i+s_i$的权值插进大根堆里,每次取出堆顶时判断一下,如果当前菜是第一次卖则只卖一个,然后把它以$a_i$的权值插回去;否则尽可能卖光,如果今天卖光了的话先临时存起来,今天结束了再插回去,防止堆顶始终是卖完的菜,引发死循环。 假设现在我们已经求出了$100000$天的答案,如何求出$99999$天的呢?我们发现菜烂掉有一个良好的性质:今天能卖的菜昨天一定也能卖。这样的话,我们就可以考虑把$99999m$份菜在前$99999$天卖掉,那么从$100000$天到$99999$天的损失就只有剩下第$100000$要卖的菜。同样地,我们用小根堆来维护最便宜的菜,把它们放在最后一天损失掉一定是最优的,这样就可以由$100000$天的答案倒退回$1$天的答案。 #include<cstdio> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef long long ll; const int N=100050; char rB[1<<21],*rS,*rT,wB[1<<21]; int wp=