题目传送门 这道题开始看起来会很晕...\(qwq\).首先我们要明确题目中的海拔&&温度.温度是受海拔影响的,每次改变的是海拔,我们求的是温度. 我们开始读入的时候便可以处理出开始\(N\)位置的温度以及各个位置的海拔差.每次读入影响的是一段区间,区间内的相对海拔是不变的因此温度也不会变.只有区间的边界可能受到影响.因此我们只要处理边界就行了:这便是差分的思想. 比如有\([l,r]\)区间需要处理,那么我们把\(l\)位置的原答案减去,把\(l\)位置的海拔改变,并加上新答案.再对\(…
分析 我们发现改变一个区间实际上只有两个端点的贡献变换 代码 #include<bits/stdc++.h> using namespace std; #define int long long ],s[],x,y,z,n,m,q,i,j,k,Ans=; signed main(){ scanf(],&s[]); ;i<=n;i++)scanf("%lld",&a[i]); ;i--)a[i]-=a[i-],Ans-=a[i]*s[a[i]>];…
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 HHH 行 WWW 列的长方形网格,每个 1×11\times 11×1 的子网格都是一个正方形的小区块.为了提高管理效率,我们决定把整个国家划分成两个省 JOI 和 IOI . 我们定义,两个同省的区块互相连接,意为从一个区块出发,不用穿过任何一个不同省的区块,就可以移动到另一个区块.有公共边的区块…
loj 首先,所有位置最多被染色一次,因为要染多次的话,还不如一开始就染成最终的颜色.并且你可以一开始就染好色 因为最终长度为2,那么如果染完后这个序列可以被折完,那么首先最多只有两种颜色,还有就是要满足对于所有同色极大联通块长度都要是偶数,不过第一个和最后一个长度可以为奇数 证明的话,先证充分条件,即这样子一定合法.可以搞出一个方法,每次只操作后面.先把最后面一个连通块长度缩成1(这样一定最优),然后因为接下来一个连通块长度为偶数,所以可以把接下来那个轴对称翻过去,然后重复这个操作直到长度为2…
分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace std; ][],n,m,Ans=1e9+,mx,mn=1e9+; inline bool ck(int x){ int i,j,k,l=mn+x,r=mx-x,lim=m; ;i<=n;i++){ ;j<=lim;j++) if(a[i][j]<r)break; lim=min(lim,j-…
分析 我们发现到达一个点一定是先快车再准快车再慢车 于是快车将1-n分为多个区间 每次取出每个区间当前能到达的点的数量 选剩余时间贡献最大的的一个取得贡献并且再能到达的最远点建立准快车 代码 #include<bits/stdc++.h> using namespace std; #define int long long ],t[],now[],Ans; priority_queue<int>q; signed main(){ int i,j,k; scanf("%ll…
题意 loj 做法 首先我们观察到最后能折起来的充要条件是: 只有两个颜色,除首尾外,所有颜色块内的数量为偶数 因为为偶数,我们进一步推论: 所有颜色块起始位置奇偶性相同 然后因为增与减都会有相同花费,不失一般性,只考虑将必须保留的\(c\)增加更多的位置 而增加的位置只在\(c\)颜色块的两边 分类讨论起始位置的奇偶性即可…
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,|0|,|?|)\le 6\),我们只需要推出一个\(2^{|0|}\)和\(2^{|1|}\)的容斥式子 而这个式子也是很好推的. 考虑子集反演: \(f(S)=\sum\limits_{T\subseteq S}g(T)\) \(g(S)=\sum\limits_{T\subseteq S}(-1…
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们把这棵树长链剖分,每次在所有轻儿子中找深度最大的,去掉距离u小于这个深度的栈里的点,然后去计算u的重儿子 然后去掉距离u小于重儿子深度栈里的点,但是要再把u加进去,再遍历u的其他儿子 最后重新去掉u,计算答案,用直径两端当根都做一遍,取深度较大的那个 统计的话直接在外面开一个数组,弹出弹入的时候判断…
[题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操作来说,只要保证前面飞行合法就不需要上升.当且仅当我飞不过去了才上升. 对于下降操作来说,只要我不会越过目标点就不需要下降.当且仅当我会越过目标点才下降. 也就是说,上升和下降操作是不需要手动进行决策的,不存在一种更优解使得这种解通过提前上升或者下降来使得时间花费缩短.因为假设存在一种"更优解&qu…
「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高(每下降1m都要1单位时间),而必然高度越高越好,因此只需求花费的最少时间. 对于高度为0的情况,显然花费的时间越少越好. 高度不为0的情况比高度为0的情况要优越,而且事实上,高度不为0的情况花费必然会小于高度为0的情况.因此两种情况可以直接合并. 故可以直接dijkstra跑一遍. 复杂度\(o(…
「JOI 2015 Final」城墙 复杂度默认\(m=n\) 暴力 对于点\((i,j)\),记录\(ld[i][j]=min(向下延伸的长度,向右延伸的长度)\),\(rd[i][j]=min(向左延伸的长度,向上延伸的长度)\)(遇到不能放的停止) 那么枚举左上端点\((i,j)\)和右下端点\((i+len-1,j+len-1)\),能够被计入答案要求\(ld[i][j] \geq len , rd[i+len-1][j+len-1] \geq len,len>=L\). 复杂度\(o(…
「JOI 2015 Final」舞会 略微思考一下即可知该过程可以化为一棵树.(3个贵族中选择1个,即新建一个节点连向这3个贵族). 该树的结点个数为\(2n\). 考虑二分答案mid. 判定的是公主是否能和熟练度大于mid的人跳舞. 这样子是满足单调性的. 将熟练度大于等于mid的人设为1,小于mid的人设为0. 考虑dp. 每个结点记录需要多少个1才能使得它的值为1. 事实上,儿子只需要有两个1即可,故从三个儿子中取最小的两个. 复杂度\(o(nlog(n))\). #include<bit…
「JOI 2015 Final」分蛋糕 2 题解 这道题让我想起了新年趣事之红包这道DP题,这道题和那道题推出来之后的做法是一样的. 我们可以定义dp[i][len][1] 表示从第i块逆时针数len块的一个扇形,JOI先拿,JOI的所得. dp[i][len][0] 表示从第i块逆时针数len块的一个扇形,IOI先拿,JOI的所得. 我们发现,dp[......][len][......]可以从dp[......][len - 1][......]转移过来,所以考虑先len 从小到大枚起. 详…
题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判定,倒着做,统计I的个数cnt,已组OI的个数tot,以及JOI/IOI个数ans.对于J显然直接找一个OI组成答案.对于O显然直接找I.对于I需要贪心考虑,假设目前的cnt+tot+ans>=x那么就组答案,否则做OI里面的那个I,让cnt++.(贪心考虑只需要造x个OI,造多了会浪费) #inc…
嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让我想到很久以前的一道NOIP题,铺地毯.那是我第一次接触逆向思维,觉得十分的巧妙,原本要写的很麻烦或者干脆写不出来的题,反着想,竟然几行就完事了. 不扯别的了,还是说一下这题怎么想吧-- 把操作离线,然后倒着操作,上移变成了下移.但是每一次移动两维的坐标都会改变,十分的难受.于是我们把坐标轴旋转45…
太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并且只会把前缀中的数(纵坐标)变小(2操作),后缀中的数(横坐标)变大(1操作),所以具有单调性,可以进行二分.(括号中含义的解释见下) 先把整个坐标系旋转$45$度(逆时针为例),操作1即纵坐标$y>=xi$的点都会往右走$2*l$,横坐标$+2*l$,纵坐标不变,由于有单调性,只会操作后缀:操作2…
题面 一看到求“最小值的最大值”这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点,然后根据前缀和再二分一下前两块的最小大小(注意前两块要连着),第三块用一圈的大小减去前两块的大小即可得到.如果第三块的大小$\geq mid$就返回$true$,提高答案范围:否则返回$false$,降低答案范围. 这样就能卡着最优情况下最小那一块的最大值从而得出答案了. 上面这种做法是$O(n*log_n*log_a…
题目地址 https://loj.ac/problem/2343 题解 首先处理出\(f[i]\)表示以当前位置开头(J,O,I)的合法方案数.这个显然可以\(O(n)\)处理出来.然后考虑在每个位置插入三种数. 在位置i插入J:显然对于i后面的所有\(f[j](i<j,s[j]=O)\)有多一个转移点,对\(f[j]\)做个后缀和即可. 在位置i插入O:对于i前面的J,和i后面的I,显然都多一个中转点,于是对J做前缀和,I做后缀和,枚举插入位置i,左右两边相乘取\(\max\)即可. 在位置i…
loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长链上一定有和他到\(x\)距离相同的点,矛盾 然后对于一个点,最长链端点一定可以是直径的两端点之一,所以如果我们分别以树的直径的两端点为根进行dfs,那么一个点在其中一次dfs中,独特的点都会在到根的路径上,所以我们用栈维护到根的点,然后不同颜色数开桶来维护,每次压栈或弹栈时改变桶内元素个数,然后根…
loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高)就不做,因为如果提前做了,可能会导致后面要浪费一些步数使得移动合法.然后这个移动过程就会分成两段,先是一直移动或者下降,不用上升,然后会每次上升再移动,一直到终点 先看前一段的移动,如果移动的时候正好能移到下一棵树就直接移,如果移的时候高度过高就往下移一点直到能正好移动到下一棵树上.这里对每个点记\…
题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j)\)上有多少个棋子,\(ans\)为答案 如果为正表示从左边移到右边 如果为负表示从右边移到左边 我们考虑怎么维护这个东西 我们考虑一下两种大情况: 这个位置上原本有值 那么我们只要将\(ans+(f[i][j]-1)\)即可 这个位置本来没有值 我们考虑三种情况,我们以一行为例,其余的一行同理…
做法一 首先将边界也视作四条裁剪线,整个平面作为一张纸,视存在 \(y = -\infty, y = +\infty, x = -\infty, x = +\infty\) 四条直线. 按照纵坐标依次扫描每条线,每次维护当前纵坐标水平无穷长的直线和每个位置下面第一条之前插入过的纵坐标之间围成区域的连通性,如下图所示: 图中箭头指向的就是当前扫描(维护)到的(水平)线,红绿蓝分别为所围成的区域(有效). 具体地,由于上述扫描过程中连通性只会在:水平线段,竖直线段底部,竖直线段顶部发生改变,因此我们…
题目链接 题目描述 JOIOI 王国是一个 $H$ 行 $W$ 列的长方形网格,每个 $1\times 1$ 的子网格都是一个正方形的小区块.为了提高管理效率,我们决定把整个国家划分成两个省 $JOI$ 和 $IOI$ . 我们定义,两个同省的区块互相连接,意为从一个区块出发,不用穿过任何一个不同省的区块,就可以移动到另一个区块.有公共边的区块间可以任意移动.我们不希望划分得过于复杂,因此划分方案需满足以下条件: 区块不能被分割为两半,一半属 $JOI$ 省,一半属 $IOI$ 省. 每个省必须…
题目描述 JOI 铁路公司是 JOI 国唯一的铁路公司. 在某条铁路沿线共有 $N$ 座车站,依次编号为 $1...N$. 目前,正在服役的车次按照运行速度可分为两类:高速电车(简称快车)与普通电车(简称慢车). 慢车每站都停.乘慢车时,对于任意一座车站 $i(1⩽i<N)$,车站 $i$ 到车站$ i+1$ 用时均为 $A$. 快车只在车站 $S_1, S_2, \ldots, S_M$​​ 停车 $(1=S_1<S_2<\cdots<S_M=N)$.乘快车时,对于任意一座车站…
题解 有意思的一个dp,我们对G计数,发现如果不在同一条对角线上的G肯定不会互相影响,所以我们对于每一条对角线dp dp的方式是枚举这个G以什么方式放,横着还是竖着,还是不放 代码 #include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <cmath> #include <cstring> #include <ma…
题解 首先求一个最短路图出来,最短路图就是这条边在最短路上就保留,否则就不保留,注意最短路图是一个有向图,一条边被保留的条件是 dis(S,u) + val(u,v) = dis(v,T)我们需要求两遍最短路 然后我们发现就相当于在最短路图上走一段,然后走一段非0的部分 我们把旧图保留,在上面连一些边权为0的有向边,从U到V求一遍最短路,由于最短路图是有向的,我们再从V到U求一遍最短路 然而--WA了? 我们发现我们最短路图上下来之后,可能会又走到最短路图上,但是同时选中两条路径是不可能的,我们…
题解 没啥特别好的算法,是个讨论题,由于0 1 ?三类数位中最少的不会超过6 如果1不超过6,那么记录\(f1(S)\)为 \(\sum_{T \subset S} val(T)\)这个可以通过类似FMT的递推式在\(L 2^L\)求出 然后容斥,如果这个数和1的个数差别是偶数就加上否则就减掉 如果0不超过6,记录\(f0(S)\)为 \(\sum_{T \supset S} val(T)\) 然后容斥,如果这个数有偶数个1就加上否则减掉 问号很少的话就是直接枚举计算值了 复杂度\(O(2^{\…
题目传送门 DP 经典题 考虑从小到大把数加入排列内 如下图(\(A\) 已经经过排序): 我们考虑如上,在 \(i\) ( \(A_i\) )不断增大的过程中,维护上面直线 \(y=A_i\) 之下的部分的长度之和 于是我们定义 DP :\(f[i][j][k][h]\) 表示插入了前 \(i\) 个数,分成 \(j\) 段,\(y=A_i\) 之下的部分长度之和为 \(k\) ,并且选出了 \(k\) ( \(0/1/2\) )个边界(第 \(1\) 个或第 \(n\) 个)的方案数 注意这…
题面 LOJ 3153 solution 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优. 故只需要考虑每一个区间的最大值与次大值分别作为\(A,B\). 可以用单调栈\(O(n)\)找到每一对这样的\(A,B\). 考虑\(f[i]\)表示以\(i\)作为\(C\)时最大的\(A+B+C\),对于每一对\(A,B\),他们对应的\(C\)一定\(\ge (2*B-A)\). 离线处理询问,从大到小枚…