P2403 [SDOI2010]所驼门王的宝藏

P2403 [SDOI2010]所驼门王的宝藏

题意:

R * C的地图上有n个宝藏,给你n个宝藏的坐标,每个宝藏的位置上还有一个传送门,传送门有三种类型,1.可以传送到同行的其他宝藏位置,2.可以传送到同列的其他宝藏位置 3.可以传送到该点周围的八个位置
你可以在任意一个宝藏处开始,问最多获得多少宝藏?

题解:

如果我们直接按照题意要求建边,(暴力建边,第1类门和每行其他门建边,第2,3类门同理),会得到一个有向有环图,对于环我们可以用tarjan进行缩点,然后得到DAG,然后就是在DAG直接dp求就行(拓扑排序)。
dp[v]=max(dp[u]+val[v])dp[v]=max(dp[u]+val[v] )dp[v]=max(dp[u]+val[v])
但是数据告诉我们不会这么简单,N<=100000,R<=1000000,C<=1000000
边的数量巨大,可达O(n2n^2n2),所以需要一个巧妙的建边方法来降低复杂度
原始的建边是两两之间建立练习,避免不了是O(n2n^2n2),现在我们可以这样想,对于每行,每列都建立一个额外的点,然后让所有点与这个额外的点建立联系。
第i行的额外的点为x,我们让x向改行所有宝藏建一个边,如果有一个点y是1号门,我们就让y再向x建一个边,通过这样操作,y就是本行任意一个宝藏位置(很妙,这个思路很妙)
列的同理
对于第三种门,我们就暴力枚举八个位置,然后在所有宝藏中二分寻找(事先要对宝藏位置排序),看是否能找到,找到即建边
思路捋清楚,就开干码吧

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
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;
}
clock_t startTime, endTime;
void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //计时开始freopen("sotomon.in","r",stdin);#endif
}
void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //计时结束printf("\n运行时间为:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif
}
const int N = 2e5+9, T = 2100007, M = 1000007;
const int dx[8] = {1, 1, 1, 0, 0, -1, -1, -1};
const int dy[8] = {1, 0, -1, 1, -1, 1, 0, -1};
int n, r, c, t, edc, edu[M], edv[M];
int ecnt, head[T], nxt[M], vet[M];
int qhead, qtail, que[T], f[T], in[T];
int stac[T], top, val[T], col[T], stamp, dfn[T], low[T], cnt;
bool instac[T];
struct Node {int x, y, t;bool operator <(const Node &ano) const { return x < ano.x || x == ano.x && y < ano.y;}
} a[N]; inline void add(int u, int v) {edu[++edc] = u; edv[edc] = v;vet[++ecnt] = v; nxt[ecnt] = head[u];head[u] = ecnt;
}inline void eadd(int u, int v) {vet[++ecnt] = v; nxt[ecnt] = head[u];head[u] = ecnt;
}void tarjan(int u) {dfn[u] = low[u] = ++stamp;stac[++top] = u; instac[u] = true;for (int e = head[u]; e; e = nxt[e]) {int v = vet[e];if (!dfn[v]) {tarjan(v); low[u] = min(low[u], low[v]);} else if (instac[v]) low[u] = min(low[u], dfn[v]);}if (dfn[u] == low[u]) {col[u] = ++cnt; val[cnt] = u > r + c;while (stac[top] != u) {col[stac[top]] = cnt;val[cnt] += (stac[top] > r + c);instac[stac[top--]] = false;}instac[stac[top--]] = false;}
}int getid(int x, int y) {int l = 1, r = n;while (l <= r) {int mid = (l + r) >> 1;if (a[mid].x == x && a[mid].y == y) return mid;else if (a[mid].x < x || a[mid].x == x && a[mid].y < y) l = mid + 1;else r = mid - 1;}return -1;
}int main() {rd_test();scanf("%d%d%d", &n, &r, &c);for (int i = 1; i <= n; ++i) scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].t);sort(a + 1, a + 1 + n);for (int i = 1; i <= n; ++i) {//处理额外点对当前点的连边add(a[i].x, r + c + i); add(r + a[i].y, r + c + i);//处理当前点对其它点的连边if (a[i].t == 1) add(r + c + i, a[i].x);else if (a[i].t == 2) add(r + c + i, r + a[i].y);else {for (int k = 0; k < 8; ++k) {int x = a[i].x + dx[k], y = a[i].y + dy[k];if (x >= 1 && x <= r && y >= 1 && y <= c) {int id = getid(x, y);if (id != -1) add(r + c + i, r + c + id);} }}}//缩点 t = r + c + n; for (int i = 1; i <= t; ++i)if (!dfn[i]) tarjan(i);ecnt = 0; memset(head, 0, sizeof(head));for(int i = 1; i <= edc; ++i)if (col[edu[i]] != col[edv[i]]) {eadd(col[edu[i]], col[edv[i]]);++in[col[edv[i]]];}//拓扑排序qhead = 0; qtail = -1;for (int i = 1; i <= cnt; ++i) if (!in[i]) {que[++qtail] = i;f[i] = val[i];}while (qhead <= qtail) {int u = que[qhead++];for (int e = head[u]; e; e = nxt[e]) {int v = vet[e];f[v] = max(f[v], f[u] + val[v]);if (--in[v] == 0) que[++qtail] = v;}}//统计答案int ans = 0;for (int i = 1; i <= cnt; ++i)ans = max(ans, f[i]);printf("%d\n", ans);Time_test();return 0;
}

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

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

相关文章

分布式系统的构建原则

什么是构建一个可维护和可扩展的系统的意义&#xff1f;在早期&#xff0c;一个系统的形态&#xff0c;只是满足用户和服务器资源之间的通道&#xff0c;唯一要扩展和维护的是系统后面的资源&#xff0c;保证资源的可用和够用&#xff0c;而系统本身的压力并不大。系统设计跟我…

[HEOI2016TJOI2016]排序(二分+线段树)

problem 洛谷链接 solution 在一个丝毫没有单调性的问题中很难想到将其转化为二分。 二分最后在第 ppp 位置上的值 xxx。 然后将所有 ≥x\ge x≥x 的赋为 111&#xff0c;所有 <x<x<x 的赋为 000。 经过一系列区间排序操作后&#xff0c;最后我们只在乎第 ppp 位…

可持久化4--可持久化并查集

可持久化并查集 可持久化并查集 按秩合并并查集 可持久化数组 首先并查集不能采用路径压缩&#xff0c;这是因为一次findR操作中&#xff0c;fa数组的很多位置&#xff08;u->ru&#xff09;会发生修改&#xff0c;由于每次修改都需要在可持久化数组上复制产生log个新结…

ASP.NET Core 2.2中的Endpoint路由

在ASP.NET Core 2.2中&#xff0c;新增了一种路由&#xff0c;叫做Endpoint&#xff08;终结点&#xff09;路由。本文将以往的路由系统称为传统路由。本文通过源码的方式介绍传统路由和Endpoint路由部分核心功能和实现方法&#xff0c;具体功能上的差异见官方文档。在升级到AS…

AtCoder2063 [AGC005E] Sugigma The Showdown(博弈论)

problem 洛谷链接 solution 考虑一条 (u,v)(u,v)(u,v) 的红边&#xff0c;在蓝树上 u,vu,vu,v 两点距离 ≥3\ge 3≥3。 如果先手到达 u,vu,vu,v 其中任何一点且下一步后手行动无法抓住先手&#xff0c;那么这个游戏就将进入死循环了。 通过画图&#xff0c;你会发现这个结…

基于ASP.NET Core的模块化设计: 虚拟文件系统

土牛亲自录制的本文介绍视频Abp中文网(https://cn.abp.io/)提供翻译字幕基于ASP.NET Core的模块化设计: 虚拟文件系统简介创建模块化的应用程序很困难. 构建模块化的用户界面更加困难. 需要单独开发模块的页面和组件,但是最后要把它们集成在一起像单个UI一样创建这样的模块化架…

[SDOI2012]吊灯(结论)

problem 洛谷链接 solution 显然&#xff0c;颜色相同的灯泡形成一个连通块&#xff0c;且连通块的大小 i∣ni\mid ni∣n。 这道题要能发现一个结论&#xff1a;一定至少存在一种颜色的连通块 满足该联通块内的任意一个节点 都不是异种颜色点 的父亲。 即&#xff0c;至少…

一文带你全面认识Excel催化剂系列功能

2018年1月1日决定打造一款Excel插件&#xff0c;取名为Excel催化剂&#xff0c;历时半年的时间&#xff0c;在努力打造出和传统插件有功能差异化的基础上&#xff0c;让大家可以真正得到一些有价值非鸡肋的功能&#xff0c;对开发什么样的功能也构思了许久&#xff0c;同时对免…

可持久化汇总(讲解+题目)

可持久化(一) 可持久化(二) 可持久化3–可持久化01Trie 可持久化4–可持久化并查集 各模块的例题都在各自讲解下面有写 下面是加强练习 练习题讲解——肖然老师的博客 练习题&#xff1a; P4137 Rmq Problem / mex P4587 [FJOI2016]神秘数 CF484E Sign on Fence CF1080F Katya …

[学习笔记] 乱世之神杀疯了 —— K-D tree

文章目录K-D tree建树合并插入删除查询(估价函数)旋转坐标系题目练习[SDOI2012]最近最远点对[Violet]天使玩偶/SJY摆棋子[CQOI2016]K远点对[国家集训队]JZPFARThe closest M points简单题巧克力王国[BOI2007]Mokia 摩基亚[CH弱省胡策R2]TATT[BZOJ3815]卡常数[NOI2019]弹跳A sim…

【春华秋实】.NET Core之只是多看了你一眼

技术学习是一件系统性的事情&#xff0c;如果拒绝学习&#xff0c;那么自己就会落后以至于被替代。.NET也是一样&#xff0c;当开源、跨平台成为主流的时候&#xff0c;如果再故步自封&#xff0c;等待.NET的就是死路一条&#xff0c;幸好.NET Core问世了&#xff0c;社区反响积…

[SDOI2010]粟粟的书架

[SDOI2010]粟粟的书架 题意&#xff1a; 一个R * C的矩阵&#xff0c;每个位置都有个数page[ij]&#xff0c;现在选定一个小矩阵范围(给左上角坐标&#xff0c;和右下角坐标)&#xff0c;问这个范围内的数总和是否大于h&#xff0c;如果大于h的话最少选几个数aij 对于50%的数…

基于Asp.Net Core的简单社区项目源代码开源

2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0EF CORE 3.0开发使用vs2019 sqlserver 2017(数据库脚本最低支持sql server 2012/)使用步骤:1.下载相关开发工具2.运行数据库脚本目录下的相关脚本3.默认前端账号密码: 18812345678 1234564.默认后台账号密码: admin 123456开…

[学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理

群与子群 <G,op><G,op><G,op> 是一个群需要满足以下条件&#xff1a; opopop 是一个满足结合律的二元运算&#xff0c;如 *&#xff0c;。GGG 是一个集合&#xff0c;存在单位元 eee。GGG 中所有元素都有逆元。即 GGG 对 opopop 运算封闭&#xff0c;封闭简单…

P2469 [SDOI2010]星际竞速

P2469 [SDOI2010]星际竞速 题意&#xff1a; 有n个点&#xff0c;m个边&#xff0c;边是单向边(只能从小编号点到大编号点)&#xff0c;你也可以花费ai直接到达点i。问将1~n所有点都经过一边最小费用是多少&#xff1f; 题解&#xff1a; 最小费用最大流&#xff0c;网络流…

为什么从前那些.NET开发者都不写单元测试呢?

楔子四年前我虽然也写了很多年代码&#xff0c;由于公司虽然规模不小&#xff0c;却并非一家规范化的软件公司&#xff0c;因此在项目中严格意义上来说并没有架构设计、也不写单元测试&#xff0c;后来有幸加入了一家公司&#xff0c;这家公司虽然也是一家小公司&#xff0c;但…

git 命令的使用

git 各个命令的详细使用方法参考git-docs。 Table of Contents git Table of Contents add archive blame branch checkout cherry-pick clone commit config diff fetch for-each-ref github init log & show merge mv pull push rebase remote r…

求和(莫比乌斯反演)

由于找不到提交网站&#xff0c;所以不保证正确性哦~ problem 已知积性函数 F(1)1&#xff0c;F(pk)pk1F(1)1&#xff0c;F(p^k)p^k1F(1)1&#xff0c;F(pk)pk1。&#xff08;ppp为质数&#xff0c;k∈Zk∈Z^k∈Z&#xff09; 给定 nnn&#xff0c;求 ∑i1nF(i)\sum_{i1}^n F…

P2467 [SDOI2010]地精部落

P2467 [SDOI2010]地精部落 题意&#xff1a; 有n个山脉高度分别是1到n&#xff0c;现在让你按照山峰山谷的顺序依次摆放(第一个可以是山峰也可以是山谷)&#xff0c;问有多少方案(答案mod p) 题解&#xff1a; dp&#xff0c;但是自己推不出来 这个博客讲的非常详细&#x…

使用 xUnit 编写 ASP.NET Core 单元测试

还记得 .NET Framework 的 ASP.NET WebForm 吗&#xff1f;那个年代如果要在 Web 层做单元测试简直就是灾难啊。.NET Core 吸取教训&#xff0c;在设计上考虑到了可测试性&#xff0c;就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的。其中面向接口和依赖注入…