传送门 好题. 目测只会多带一个log2(n+m)" role="presentation" style="position: relative;">log2(n+m)log2(n+m)的解法,看了题解之后才会正解. 解析: 我们用三个队列来维护每次弹出的值. 第一个队列就是原数列. 第二个队列是每次砍掉后短的那一节组成的,第三个队列是长的那一节组成的. 显然这三个队列都具有单调性. 那么每次从三个队列中选一个最大的然后压入后两个队列里就行了. 实现…
题目链接:https://vijos.org/p/2007 题目链接:https://www.luogu.org/problem/show?pid=2827#sub 说实话当两个网站给出AC后,我很感动....这题啊,思路容易想到,就是小细节太烦了..... [思路] 这道题要开三个队列,而且需要证明到一个点才能够做.. 就是先切的蚯蚓的部分,比后切的蚯蚓的对应部分长...有可能你会想蚯蚓不是随时在长吗,当然这不影响..我们来简单证明一下 ----------------------------…
描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递,在连续 m 个烽火台中至少要有一个发出信号.现在输入 n,m 和每个烽火台的代价,请计算总共最少的代价在两城市之间来准确传递情报. 输入 第一行是 n,m ,表示 n 个烽火台和连续烽火台数 m : 第二行 n 个整数表示每个烽火台的代价 ai 输出 输出仅一个整数,表示最小代价. 样例输入 5 3…
易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define ll long long using namespace std; ; ; ; int n,m,q,u,v,t,add; ][M],head[],tail[…
题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加一个定值$q$. 每次询问被蚯蚓被切前的长度 Sol 用堆模拟可获得$50 - 85$不等的分数. 蚯蚓的长度有单调性.然后这题就做完了... 首先把$a[i]$排序 我们分别维护三个数组$a, b, c$,分别表示未被切的蚯蚓,被切成$p * a[i]$的蚯蚓和被切成$a[i] - p * a[i…
传送门 就是一个exgcd的板子. 但注意算距离差的时候是在一个环上面算. 还有,答案要开long long233... 注意这两点之后就是exgcd板子了. 代码: #include<bits/stdc++.h> #define ll long long using namespace std; inline ll gcd(ll a,ll b){while(b){ll t=a;a=b,b=t%a;}return a;} ll a,b,c,d,e,T_T,x,y,tmp; inline voi…
传送门 01分数规划板子题啊. 就是简单变形移项就行了. 显然 ∑i=1na[i]∑i=1nb[i]≤k" role="presentation" style="position: relative;">∑ni=1a[i]∑ni=1b[i]≤k∑i=1na[i]∑i=1nb[i]≤k 于是我们二分k. 只需检验: ∑i=1n(a[i]−b[i]∗k)≤0" role="presentation" style="…
传送门 听说正解是缩点+dfs? 直接bitset优化floyd传递闭包就行了.(尽管时间复杂度是假的O(n3/32)" role="presentation" style="position: relative;">O(n3/32)O(n3/32)) 代码: #include<bits/stdc++.h> using namespace std; bitset<2005>f[2005]; int ans=0,n; char…
传送门 显然需要先求出ab" role="presentation" style="position: relative;">abab的所有质因数和它们的指数. 但求出来之后并不能直接上等比数列求和公式. 因为这道题并不能直接求逆元. 原因? a的某个因数有可能已经大于9901了. 于是它可能是9901的倍数. 这样就gg了. 于是我们可以二分求解等比数列的和. 代码: #include<iostream> #include<cma…
传送门 一道神奇的搜索. 直接枚举每个质因数的次数,然后搜索就行了. 显然质因数k次数不超过logkn" role="presentation" style="position: relative;">logknlogkn,因此搜索很快. 注意,如果最后剩下的乘积-1是一个质数,那么这是一个可行解. 另外对于这道题,我们只需要筛出1e5的素数就够了,太大的直接枚举自己打的素数表判就行了. 代码: #include<bits/stdc++.h&g…
Knapsack 题目背景 SOURCE:NOIP2016-RZZ-4 T2 题目描述 有 n 个物品,第 i 个物品的重量为 ai . 设 f(i,j,k,l,m) 为满足以下约束的物品集合数量: 集合中所有物品的重量和恰好为 m . 集合包含物品 i 和物品 j . 集合不包含物品 k 和物品 l . 给出一个正整数 s ,求: 答案对 10^9+7 取模. 输入格式 第一行,两个正整数 n,s . 第二行,n 个正整数 ai,描述每个物品的重量. 输出格式 输出一行,一个整数表示答案对 1…
时限12s! 所以我用了线段树的黑暗做法,其实正解是用单调队列来做的. //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> #define N 1000001 #define lson l,mid,pos*2 #define rson mid+1,r,pos*2+1 using namespace std; int n,k,xx,yy,ansmax,ansmin,tree[N*…
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐蛐国里现在共有n只蚯蚓(n为正整 数).每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,...,n),并保证所有的长度都是非负整数(即:可 能存在长度为0的蚯蚓).每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个) 将其切成两半.神刀手切开蚯蚓…
描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以把通天河看成一列格子,从0编号到N,孙悟空只能从小号格子到大号格子,当他在第i号格子,他移动的时候只会到[i+L,i+R]的某一格.每一个格子有一个魔法数Wi,第0号格子指数诶0,当孙悟空在某一格停留时就会获得这个魔法值Wi.孙悟空希望通过通天河时获得最大的魔法,这样他才能狠打一下鲤鱼精,可是孙悟空…
题干 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐蛐国里现在共有n只蚯蚓(n为正整数).每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,...,n),并保证所有的长度都是非负整数(即:可能存在长度为0的蚯蚓).每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)将其切成两半.神刀手切开蚯蚓的位置由常数p(是满足0<…
传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> #define N 500005 using namespace std; inline int read(){ int ans=0,w=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();} while(isdigit…
传送门 单调队列优化dp好题. 这题其实很简单. 我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: relative;">O(T∗n∗m)O(T∗n∗m)的算法,就是以时间点与坐标转移. 然后我们可以改成时间段和坐标转移. 时间复杂度O(k∗n3)" role="presentation" style="position: relative;&quo…
传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj<kj<k和j>kj>kj>k的情况我们分别对第二维建立单调队列转移. 代码: #include<bits/stdc++.h> #define N 2005 using namespace std; inline int read(){ int ans=0; char…
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 5943    Accepted Submission(s): 2004 Problem Description Before…
[Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐蛐国里现在共有n只蚯蚓(n为正整 数).每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,...,n),并保证所有的长度都是非负整数(即:可 能存在长度为0的蚯蚓).每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题大概不是原题. 很简单的题目(对于大佬而不对于我来说),做过一次. 具体做法: 首先二分答案平均值(最好用long double保证精度) 然后根据前缀和来单调队列判断. 假设当前要判断的答案为x. 我们把原序列的每一个数都减去x. 那么前缀和数组的第i个就减掉了i*x 那么我得到了一个新的前缀和数…
构建三个单调队列(用STL),分别储存未切的蚯蚓,切后的第一段,切后的第二段,即可简单证明其单调性. 证明:设$q$为单调队列$\because a_1 \geqslant a_2 \geqslant a_3 \geqslant \dots \geqslant a_n$$\therefore a_2\leqslant a_1 ,p\cdot a_1 \leqslant a_1,(a_1-p\cdot a_1)\leqslant a_1$$又 \because a_x 取自,a_2,(p\cdot…
传送门 求仙人掌的直径. 感觉不是很难. 分点在环上面和不在环上分类讨论. 不在环上直接树形dpdpdp. 然后如果在环上讨论一波. 首先对环的祖先有贡献的只有环上dfsdfsdfs序最小的点. 对答案有贡献的则是环上的任意两个点. 对于环上任意两点(i,j)(i,j)(i,j) Ans=max(Ans,f[i]+f[j]+dist(i,j))Ans=max(Ans,f[i]+f[j]+dist(i,j))Ans=max(Ans,f[i]+f[j]+dist(i,j))其中distdistdis…
传送门 这道单调队列真的有点难写啊. 方程感觉挺简单的. f[i][j]f[i][j]f[i][j]表示在第iii个车间结束前jjj次步骤的最小代价. 然后用单调队列毒瘤优化一下就行了. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second const int M=100005; int m,n,L,hd[6][6],tl[6][6]; l…
传送门 NOIP练习题. f[i]f[i]f[i]表示去的时候选了iii且回来的时候第一步走的是i−1i-1i−1的最优值. 显然f[i]=maxf[i]=maxf[i]=max{f[j]−sum[j]f[j]-sum[j]f[j]−sum[j]}+sum[i−2]+a[i]+a[i−1]+sum[i-2]+a[i]+a[i-1]+sum[i−2]+a[i]+a[i−1] 直接上单调队列优化就行了. 注意有可能只跳前kkk个直接回到原点的情况. 代码: #include<bits/stdc++.…
Sort 题目背景 SOURCE:NOIP2016-RZZ-4 T1 题目描述 给你一个长度为 n 的排列,小W每次可以选择一个数,做以下操作: 不断把这个数与它右边的数交换. 当它右边没有数,或它右边的数比它大时,停止操作. 比如序列 1 4 3 2 5,对 4 操作后就是 1 3 2 4 5 . 求最少需要进行几次操作,使得这个排列变成升序. 输入格式 第一行一个正整数 n . 第二行 n 个数,从左到右描述给定的排列. 输出格式 输出一个数表示答案. 样例数据 1 输入 5 3 2 5 1…
考虑静态怎么做:枚举右边界,然后枚举上边界,对应的下边界一定单调不降,单调栈维护每一列从当前枚举的右边界向左最长空位的长度,这样是O(nm)的 注意到n>=m,所以m<=2000,可以枚举右边界,然后考虑怎么快速知道当前枚举的右边界向左最长空位的长度 用线段树维护行,每个节点都维护一段连续的列,p[ro][i]表示当i列从ro的区间最上面开始有多少行是全空的,q[ro][i]表示从下,v[ro][i]表示i列向左扩展最大的最大全空正方形的边长,大概是下面这种感觉: 然后p和q合并的时候类似HO…
题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a conta…
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和队尾都可以进行出队操作,但只有队尾能够进行入队操作. 至于如何来维护单调队列,这里以单调递增队列为例: 1.如果队列的长度是一定的,首先判断队首元素是否在规定范围内,如果不再,则队首指针向后移动.(至于如何来判断是否在制定范围内,一般而言,我们可以给每个元素设定一个入队的序号,这样就能够知道每个元素…
类型:单调队列 传送门:>Here< 题意:有$N$只蚯蚓,每秒都会伸长$q$.每一次都会有人选出最长的一条切成两半,长度分别是$\left \lfloor px \right \rfloor$和$x - \left \lfloor px \right \rfloor$ 询问每一秒最长的蚯蚓被切前的长度,以及$m$秒后每条蚯蚓的长度(从大到小排序) 解题思路 NOIp的subtask还是非常良心的.于是决定不看题解开始干…… 看完题目,花了10分钟打了一个超级暴力模拟,35分get 然后发现有…