P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

文章目录

  • 题目描述
  • 解析
  • 代码

洛谷传送门

题目描述

在这里插入图片描述

解析

看题目要求很容易想到强连通分量缩点拓扑dp
但是问题在于存图

第一感就是和暴力和每个点连边
但那样无论点数和边数都很爆炸

随后我们发现这个图非常稀疏
所以我们可以只连有宝藏的点
然而这样边数会被一行横门这样的数据卡成n2
怎么办呢?
------我的思路到这里就结束了,下面是题解内容---------
类似于电话的原理
如果新加一台电话就和其他所有电话连线,线会非常多
所以就有了转线站,新电话只需要和它相连就行了
本题也是类似的思路
真正建边的瓶颈在于横门和竖门
所以就每行和每列建一个代表点,连向该行(列)的所有宝藏室
横(竖)门就与本行(列)的代表点相连即可
大大减少了连边条数
(尽管如此,在洛谷的数据范围中,数组空间还是要精打细算。。。)
(也小心很多数组会缩点前后用两遍大小要乘2,不要RE!)

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=4e6+2e5+100;
const int M=3e5+100;
int n,m,k;
int x[M],y[M],tp[M],v[N];
map<int,map<int,int> >mp;//1-n:行 n+1-n+m:列 int dx[9]={0,-1,-1,-1,0,0,1,1,1};
int dy[9]={0,-1,0,1,-1,1,-1,0,1};
struct node{int to,nxt;
}p[N];
int cnt=-1,fi[N];
void addline(int x,int y){
//	printf("  add:x=%d y=%d\n",x,y);p[++cnt]=(node){y,fi[x]};fi[x]=cnt;
}
int id;int dfn[N],low[N],col[N],size[N],tot,tim,zhan[N],top;
void tarjan(int x){dfn[x]=low[x]=++tim;zhan[++top]=x;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(!dfn[to]){tarjan(to);low[x]=min(low[x],low[to]);}else if(!col[to]) low[x]=min(low[x],dfn[to]);}if(dfn[x]==low[x]){tot++;while(zhan[top]!=x){size[tot]+=v[zhan[top]];col[zhan[top--]]=tot;}col[x]=tot;size[tot]+=v[x];top--;}return;
}int ru[N],dp[N];
void topu(){queue<int>q;for(int i=id+1;i<=tot;i++){dp[i]=size[i];if(!ru[i]) q.push(i); }	while(!q.empty()){int now=q.front();q.pop();for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;dp[to]=max(dp[to],dp[now]+size[to]);if(--ru[to]==0) q.push(to);}}return;
}int main(){memset(fi,-1,sizeof(fi));
//	memset(v,0,sizeof(v));
//	printf("%d",sizeof(ru)/1024/1024);scanf("%d%d%d",&k,&n,&m);id=n+m;for(int i=1;i<=k;i++){id++;scanf("%d%d%d",&x[i],&y[i],&tp[i]);mp[x[i]][y[i]]=id;addline(x[i],id);addline(n+y[i],id);v[id]=1;}for(int i=n+m+1;i<=id;i++){int xx=x[i-n-m],yy=y[i-n-m];if(tp[i-n-m]==1) addline(i,x[i-n-m]);else if(tp[i-n-m]==2) addline(i,n+y[i-n-m]);else{for(int j=1;j<=8;j++){int nx=xx+dx[j],ny=yy+dy[j];if(nx<0||nx>n||ny<0||ny>m) continue;if(mp[nx][ny]) addline(i,mp[nx][ny]);}}}tot=id;for(int i=1;i<=id;i++){if(!dfn[i]) tarjan(i);}
//	for(int i=n+m+1;i<=id;i++){
//		printf("i=%d col=%d size=%d\n",i-n-m,col[i],size[col[i]]);
//	}for(int i=1;i<=id;i++){int aa=col[i],bb;for(int j=fi[i];~j;j=p[j].nxt){
//			printf("i=%d j=%d\n",i,p[j].to);bb=col[p[j].to];if(aa!=bb) addline(aa,bb),ru[bb]++;}}topu();int ans=0;for(int i=id+1;i<=tot;i++) ans=max(ans,dp[i]);printf("%d",ans);return 0;
}
/*
10 7 7
2 2 1
2 4 2
1 7 2
2 7 3
4 2 2
4 4 1
6 7 3
7 7 1
7 5 2
5 2 1
*/

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

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

相关文章

Xamarin.Forms之UserDialogs 重制版本

在 forms 里面&#xff0c;目前使用比较多的弹出组件是 Acr.UserDialogs &#xff0c;但是这个组件有些小问题&#xff0c;比如 loading .hide 会同时把 toast 给一起关掉&#xff0c;android 下的 toast 希望是 安卓原生的toast 样子&#xff0c;而不是 底部弹出一个横条&…

H.Minimum-cost Flow

H.Minimum-cost Flow 题目&#xff1a; 其实就是给出每条边的单位费用&#xff0c;q次查询&#xff0c;每次查询改变所有边的容量&#xff08;所有边容量一样&#xff09;&#xff0c;问最后流出1流量的最小花费是多少&#xff1f; 题解&#xff1a; 暴力做法肯定是每次询问…

eShopOnContainers 看微服务③:Identity Service

引言通常&#xff0c;服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问。那进行 API 级别信任决策的第一步就是身份认证——确定用户身份是否可靠。在微服务场景中&#xff0c;身份认证通常统一处理。一般有两种实现形式&#xff1a;基于API 网关中心化认证&#…

P2168 [NOI2015] 荷马史诗(哈夫曼编码树)

传送门 文章目录题目描述解析细节代码题目描述 解析 其实就是构造一棵树 另所有带权点都为叶子节点 其代价为权值与深度的乘积 求最小代价及最小代价下的最小深度 可以看成一开始有n棵小树 每次把k棵合并在一起 最后合成一棵大树就行了 每次合并的代价是k棵树的权值和 看到这…

B-Suffix Array

B-Suffix Array 题意&#xff1a; 一个字符串只含有a和b&#xff0c;先给出b数组的构造方式&#xff1a; 对于每个位置i来说&#xff1a; 如果存在一个位置j&#xff0c;使得j<i,且s[j] s[i],则b[i]i-j否则b[i]0 现在对字符串每个后缀都构造B数组&#xff0c;并按照字典…

线段树合并、分裂

基本概念&#xff1a; 如果需要维护许多个大小为 \(10^5\) 级别的多重集&#xff0c;可以看做给每一个多重集建立一棵线段树。线段树的合并、分裂就是多重集的累加、分开。 这里使用动态开点的方式存储线段树树。 如果一个节点为空&#xff0c;那么它的编号为 \(0\) 。 变量释义…

(神奇的)虚树(初步了解)

参考文献&#xff1a; 博文1 博文2 博文3 引入 在一类树上动态规划问题中,题目给出的询问往往包含树上的很多各节点,并保证总的点数规模小于某个值. 如果我们直接在整颗树上进行dp的话,时间复杂度与询问的次数有关,这显然是不可接受的,如果我们可以找到一种动态规划的方法,使…

P2048 [NOI2010] 超级钢琴(RMQ 贪心)

文章目录题目描述解析代码传送门题目描述 解析 首先&#xff0c;如果只有一个和弦&#xff0c;那么问题显然简单了 用前缀和结合ST表随便做做即可 然而 这次要求前k大的 怎么办呢&#xff1f; 参照之前有一道序列合并的做法 我们想到&#xff0c;可以先建一个优先队列&#xf…

微服务架构基础之Service Mesh

ServiceMesh(服务网格) 概念在社区里头非常火&#xff0c;有人提出 2018 年是 ServiceMesh 年&#xff0c;还有人提出 ServiceMesh 是下一代的微服务架构基础。那么到底什么是 ServiceMesh&#xff1f;它的诞生是为了解决什么问题&#xff1f;企业是否适合引入 ServiceMesh&…

P1081 [NOIP2012 提高组] 开车旅行(倍增)(动态规划)

洛谷传送门 文章目录题目描述解析代码题目描述 解析 利用倍增&#xff0c;设计dp慢慢敲即可。。。 注意距离累加在一起会爆int&#xff0c;需要ll 特判条件非常之复杂。。。 心力交瘁&#xff0c;就酱了 代码 #include <bits/stdc.h> using namespace std; #define ll…

dotnet core调试docker下生成的dump文件

最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象&#xff0c;有时会突然吃掉几个G,触发监控预警&#xff0c;造成容器重启。分析了各种可能原因&#xff0c;修复了可能发生的内存泄露&#xff0c;经测试本地正常&#xff0c;但是发到预生产还是会有内存暴涨现…

Quadratic Form

Quadratic Form 题意&#xff1a; 一个n * n 的正定矩阵和一个n维的向量b&#xff0c;现在找一个x1&#xff0c;x2&#xff0c;…xn满足以下条件&#xff1a; 求这个式子&#xff0c;最后输出P * Q-1 mod 998244353. 题解&#xff1a; 参考 线性代数学过n阶正定的实矩阵等…

8分钟学会Consul集群搭建及微服务概念

Consul介绍&#xff1a;Consul 是由 HashiCorp 公司推出的开源软件&#xff0c;用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案&#xff0c;Consul 的方案更“一站式”&#xff0c;内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Valu…

最小代价(区间dp)(ybtoj)

文章目录题目描述解析代码题目描述 解析 &#xff08;我觉得&#xff09;很难的dp 思路是真的没有想出来 关键在于dp的设计&#xff1a; dp[l][r]&#xff1a;[l,r]的最小价值 f[l][r][a][b]&#xff1a;把l到r之间除了数值在[a,b]之间的数全部消掉需要的最小价值 &#xff08…

.net core i上 K8S(六).netcore程序的service网络代理模式

正文上一章我们讲了pod的hostip模式&#xff0c;但在生产环境中&#xff0c;我们都是通过service来访问k8s集群的&#xff0c;service有两种模式来暴漏端口&#xff0c;今天我们来分享一下1.clusterIP模式我们在创建service的时候&#xff0c;默认创建的时clusterIP模式&#x…

Jamie and Tree[CF916E]

Jamie and Tree[CF916E] 题意&#xff1a; 有一棵n个点的树&#xff0c;每个节点上有一个权值wi&#xff0c;最开始根为1号点&#xff0e;现在有3种 类型的操作&#xff1a; • 1 root, 表示将根设为root. • 2 u v x, 设u, v的最近公共祖先为p, 将p的子树中的所有点的权值加…

领域驱动设计,让程序员心中有码(三)

“正如西方古典哲学在现代社会逐渐式微&#xff0c;成为少数内心丰满者们填充自己精神世界的宝贵食物&#xff0c;UML也这样&#xff1b;互联网技术飞速发展的今天&#xff0c;各类软件设计思想层出不穷&#xff0c;正是站在UML和其他各种软件基础理论巨人的肩膀上&#xff0c;…

Tavan

Tavan–简单的k进制题 呵呵真的简单 也就是考试没做出来罢了&#xff0c;不慌不慌&#xff0c;奶我一口&#xff0c;还能活 【题目摘要】 题目描述 小 Zeljko 一直在阁楼里读他奶奶的旧信&#xff0c;并且发现了一个长度为 N 的单词。 不幸的是&#xff0c;由于溢出的墨水&…

.NET Core 2.x中使用Named Options处理多个强类型配置实例

来源&#xff1a; Using multiple instances of strongly-typed settings with named options in .NET Core 2.x作者&#xff1a; Andrew Lock译者&#xff1a; Lamond Lu.NET Core从1.0版本开始&#xff0c;就已经开始使用Options模式绑定强类型配置对象。从那时起到现在&…

YBTOJ:魔法数字(数位dp)

文章目录题目描述解析题目描述 解析 迷惑。。。 首先&#xff0c;比较容易想到用二进制状态压缩记录1-9是否在十进制中出现过 然后就是整除的问题 如果记录余数&#xff0c;它的模数又有9个 开九维余数直接爆炸。。。 怎么办嘞&#xff1f; 有一个结论&#xff1a; 若&#xf…