ABC372

D

题目大意:

n座建筑排成一排,每座建筑的高度为hii[1,n],找出满足下面条件的j的数量:

  • 在建筑ij中,没有建筑比j高的
  • j[i+1,n]

n2×105h1n的排列。

分析:

考虑i不好处理,我们改为考虑每个j可以贡献到哪些i:即若hj<hikj1开始,一直向左,直到hk>hj时,i[k+1,j1]都会被贡献到(答案+1)。所以,我们只需要快速找到在每个j往左第一个大于hj的位置。这只需要我们把所有的i按照hi从大到小排序,然后用一个set维护即可。至于区间修改单点查询,差分数组即可处理。

代码:

#include <bits/stdc++.h>

using namespace std;

int n, t, pos[200005], d[200005], h[200005], c[200005];

set < int > a;

int ask(int x)
{
	auto p = a.lower_bound(x);
	if (p == a.end()) return max(1, *(prev(p)));
	return *(prev(p));
}

int main()
{
	scanf("%d", &n); a.insert(0);
	for (int i = 1; i <= n; i ++ ) scanf("%d", &h[i]), pos[h[i]] = i;
	for (int i = n; i >= 1; i -- )
	{
		int l = ask(pos[i]), r = pos[i] - 1;
		if (l == 0) l = 1;
		a.insert(pos[i]);
		if (l > r || r == 0) continue;
		d[l] ++ , d[r + 1] -- ;
	}
	for (int i = 1; i <= n; i ++ ) d[i] += d[i - 1], printf("%d ", d[i]);
	puts("");
	return 0;
}

F

题目大意:

n个点的有向图共有n+m条边。i[1,n]ii+1存在一条边(n+1对应1)。i[1,m]xiyi存在一条边。求下列方案数:从点1开始,恰好走k步。答案对998244353取模。n,k2×105,m50。无重边自环。

分析:

O((n+m)k)的dp是显然的,但是无法通过。注意到虽然有n+m条边,但是其中的n条边形式都是一致的,而m又很小,复杂度瓶颈在n。于是我们考虑固定这n条边不动,让n个点去动(即:某条边(i,i+1),把i+1当成i,这样就相当于自己转移到自己,即保留原来的值,就不用考虑这条边了)。设 di 为走到节点 i 的方案数。首先,为了处理方便,不妨将所有节点的标号减 1,这样旋转操作可以转化为标号取模操作(常用)。在将点整体移动的情况下,我们可以忽略对原环上边的转移。边 (x,y) 在第 t 次转移时的实际效果是

d(yt)modnd(yt)modn+d(xt+1)modn

模拟一下即可得到上述转移。例如,n=8,(x,y)=(2,4),t=1时,实际转移效果为(2,3)。这是因为我们把i+1当成了i。另外,由于所有操作需要同时进行,所以需要缓存值后再操作。

代码:

#include <bits/stdc++.h>

using namespace std;

const int mod = 998244353;

int n, m, k, add[55][2], x[55], y[55], dp[200005];

int main()
{
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= m; i ++ ) scanf("%d%d", &x[i], &y[i]), x[i] -- , y[i] -- ;
	dp[0] = 1;
	for (int i = 1; i <= k; i ++ )
	{
		for (int j = 1; j <= m; j ++ ) add[j][0] = (y[j] - i % n + n) % n, add[j][1] = dp[(x[j] - i % n + 1 + n) % n];
		for (int j = 1; j <= m; j ++ ) dp[add[j][0]] = (dp[add[j][0]] + add[j][1]) % mod;
	}
	int res = 0;
	for (int i = 0; i < n; i ++ ) res = (res + dp[i]) % mod;
	printf("%d\n", res);
	return 0;
}
posted @   andysj  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
历史上的今天:
2020-10-26 背包相关问题总结
2020-10-26 10.24四校联考总结
2020-10-26 拓扑排序学习(复习)笔记
点击右上角即可分享
微信分享提示