Lawn of the Dead

Lawn of the Dead

题意:

有一个N * M的方格,我们从(1,1)出发,只能向右走或者向下走,存在一些障碍,问有多少格子是我们所能到达的
2<=n,m,k<=1e5

题解:

所有的点减去不能到达的点的个数,就是可以到达的点的个数
有障碍的地方不能达到,而我们只能向右向下走,当某个点的左边和上边都是不可达时,该点就不可达,并会对自己的右边的点和下方的点造成影响
n,m,k<=1e5,空间很大但是地雷数目有限,我们可以从上往下逐行对每一行的地雷排序后处理,对于每个地雷,找到从自己的右上角点(x-1,y+1)开始从左往右的连续不可达区间的范围,那么x这行的这个范围也不可达,我们可以用线段树来实现区间的查询与维护。处理每一行,累加后用总点数减去即可

请添加图片描述
官方代码中,将可以到达的区域赋值1,每次找第x-1行区间内最最左侧的1,然后将第x行这段区间赋值为1,剩下0即为不可到达区域

代码:

md调了半天还是不对


2021/7/30 0:41
问题解决,现在代码对了,睡觉

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
#define ls (rt<<1)
#define rs ((rt<<1)|1)
typedef long long ll;
using namespace std;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=3e5+9; 
int n,m,k;
vector<int>vec[maxn];
struct tree{int l,r;int lazy;int sum;
}tr[2][maxn];
void pushup(int op,int rt){tr[op][rt].sum=tr[op][ls].sum+tr[op][rs].sum;
}
void solve(int op,int rt,int val){tr[op][rt].sum=(tr[op][rt].r-tr[op][rt].l+1)*val;tr[op][rt].lazy=val;
}
void pushdown(int op,int rt){solve(op,ls,tr[op][rt].lazy);solve(op,rs,tr[op][rt].lazy);tr[op][rt].lazy=-1;
}
void build(int op,int rt,int l,int r){tr[op][rt].l=l;tr[op][rt].r=r;if(l==r){tr[op][rt].sum=0;tr[op][rt].lazy=-1;return ;}int mid=l+r>>1;build(op,ls,l,mid);build(op,rs,mid+1,r);pushup(op,rt);
}
void update(int op,int rt,int L,int R,int v){if(L>tr[op][rt].r||R<tr[op][rt].l)return ;if(L<=tr[op][rt].l&&tr[op][rt].r<=R){solve(op,rt,v);return ;}if(tr[op][rt].lazy!=-1)pushdown(op,rt);update(op,ls,L,R,v);update(op,rs,L,R,v);pushup(op,rt);
}
int query(int op,int rt,int L,int R){if(!tr[op][rt].sum)return INF_int;if(L>tr[op][rt].r||R<tr[op][rt].l)return INF_int;if(tr[op][rt].l==tr[op][rt].r)return tr[op][rt].l;if(tr[op][rt].lazy!=-1)pushdown(op,rt);if(L<=tr[op][rt].l&&tr[op][rt].r<=R){if(tr[op][ls].sum>0)return query(op,ls,L,R);else return query(op,rs,L,R);}return min(query(op,ls,L,R),query(op,rs,L,R));
}
void init(){for(int i=1;i<=n;i++)vec[i].clear();memset(tr,0,sizeof(tr));
}
int main()
{//freopen("1008.in","r",stdin);int t=read();while(t--){scanf("%d%d%d",&n,&m,&k);init();for(int i=1;i<=k;i++){int x,y;scanf("%d%d",&x,&y);vec[x].push_back(y);}build(0,1,1,m);build(1,1,1,m);update(1,1,1,1,1);int op=0;ll ans=0;for(int i=1;i<=n;i++){int L=0;sort(vec[i].begin(),vec[i].end());int pos;for(int y:vec[i]){if(y-1>=L+1){pos=query(op^1,1,L+1,y-1);if(pos!=INF_int)update(op,1,pos,y-1,1);}L=y; }if(L+1<=m){pos=query(op^1,1,L+1,m);if(pos!=INF_int)update(op,1,pos,m,1);}ans+=tr[op][1].sum;update(op^1,1,1,m,0);op^=1;}printf("%lld\n",ans);}return 0;
}

官方代码:

#include<bits/stdc++.h>
using namespace std;
#define ls (x<<1)
#define rs (x<<1|1)
const int N = 1e5 + 5;
const int inf = 0x3f3f3f3f;
vector<int>e[N];
int tr[2][N << 2], lz[2][N << 2];void push_down(int f, int x, int l, int r, int mid) {if (lz[f][x] == -1)return;tr[f][ls] = lz[f][x] * (mid - l + 1);tr[f][rs] = lz[f][x] * (r - mid);lz[f][ls] = lz[f][rs] = lz[f][x];lz[f][x] = -1;
}
void update(int f,int x, int l, int r, int L, int R, int v) {if (L <= l && R >= r) {tr[f][x] = (r - l + 1) * v;lz[f][x] = v;return;}int mid = (l + r) >> 1;push_down(f, x, l, r, mid);if (R <= mid)update(f, ls, l, mid, L, R, v);else if (L > mid)update(f, rs, mid + 1, r, L, R, v);else {update(f, ls, l, mid, L, mid, v);update(f, rs, mid + 1, r, mid + 1, R, v);}tr[f][x] = tr[f][ls] + tr[f][rs];
}
int query(int f, int x, int l, int r, int L, int R) {if (!tr[f][x])return inf;if (l == r)return l;int mid = l + r >> 1;push_down(f, x, l, r, mid);if (L <= l && R >= r) {if (tr[f][ls] > 0) return query(f, ls, l, mid, L, R);else return query(f, rs, mid + 1, r, L, R);}else {if (R <= mid)return query(f, ls, l, mid, L, R);else if (L > mid)return query(f, rs, mid + 1, r, L, R);else return min(query(f, ls, l, mid, L, mid), query(f, rs, mid + 1, r, mid + 1, R));}
}
int main() {int T;scanf("%d", &T);while (T--) {int n, m, k;scanf("%d %d %d", &n, &m, &k);for (int i = 1; i <= n; ++i)e[i].clear();for (int i = 1; i <= (m << 2); ++i) {tr[0][i] = tr[1][i] = 0;lz[0][i] = lz[1][i] = -1;}for (int i = 0; i < k; ++i) {int x, y;scanf("%d %d", &x, &y);e[x].push_back(y);}long long ans = 0;update(0, 1, 1, m, 1, 1, 1);for (int x = 1; x <= n; ++x) {int l = 0;sort(e[x].begin(), e[x].end());for (auto& y : e[x]) {if (y - 1 >= l + 1) {int pos = query((x & 1) ^ 1, 1, 1, m, l + 1, y - 1);if (pos != inf)update(x & 1, 1, 1, m, pos, y - 1, 1);}l = y;}if (l + 1 <= m) {int pos = query((x & 1) ^ 1, 1, 1, m, l + 1, m);if (pos != inf)update(x & 1, 1, 1, m, pos, m, 1);}ans += tr[x & 1][1];update((x & 1) ^ 1, 1, 1, m, 1, m, 0);}printf("%lld\n", ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Netcore 2.0 Ocelot Api网关教程(8)- 缓存

Ocelot中使用 CacheManager 来支持缓存&#xff0c;官方文档中强烈建议使用该包作为缓存工具。以下介绍通过使用CacheManager来实现Ocelot缓存。1、通过Nuget添加 Ocelot.Cache.CacheManager 包在OcelotGetway项目中添加引用&#xff1a;2、修改 Startup 中的 ConfigureService…

Acwing 273. 分级

Acwing 273. 分级 题意&#xff1a; 给定一个长度为N的序列A&#xff0c;现在构造一个长度为N的序列B&#xff0c;满足&#xff0c;B是非严格单增。最小化S∑i1N∣Ai−Bi∣\sum_{i1}^{N}|A_i-B_i|∑i1N​∣Ai​−Bi​∣ 题解&#xff1a; 引理&#xff1a; 一定存在一组最优…

.NET Core 给使用.NET的公司所带来的机遇

今晚在余晟的微信公众号看到了一篇文章《从.NET/C#开发的“后继无人”说起》。 这篇文章以从.NET/C#开发的“后继无人” 引出了推广极客时间的课程 刘超的《趣谈Linux操作系统》&#xff0c;通篇看下来这明显是刘超的《趣谈Linux操作系统》的软文。软文地址&#xff1a;https:/…

Git Flow分支策略与Azure DevOps相关功能简介

想了很久&#xff0c;还是写这么一篇文章来总结一下有关分支策略和DevOps的一些内容吧。其实&#xff0c;DevOps相关的内容并不是我的工作范围&#xff0c;不过对于敏捷开发、DevOps、项目管理等等这一系列的与开发过程相关的内容&#xff0c;我还是有些经验的&#xff0c;也就…

AcWing 274. 移动服务

题意&#xff1a; 2<L<200 1<N<1000 题解&#xff1a; 一共就三个员工&#xff0c;我们可以在状态中记录三个员工的位置&#xff1b; 有&#xff1a;dp[i][x][y][z]:第i个工作完成后&#xff0c;三个员工的坐标分别是x&#xff0c;y&#xff0c;z&#xff0c;的最…

NSwag 和 ASP.NET Core

NSwag 提供了下列功能&#xff1a;能够使用 Swagger UI 和 Swagger 生成器。灵活的代码生成功能。借助 NSwag&#xff0c;无需使用现有 API。也就是说&#xff0c;可使用包含 Swagger 的第三方 API&#xff0c;并生成客户端实现。 使用 NSwag&#xff0c;可以加快开发周期&…

Acwing 276. I-区域

Acwing 276. I-区域 题意&#xff1a; 在 NM 的矩阵中&#xff0c;每个格子有一个权值&#xff0c;要求寻找一个包含 K 个格子的凸连通块&#xff08;连通块中间没有空缺&#xff0c;并且轮廓是凸的&#xff09;&#xff0c;使这个连通块中的格子的权值和最大。 注意&#xf…

开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0

去年我在业余时间&#xff0c;自己整了一套dapper的lambda表达式的封装&#xff0c;原本是作为了一个个人的娱乐项目&#xff0c;当时也只支持了Sql Server数据库。随之开源后&#xff0c;有不少朋友也对此做了试用&#xff0c;也对我这个项目提出了不少的建议。因此我在最近公…

Acwing 277. 饼干

Acwing 277. 饼干 题意&#xff1a; 圣诞老人共有 M 个饼干&#xff0c;准备全部分给 N 个孩子。 每个孩子有一个贪婪度&#xff0c;第 i 个孩子的贪婪度为 g[i]。 如果有 a[i] 个孩子拿到的饼干数比第 i 个孩子多&#xff0c;那么第 i 个孩子会产生 g[i]a[i] 的怨气。 给…

Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)

VS Code是一个年轻的编辑器&#xff0c;但是确实是非常犀利。通过本篇&#xff0c;老司机带你使用VS Code玩转Docker——相信阅读本篇之后&#xff0c;无论是初学者还是老手&#xff0c;都可以非常方便的玩转Docker了&#xff01;所谓是“工欲善其事必先利其器”&#xff0c;VS…

【送书活动】10分钟了解Docker,运维和开发视角有什么不同?

Docker 是 Golang 编写的&#xff0c; 自 2013 年推出以来&#xff0c;受到越来越多的开发者的关注。如今Docker无处不在&#xff0c;这是不争的事实。开发人员都很喜欢它&#xff0c;运维工程师也需要它。他们都需要深入了解如何在关键业务环境中构建和维护符合生产级别要求的…

可持久化(二)

文章目录【可持久化值域线段树/主席树】主席树代码【二维数点】例题【可持久化值域线段树/主席树】 P3834 【模板】可持久化线段树 1&#xff08;主席树&#xff09; 查询序列区间第k小&#xff0c;静态在线。给定 n 个整数构成的序列&#xff0c;将对于指定的闭区间查询其区间…

.NET Core / C# 开发 IOT 嵌入式设备的个人见解

( .NET Core 七龙珠 )一、IOT 平台的支持先看国内优秀的云计算IOT平台(不含QQ互联、小米IOT等针对特定产品的开发者平台&#xff0c;仅列出部分云计算厂商的IOT平台)阿里云 IOThttps://iot.aliyun.com/华为物联网https://developer.huawei.com/ict/cn/site-iot-next腾讯云 物联…

[NewLife.XCode]增量累加

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

膜拜大丹(结论+二元环)

problem 有两个国家&#xff0c;国家 AAA 有 nnn 座城市&#xff0c;国家 BBB 有 mmm 座城市&#xff0c;两个国家间有若干条单向航线。 具体地&#xff0c;有长度为 nnn 的数组 aaa 和长度为 mmm 的数组 bbb。国家 AAA 的第 iii 座城市有单向航线可以到达国家 BBB 的 1∼ai1…

[NewLife.XCode]脏数据

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

你真的了解用户吗?-浅谈《用户画像》的意义和方法

作者&#xff1a;陈炯关于作者系统集成项目管理高级工程师某大型国有银行高级质量管理师从事IT项目管理工作十余年具有丰富的开发与管理经验公司内部敏捷转型的发起者之一深度参与敏捷实践与总结大学校园里流传最广的一句话是什么&#xff1f;“防火防狼防师兄”。为什么师兄这…

Script Lab 续:为 Officejs 开发配置 VSCode 环境

垫场AA&#xff1a;深度&#xff1a;从 Office 365 新图标来看微软背后的设计新理念--------------------------------------------------前期01&#xff1a;尝试&#xff1a;Script Lab&#xff0c;快速 Office 365 开发工具前期02&#xff1a;尝试&#xff1a;Script Lab&…

编程方式重启 ASP.NET Core 网站

点击上方蓝字关注“汪宇杰博客”常言道&#xff0c;多喝热水&#xff0c;重启试试。有时候当应用工作不正常&#xff0c;重启也许能解决问题。但是程序员通常接触不到服务器系统权限。而运维人员和公司流程经常人为制造麻烦阻止我们去重启应用。老实的程序员不善言辞交际&#…

.NET Core 容器化调查

前几天在微信朋友圈做了一个简单的调查&#xff0c;参与人数有500人&#xff0c;调查结果如下&#xff1a;使用K8S的比例非常类似于2017年初我在公众号里针对.NET Core的使用情况的比例。.NET Core是针对云原生应用开发而重新设计的一个平台&#xff0c;.NET Core借鉴了.NET Fr…