首页 > 其他分享 >移动

移动

时间:2024-09-29 19:11:53浏览次数:7  
标签:ch rs int void read tag 移动

移动

题意

有一个 \(n\times m\) 的网格图,有 \(k\) 个点不能走。

每次移动可以向右或向下走,只能走两次。

求能走到的点的个数。

思路

可以发现只能是从第一排向下走或从第一列向右走。

统计上下走能到的点和左右走能到的点,减去重复的即可。

扫描 \(x\),使用线段树维护 \(y\) 每一个位置能否被上下走到。

初始第一行时,从 \(1\) 到第一个不能走的点的左边都赋成 \(1\),其他设为 \(0\)。

扫描每一行时,若有一个点不能走,把它设为 \(0\),其它不变,继承上一行。

这样就维护好了上下走的情况,答案先加上线段树里 \(1\) 的个数(其实就是区间求和)。

容易发现左右走只会走到最左边的不能走的格子的左边。

答案加上这些格子的数量,减去这些格子中在线段树里已经为 \(1\) 的个数(重复的)。

注意扫描到第一列最靠上的不能走的位置时,它和下面的行就不能左右走了。因为 \((1,1)\) 没法走到它们。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;

template <typename T>
void read(T& x) {
	x = 0; T f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -f;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	x = x * f;
}

const int N = 2e5 + 5;

struct segt {
	struct node {
		int l, r;
		int cnt, tag;
	} t[N << 2];
	#define ls (p << 1)
	#define rs (p << 1 | 1)
	void build(int p, int l, int r) {
		t[p].tag = -1, t[p].l = l, t[p].r = r;
		if (l == r) return ;
		int mid = (l + r) >> 1;
		build(ls, l, mid);
		build(rs, mid + 1, r);
	}
	void make(int p, int v) {
		t[p].tag = v;
		t[p].cnt = v * (t[p].r - t[p].l + 1);
	}
	void push_down(int p) {
		if (t[p].tag != -1) {
			make(ls, t[p].tag);
			make(rs, t[p].tag);
			t[p].tag = -1; 
		}
	}
	void modify(int p, int l, int r, int v) {
		if (l <= t[p].l && t[p].r <= r) {
			make(p, v);
			return ;
		}
		push_down(p);
		if (l <= t[ls].r) modify(ls, l, r, v);
		if (r >= t[rs].l) modify(rs, l, r, v);
		t[p].cnt = t[ls].cnt + t[rs].cnt; 
	}
	int query(int p, int l, int r) {
		if (l <= t[p].l && t[p].r <= r) {
			return t[p].cnt;
		}
		push_down(p);
		int res = 0;
		if (l <= t[ls].r) res += query(ls, l, r);
		if (r >= t[rs].l) res += query(rs, l, r);
		return res;
	}
} T;

int n, m, k, Min[N];
struct point {
	int x, y;
} a[N];
vector <int> v[N];
ll ans;

int main() {
	read(n); read(m); read(k);
	for (int i = 1; i <= n; i ++) Min[i] = m + 1;
	int minx = 1e9;
	for (int i = 1; i <= k; i ++) {
		read(a[i].x); 
		read(a[i].y);
		Min[a[i].x] = min(Min[a[i].x], a[i].y);
		v[a[i].x].push_back(a[i].y);
		if (a[i].y == 1) minx = min(minx, a[i].x);
	}
	T.build(1, 1, m);
	T.modify(1, 1, Min[1] - 1, 1);
	ans += Min[1] - 1; 
	for (int i = 2; i <= n; i ++) {
		for (auto y : v[i]) T.modify(1, y, y, 0);
		ans += T.query(1, 1, m);
		if (Min[i] != 1 && i < minx) // i < minx 注意
			ans += Min[i] - 1 - T.query(1, 1, Min[i] - 1);
	}
	cout << ans << "\n";
	return 0;
}

标签:ch,rs,int,void,read,tag,移动
From: https://www.cnblogs.com/maniubi/p/18440612

相关文章

  • 河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例
    河南移动,作为电信全业务运营企业,不仅拥有庞大的客户群体和业务规模,还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量,管理着超过80TB的海量数据,因此也面临着数据规模急剧扩张与业务连续性要求高的双重挑战,对数据库的分布式升级......
  • PBOOTCMS中新增并开启手机端模板,以便为用户提供更好的移动设备浏览体验
    在PBOOTCMS中新增并开启手机端模板,以便为用户提供更好的移动设备浏览体验,您可以按照以下步骤操作:开启手机版开关登录后台:首先,您需要以管理员身份登录PBOOTCMS的后台管理系统。进入全局配置:在后台菜单中找到“全局配置”或类似命名的选项并点击进入。找到移动设备设置:在全局配......
  • Vue3 + Pinia 仿抖音项目:移动端最佳实践,体验原生App般流畅
    嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法摘要:在移动端开发领域,Vue.js一直以其轻量级和易用性著称。今天,我们要介绍的是一个将Vue3和Pinia结合使用的开源项目——Douyin-Vue,这是一个模仿抖音(TikTok)的移动端短视频应用,展现了......
  • 移动端tree组件父子组件联动。
     <!--*@Author:yeminglong*@Date:2024-09-2710:14:30*@LastEditors:yeminglong*@LastEditTime:2024-09-2716:49:05*@Description:--><script>importTreeItemfrom'@/views/test/TreeItem.vue'exportdefault{ name:&#......
  • 宝塔Nginx开启fastcgi_cache分别缓存WordPress移动和pc端
    FastCGI_cache是Nginx的缓存模块,能够从Nginx层面实现网页静态化,有效提高网站的并发能力、减少PHP运行时间和请求响应时间,大大提升页面加载速度。Fastcgi_cache能够直接在nginx层面提供缓存内容,而无需涉及PHP或WordPress,在没有第三方广告情况下加速效果很不错!网上不少此教程,但是没......
  • GetDeltaSeconds平滑移动避免帧率影响
    使用GetWorld()->GetDeltaSeconds()可以让游戏逻辑与帧率无关,因为它能够动态调整每一帧的计算结果,使其与帧时间成比例。具体来说,DeltaSeconds表示当前帧与上一帧之间经过的时间(以秒为单位),使用它可以让游戏逻辑根据每帧的时间变化而调整,从而保证在不同帧率下效果一致。以下是......
  • 天地图移动端部署(一):创建一个基础地图服务(uni-app环境)
    前言:在一家测绘公司上班,接手了一个移动端APP项目,用uni-app开发的,地图服务用天地图底层支持,嗯,测绘用天地图十分合理。“这地图看起来糊糊的,你给换成XX地图吧。”老大某天跟我说。圣谕下达,开始拉代码,读代码。嗯,依旧是一坨的“清朝”项目代码,一堆的log,一堆的警告,一堆的if,就......
  • 【C++习题】2.双指针_移动零
    文章目录题目链接:题目描述:解法(快排的思想:数组划分区间-数组分两块):C++算法代码:图解题目链接:283.移动零题目描述:解法(快排的思想:数组划分区间-数组分两块):双指针算法,利用数组下标充当指针。我们可以用一个cur指针来扫描整个数组,另一个dest指针用来记......
  • GBASE南大通用赋能福建移动:精准信令检测,网络故障秒速响应
    项目背景福建移动核心网的互联互通是依靠各种信令在设备之间进行通信,同时对信令的监测,包括协议、网络、业务等方面进行深层次信令分析和实时监视,为电信业务集中维护和管理、网络优化、网络服务质量监视分析和业务模型分析、网络规划、快速定位和排除故障等业务提供有效的支撑手段。......
  • FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
    EasyPusher是一款国产的RTSP直播录制推流客户端工具,它支持Windows、Linux、Android、iOS等操作系统。EasyPusher采用RTSP推流协议,其中安卓版EasyPusher的Github托管地址为https://github.com/EasyDarwin/EasyPusher-Android。不过EasyPusher有好几年没更新了,尤其安卓版的EasyPusher......