20250606 思维题

n <= 1000

建一个超级源
每个点向超级源连一条长度为v的边
然后求最小生成树即可。


P5952 [POI 2018] 水箱

在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水
箱与外界之间有一堵高度无穷大的墙,因此水不可能漏到外面。已知水箱内每个格子的高度都是[0,H]之间的整数
请统计有多少可能的水位情况。因为答案可能很大,请对10^9+7取模输出。两个情况不同当且仅当存在至少一个方格的水位在两个情况中不同。

n,m,H(n*m<=500000,1<=H<=10^9)


发现
水上涨 = 格子合并
而且,墙越低,连在一起的时间就越早。
并且时间取决于最低的墙的高度。

每个并查集里面维护当前集合中最高的墙、内部方案数。
联通合并的时候,更新最高墙,合并方案数即可。
ans[x]=(ans[x]+e[i].val-now[x])*(ans[y]+e[i].val-now[y])
now[x]=e[i].val


P3147 [USACO16OPEN] 262144 P

看似区间dp,但是n巨大,无法做。
但是可以互换维度

f[l][r][k]表示l~r能不能合并出来k

但发现一个事情, f[l][r][k]中大部分的都是false,所以把bool改成数字

令f[l][k]表示从l开始,往右合并出来的第一个k,右端点到哪一个位置。(如果合并不出来就是n+1)
f[l][k]=f[f[l][k-1]][k-1]


有两只兔子跳石头。石头有n个,围成一个环,每个石头有一个重量ai
两只兔子跳石头的规则如下:
1.一个顺时针跳,一个逆时针跳。
2.兔子的一次跳跃可以越过若干个石头,但是不能越过/跳到 已经跳过的石头(不能套圈),兔子之间不会互相影响,各算各的。
3.两只兔子每一个回合一起跳,跳到的石头必须是同一个重量的。可以是同一个石头。
4.初始点可以随便选择(当然石头重量需要一样)
问最多能跳多少回合(包含初始回合)。
N<=1000,1<=ai<=1000


首先,从同一个石头开始跳一定是一个最优解。

否则两个不同的向后扩到一个相同的答案可以+1。

然后我们把链复制一倍,就变成了求最长回文自序列且下标范围有限制。

当a[l]==a[r]时,f[l][r]=f[l+1][r-1]+2,否则就是max(f[l+1][r],f[l][r-1])


CF17E Palisection

给定一个长度为n的小写字母串。问你有多少对相交的回文子 串(包含也算相交) 。
n(1<=n<=2*10^6)
相交的回文子串个数%51123987

所有的回文串对数-不相交的对数

一个套路是枚举分界点统计

c[x][0]以x开始的回文串个数,c[x][1]以x为末尾的回文串个数pre[x],为c[x][1]的前缀和

对于枚举的分界点i(2<=i<=n)

ans-=pre[i-1]*c[i][0]


[NOIP2012 提高组] 借教室(加强版)

有n天,每天有ai个空教室。有m个申请,每个申请要在第[li,ri]天中每天占用di个教室。我们要依次办理这些申请,如果发现某个申请无法满足,则找出这个申请。

n,m<=2e7,ai,di<=1e9(特殊方式读入)
注:原题n,m范围为1e6

将线段树改称差分。

先都差分上,然后依次判断每天是否合法,如果不合法,那么从后往前撤销操作。同时维护差分后的数组。


P2827 [NOIP2016 提高组] 蚯蚓

N条蚯蚓,初始长度为ai
M秒,每秒选最长的蚯蚓x切成[px]和x-[px]两段。其他蚯蚓增长固定值q

求每秒切的蚯蚓长度是多少,以及m秒后所有蚯蚓长度。

比率p为定值,N<=1e5,m<=7e6,0<=q<=200,ai<=1e8

卡偏移量堆。

维护3个队列,一个初始,两个切完的。
三个队列一定单调,直接去最大得


P2757 [国家集训队] 等差子序列

从左到右枚举中间的数

一个数在左边出现过有面就肯定没有出现。

所以对于值域动态维护一个数有没有出现过,0为没有1为出现过

发现如果对于当前是回文,即左面i-x这个数出现过右面i+x也出现过或都每出现过,就在同一侧,一旦每出现,就找到了,因为在异测出现。

由于带修改,所以线段树+哈希维护。


P1852 跳跳棋

跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。
我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳动把他们的位置移动成x,y,z。(棋子是没有区别的)
跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。
写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。


a b c

对于两边的棋子,只能跳到其余两颗的中间,同样的中间的棋子也只能跳到两边

可以建立二叉树

先看看最后是不是同一个树根
然后倍增LCA的思想
跳到同一个深度,然后二分到lca的距离,再跳。


EOF
blog/3478174/202506/3478174-20250608172426736-626435686.png)

posted @ 2025-06-08 17:25  Dreamers_Seve  阅读(28)  评论(0)    收藏  举报