rmq

[算法竞赛进阶指南]图论专题训练

帅比萌擦擦* 提交于 2020-05-04 04:32:17
[TOC] A:最优贸易 题意: 一个国家里有很多个城市,某件物品在所有城市的价格都不同,你可以在一个城市买,另一个城市卖出来获得利益,但是只能进行一次买卖。然后要从1走到n,1到n有单向,也有双向的。 题解:将图分层。邻接表,spfa求出最长路(最大权值)。有三层,一层是不购买也不卖,第二层是买,一到第二层的边权为负。第三层是卖,二到第三层的边权为正。由于有向边的建立,你不能从第二/三层走回第一层图,这保证了你只做一次买卖,而不是无限做买卖。然后再设置一个最终大终点。 其实这题还有很多方法 参考 https://www.luogu.org/problemnew/solution/P1073 #include <bits/stdc++.h> #define ll long long using namespace std; const ll mod=1e9+7; const ll maxn=1e5+7; const ll inf=1<<18; struct u { int v,len; }; int n,m,v[maxn],d[maxn*3+1]; vector<u> vt[maxn*3+1];//邻接表 template<class T> void read(T &res) { res = 0; char c = getchar(); T f = 1; while(c < '0'

2019牛客暑期多校训练营(第三场)G:  Removing Stones(启发式分治)

大兔子大兔子 提交于 2020-05-02 11:52:14
题意: 给定N,表示N堆石子,每堆石子数为a[],问多少个区间,可以满足“石子总和若为偶数,那么可以两两取来自不同堆的石子,直到取完; 如果为奇数,那么排除其中一个,然后可以两两取来自不同堆的石子,直到取完”。 思路: 结论是,如果一个区间的区间和大于等于区间最大值的两倍,则这个区间合法。 考虑分治,我们首先找到区间最大值(为了不重复统计,多个最大值时,统一取最左边的,这个可以ST表示实现),然后考虑跨越这个位置的合法区间个数。枚举一端,另外一段二分即可。 由于分治的性质,我们每次的复杂度要倾向于小的那边,即是一个启发式合并的逆过程,所以启发式分治复杂度是O(NlogN)的,加上二分,这个做法的复杂度是O(Nlog^2N)。 可以参考差不多的题: https://www.cnblogs.com/hua-dong/p/11171241.html 。所以我感觉我遇到的原题还挺多的。 #include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn= 300010 ; int lg[maxn],a[maxn],dp[maxn][ 20 ],N; ll sum[maxn],sum2[maxn],ans; void

Full_of_Boys训练3总结

扶醉桌前 提交于 2020-05-02 10:14:53
题目来源: 2016-2017 ACM-ICPC Pacific Northwest Regional Contest E.Enclosure 先计算出内外两个凸包,枚举大凸包上的点,在小凸包上找到两个切点。计算面积时,就相当于删掉几条原先的边,加上一个新的三角形。同时,可以注意到,如果我们按照顺时针枚举大凸包上的点,那两个切点也只可能朝顺时针方向移动,这样的话,就可以在线性时间内计算出新的切点了。以后补代码。 G.Maximum Islands 贪心方法:把原本的L四个方向的C改成W,然后剩余的C,可以运用最小割的思想,用有效点数减最小割,就是最大的答案。思想来自骑士共存。二分图用的匈牙利算法。 #include <bits/stdc++.h> #define rg register #define pb(x) push_back(x) typedef long long ll; inline int read() { char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } inline write(int x) { if(x>=10) write(x

2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目

点点圈 提交于 2020-05-02 04:21:50
[TOC] 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 每组数据读入一个n和n个字符串。定义前2个与末尾2个字母相同可以连接。问使这个环串的平均长度最大。求这个最大值。不存在输出$No solution$。 思路 平均值公式: $$ Average=(E_1+E_2+.....+E_n)/n $$ $$ Average*n=(E_1+E_2+...+E_n) $$ $$ (E_1-Average)+(E_2-Average)+...+(E_n-Average)=0 $$ 那么可以二分答案: $$ (E_1-Ans)+(E_2-Ans)+...+(E_n-Ans)\geq0 $$ 然后瞎搞spfa。 #include<algorithm> #include<bitset> #include<complex> #include<deque> #include<exception> #include<fstream> #include<functional> #include<iomanip> #include<ios> #include<iosfwd> #include<iostream> #include<istream> #include<iterator> #include<limits> #include<list>

腾讯T4 Java技术专家,他们的技术能力都需要达到什么程度?

≯℡__Kan透↙ 提交于 2020-04-30 19:43:01
大家口中的T4,通常都是腾讯T4技术专家,相当于阿里的P8高级技术专家级别(甚至高一点点),是一线Team leader或者二级域架构师,需要对一个领域的业务非常熟悉并且能够将影响力辐射到其他合作团队。 一般来说一些业务架构、应用架构、产品功能决策、技术选型、协作分工等问题应该在T4层次终结,T4是一线作战的小队长,向下提供决策,向上提供有效的信息。 能达到年入百万的T4 Java技术专家级别,不仅要具备优秀的编程能力和系统设计能力,在技术视野和业务洞察力方面,也要有很深的积淀。 经过我半年多的整理,今天刚好有此机会,我整理了一份架构图谱,主要是针对2-5年左右的Java开发程序员提升的,不管是传统行业还是互联网行业,掌握这些技术基本都能拿到一个不错的薪资,希望对大家有所帮助。 腾讯是国内技术大厂,所以可以参考腾讯的标准,而对T4的要求是什么呢,以下4个小结可以作为参考。 1.代码能力 代码能力是基本功,Java语言本身,包括语言的各个方面包括对并发的理解,对内存使用对理解,对Java运维的理解等等,语言本身外,社区里常用的框架是否可以十分清晰的了解,包括spring,包括他实现的ioc,aop,orm,web机制是否有清楚的认识,有丰富的经验等等。 2.对常用中间件的理解 毕竟在一个大系统中,各种中间件是是否常见的,缓存中间件,消息中间件,例如 redis、memcache

最近树上公共祖先详细图解

旧城冷巷雨未停 提交于 2020-04-29 17:01:12
一、定义 LCA(Least Common Ancestors),树上最近公共祖先,顾名思义,也就是说,对于节点u,v,设x=lca(u,v),则,u和v均在x的子树中,并且x的深度最小。 图画得太丑了 如这幅图中:lca(5,6)=2 ,lca(6,3)=1 ,lca(3,9)=9。 二、解法 (1)dfs序 何为dfs序?即为深度优先搜索遍历完这棵树后所获得的节点访问先后顺序。如上面那副图的dfs序: 求dfs序代码: void dfs ( int x, int depth) //遍历一遍图求dfs序 { int i; len++; ola[len]=x;dep[len]=depth; //ola数组用来存dfs序 vis[x]=len; //标记x并存下x在ola数组中出现的位置 for(i=first[x];i;i=next[i]) { if(!vis[v[i]]) { dfs(v[i],depth+ 1); len++; ola[len]=x; dep[len]=depth; } } } 我们可以发现,任何一个节点出现两次之间,一定包含了他的子树。于是我们在将dfs序与节点深度结合起来看: 我们再来找5和3的lca,可以由下一幅图知道1。 不难发现,我们要找的点即为5和3之间深度最小的点。因此我们只需要将dfs序和每个点在dfs序上的位置预处理出来以后

[总结]2020年2月 OI学习/刷题记录

旧城冷巷雨未停 提交于 2020-04-24 17:04:54
2020/2/1 LibreOJ #2098. 「CQOI2015」多项式 数论+高精度 [POJ 2411 Mondriaan's Dream](Mondriaan's Dream) 插头DP HDU 1565 方格取数(1) 状压DP HDU 2167 Pebbles 插头DP Luogu 「ACOI2020」Assassination Classroom OI 2020 30min 0+0+0+100+0+0 Luogu P6044 「ACOI2020」惊吓路径 倍增 HDU 1693 Eat the Trees 插头DP 2020/2/2 LibreOJ #2099. 「CQOI2015」标识设计 插头DP+离散化 LibreOJ #2100. 「TJOI2015」线性代数 最小割 LibreOJ #2101. 「TJOI2015」组合数学 Dilworth定理+DP LibreOJ #2103. 「TJOI2015」旅游 LCT LibreOJ #2104. 「TJOI2015」棋盘 DP+矩阵快速幂 Codeforces Round #616 (Div. 1) 1h A rk784 2020/2/3 LibreOJ #2102. 「TJOI2015」弦论 SAM LibreOJ #2106. 「JLOI2015」有意义的字符串 数论+矩阵快速幂 Luogu EA的练习赛

RMQ(Range Minimum Query)

China☆狼群 提交于 2020-04-21 07:27:25
问题 RMQ问题是求给定区间中的最值问题。对于长度为n的数列A,回答若干查询RMQ(A, i, j)。返回数组A中下标在[i,j]里的最小值的下标。比如数列 5,8,1,3,6,4,9,5,7 那么RMQ(2,4) = 3, RMQ(6,9) = 6. 解决方法 主要方法及复杂度(处理复杂度和查询复杂度)如下: 朴素(即搜索) O(n)-O(n) ST(实质是动态规划) O(nlogn)-O(1) 线段树(segment tree) O(n)-O(qlogn) 朴素 即是直接搜索,对被查询的空间进行直接遍历,时间复杂度为O(n) ST Sparse Table,它是一种动态规划的方法。 以最小值为例。a为所寻找的数组. 用一个二维数组f(i,j)记录区间[i,i+2^j-1](持续2^j个)区间中的最小值。其中f[i,0] = a[i]; 所以,对于任意的一组(i,j),f(i,j) = min{f(i,j-1),f(i+2^(j-1),j-1)}来使用动态规划计算出来。 这个算法的高明之处不是在于这个动态规划的建立,而是它的查询:它的查询效率是O(1). 假设我们要求区间[m,n]中a的最小值,找到一个数k使得2^k<n-m+1. 这样,可以把这个区间分成两个部分:[m,m+2^k-1]和[n-2^k+1,n].我们发现,这两个区间是已经初始化好的. 前面的区间是f(m,k)

史上最便捷搭建RocketMQ服务器的方法

别等时光非礼了梦想. 提交于 2020-04-17 02:25:55
【推荐阅读】微服务还能火多久?>>> 最近学习使用 rocketmq,需要搭建 rocketmq 服务端,本文主要记录 rocketmq 搭建过程以及这个过程踩到的一些坑。至于有多简单呢,在本机已有Docker环境的情况下只需要三步即可。 从github上面拉取项目 修改 broker.conf 中的 brokerIP1 参数,修改为本机IP 进入 docker-compose.yml 文件所在路径,执行 docker-compose up 命令即可 前言 首先我们是使用 Docker 进行搭建环境的,所以我们先要在自己机器上的安装Docker,具体的安装过程以及对于Docker的介绍官方文档里面说的很清楚了 https://docs.docker.com/get-started/ 。 我们要搭建RocketMQ服务器,那么我们就要知道大概搭建RocketMQ服务器需要部署哪些东西。对于RocketMQ有一个架构图,如下所示。而图中所示的Producer(生产者)和Consumer(消费者)无需我们搭建,因为那是作为一个服务器进行启动的。nameserver就是一个注册中心一样组件,我们可以将其简单理解成springcloud中的Eureka,那么nameserver是需要我们搭建的。broker就是真正处理消息的地方,也是需要我们搭建的。

Codeforces 1335E1

我是研究僧i 提交于 2020-04-15 08:53:16
【推荐阅读】微服务还能火多久?>>> 题面 题意 给定一个长度为 n 的数列 定义要求的回文子数列满足下图条件 其中 x 与 y 可以为 0 即这个回文子数列可以是 数字完全相同 的一个子数列 也可以是 只包含两种数字 ,且其中一种 平均分布 在另一种数字的两侧 求出最长的回文子数列长度 解题思路 在输入时往vector里记录下每个数字出现的位置 然后开始 枚举位于两侧的数字的种类 i( i = 1 ~ 26 ) 首先考虑这个回文子数列只包含一种数字,刚好根据枚举 直接将答案与枚举的字符数量取大(与枚举到的vector[i].size取大) 然后如果出现的次数少于2次,说明不能放在两侧,直接 跳过 这次枚举 否则,再对每一侧拥有多少个数字 i 进行枚举( j = 1 ~ size/2 ) 然后根据 贪心 可以得知,假设枚举出数字 i 在每一侧出现 j 次的话 那就可以取原数列中 最左边 j 个 i 和最右边 j 个 i 作为答案的原位置,再从左数第 j 个 i 的位置 +1 开始,以右数第 j 个 i 的位置 -1 结束,在这段区间内寻找 出现最多次的数字 x 作为答案的中间部分,则这种情况的答案就是 j*2+x出现的次数 优化: (如果用的是RMQ问题的 “静态查找区间内出现最多次数字的次数” 的话可以不需要看这里的优化) 可以发现,在我们枚举 j 的时候,可行的区间永远是连续的