P2403 [SDOI2010] 所驼门王的宝藏

embedded/2024/9/22 19:19:46/

~~~~~      P2403 [SDOI2010] 所驼门王的宝藏 ~~~~~      总题单链接

讲解

~~~~~      这道题的关键在于如何连边。

~~~~~      对于“横天门”和“纵寰门”建虚点即可。

~~~~~      对于“任意门”,用一个 vector 存每行有哪些点,然后二分。

~~~~~      连完边之后缩点,然后 D P DP DP

~~~~~       c n t : cnt: cnt连通块的数量
~~~~~       d p [ i ] : dp[i]: dp[i] 到第 i i i 个连通块最多经过了多少给宝物。

for(ll u=cnt;u>=1;u--){dp[u]+=siz[u];for(ll v:ng[u])dp[v]=max(dp[v],dp[u]);
}

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;ll Q,n,m,dp[3000005];
ll X[3000005],Y[3000005],T[3000005];
vector<ll>han[1000005],eg[3000005],ng[3000000];ll stk[3000005],ins[3000005],top;
ll dfn[3000005],low[3000005],tot;
ll pos[3000005],siz[3000005],cnt;void Tarjan(ll p){dfn[p]=low[p]=++tot;stk[++top]=p;ins[p]=1;for(ll v:eg[p]){if(!dfn[v]){Tarjan(v);low[p]=min(low[p],low[v]);}else if(ins[v])low[p]=min(low[p],dfn[v]);}if(dfn[p]==low[p]){cnt++;while(top){ll v=stk[top--];ins[v]=0;pos[v]=cnt;if(v<=Q)siz[cnt]++;if(v==p)break;}}
}signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>Q>>n>>m;for(ll i=1;i<=Q;i++){cin>>X[i]>>Y[i]>>T[i];han[X[i]].push_back(i);eg[X[i]+Q].push_back(i);eg[Y[i]+Q+n].push_back(i);if(T[i]==1)eg[i].push_back(X[i]+Q);if(T[i]==2)eg[i].push_back(Y[i]+Q+n);}for(ll i=1;i<=n;i++){if(han[i].empty())continue;sort(han[i].begin(),han[i].end(),[&](ll a,ll b){return Y[a]<Y[b];});}for(ll i=1;i<=Q;i++){if(T[i]!=3)continue;ll U=max(1ll,X[i]-1),D=min(n,X[i]+1);ll L=max(1ll,Y[i]-1),R=min(m,Y[i]+1);for(ll x=U;x<=D;x++){if(han[x].empty())continue;if(Y[han[x][0]]>R)continue;if(Y[han[x][han[x].size()-1]]<L)continue;ll l=0,r=han[x].size()-1,res=0;while(l<=r){ll mid=(l+r)>>1;if(Y[han[x][mid]]>=L)res=mid,r=mid-1;else l=mid+1;}for(ll y=res;y<han[x].size()&&Y[han[x][y]]<=R;y++){if(i==han[x][y])continue;eg[i].push_back(han[x][y]);}}}for(ll i=1;i<=Q+n+m;i++)if(!dfn[i])Tarjan(i);for(ll u=1;u<=Q+n+m;u++)for(ll v:eg[u])if(pos[u]!=pos[v])ng[pos[u]].push_back(pos[v]);for(ll u=cnt;u>=1;u--){dp[u]+=siz[u];for(ll v:ng[u])dp[v]=max(dp[v],dp[u]);}ll ans=0;for(ll i=1;i<=cnt;i++)ans=max(ans,dp[i]);cout<<ans;return 0;
}

http://www.ppmy.cn/embedded/102991.html

相关文章

一些关于Vue2的面试题

1.v-if和v-show的区别&#xff1f; v-show通过css中的display控制隐藏和显示&#xff0c;v-if是真的渲染和销毁 如果显示隐藏切换比较频繁&#xff0c;使用v-show&#xff0c;否则使用v-if 2.为什么v-for要使用key&#xff1f; 快速找到节点&#xff0c;减少渲染次数&#…

深度学习:革新药物心脏毒性预测的新篇章

药物研发是一项充满挑战与风险的领域&#xff0c;尽管科学家们投入大量时间与资源&#xff0c;但仍有高达90%的药物因无法通过临床试验而宣告失败。其中&#xff0c;药物的心脏毒性是一个尤为棘手的问题&#xff0c;不少药物在上市后因被发现对心脏有潜在伤害而被迫召回&#x…

一、菜单扩展

一、创建文件夹 创建一个名为Editor的文件夹。unity会默认这个名字为工程文件夹 二、创建代码 实现点击unity菜单&#xff0c;对应代码的方法 引用命名空间&#xff1b;使用这个menuitem 注&#xff1a;必须有一个子路径&#xff0c;不然会报错 这里是这个方法的参数 每一个…

CSS 的object-position属性的作用规则

object-position CSS 属性用于指定替换元素&#xff08;如 <img> 或 <video>&#xff09;的内容在其容器内的对齐方式。这个属性与 object-fit 紧密相关&#xff0c;因为 object-fit 控制了内容如何适应其容器的大小&#xff0c;而 object-position 则决定了内容在…

Java 泛型与增强for

泛型 泛型就是在集合中指定存储的数据类型&#xff0c;而且只能存储这种类型&#xff0c;在List<类型>必须要指定&#xff0c;ArrayList<>可以指定可以不指定&#xff0c;基本数据类型不能作为泛型。 确定了泛型为 String&#xff0c;调用该方法时传递的参数类型也…

PyQt 迁移到 PySide

将 PyQt 迁移到 PySide 的过程主要包括以下几个步骤。PySide 和 PyQt 的 API 基本相似&#xff0c;但是仍有一些细微的差别。下面是一些通用的迁移步骤&#xff1a; 1. 安装 PySide 首先&#xff0c;你需要安装 PySide2 或 PySide6&#xff08;取决于你希望使用的版本&#x…

SSRF漏洞(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文基于pikachu&#xff08;皮卡丘&#xff09;靶场进行SSRF渗透攻击教学。 靶场环境搭建&#xff1a;SSRF漏洞&#xff08;三&#xff09; 一&#xff0c;SSR…

Jhipster应用,cdn加速方案。

Jhipster, 采用springbootwebfluxreacttypescript技术栈。项目部署是采用k8shelm 部署在GCP上的&#xff0c;所以这个单体项目幕后是跑在pod上的。 项目上线后&#xff0c;发现单页面应用加载速度很慢&#xff0c;如图所示长时间处于加载状态&#xff1a; 仔细分析一下原因&am…