BZOJ 1924 && Luogu P2403 [SDOI2010]所驼门王的宝藏 恶心建图+缩点DP
记住:map一定要这么用:
- if(mp[x[i]+dx[j]].find(y[i]+dy[j])!=mp[x[i]+dx[j]].end()) add(i,mp[x[i]+dx[j]][y[i]+dy[j]]);
而不是
- R tmp=mp[x[i]+dx[j]][y[i]+dy[j]];
- if(tmp) add(i,tmp);
别问我为什么QAQ
建图:选定一个横天门,向在这一行上的横天门连无向边,剩下的门连有向边;纵寰门一样的方法
用map判 自由_门 旁边八个点是否存在,存在就连边;
最后tarjan缩点,用dp求最长路
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- #include<vector>
- #include<map>
- #define R register int
- const int dx[]={,,,,,-,-,-},dy[]={,,,-,-,-,,};
- using namespace std;
- inline int g() {
- R ret=; register char ch; while(!isdigit(ch=getchar())) ;
- do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
- }
- #define pb(x) push_back(x)
- int k,n,m,cnt=,ind,cc,top,ans,num;
- int lst[],lst2[],x[],y[],op[],d[];
- int vr[],nxt[],fir[],dfn[],scc[],stk[],low[],c[];
- vector<int>a[],b[];
- map<int,int> mp[];
- bool vis[];
- inline void add(int u,int v) {if(u==v) return ;vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
- inline void init() {
- for(R i=;i<=n;++i) {
- R x=,sz=a[i].size();
- for(R j=;j<sz;++j) if(op[a[i][j]]==) {x=a[i][j]; break;}
- for(R j=;j<sz;++j) {add(x,a[i][j]); if(op[a[i][j]]==) add(a[i][j],x);}
- }
- for(R i=;i<=m;++i) {
- R x=,sz=b[i].size();
- for(R j=;j<sz;++j) if(op[b[i][j]]==) {x=b[i][j]; break;}
- for(R j=;j<sz;++j) {add(x,b[i][j]); if(op[b[i][j]]==) add(b[i][j],x);}
- }
- for(R i=;i<=k;++i) if(op[i]==) for(R j=;j<;++j)
- if(mp[x[i]+dx[j]].find(y[i]+dy[j])!=mp[x[i]+dx[j]].end()) add(i,mp[x[i]+dx[j]][y[i]+dy[j]]);void tarjan(int u) { low[u]=dfn[u]=++num; stk[++top]=u,vis[u]=true;
- for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
- if(!dfn[v]) {
- tarjan(v);
- low[u]=min(low[u],low[v]);
- } else if(vis[v]) low[u]=min(low[u],dfn[v]);
- } if(low[u]==dfn[u]) {
- R tmp; ++cc;
- do tmp=stk[top],--top,vis[tmp]=false,c[tmp]=cc,++scc[cc]; while(tmp!=u);
- }
- }
- int vv[],nn[],ff[];
- inline void addc(int u,int v) {vv[++cnt]=v,nn[cnt]=ff[u],ff[u]=cnt;}
- inline void solve() {
- cnt=; for(R u=;u<=k;++u) for(R i=fir[u];i;i=nxt[i])
- if(c[u]!=c[vr[i]]) addc(c[u],c[vr[i]]);
- }
- inline void dp(int u) { vis[u]=true;
- for(R i=ff[u];i;i=nn[i]) { R v=vv[i];
- if(!vis[v]) dp(v);
- d[u]=max(d[v],d[u]);
- } d[u]+=scc[u]; ans=max(d[u],ans);
- }
- signed main() {
- k=g(),n=g(),m=g();
- for(R i=;i<=k;++i) {
- x[i]=g(),y[i]=g(),op[i]=g();
- mp[x[i]][y[i]]=i;
- a[x[i]].pb(i),b[y[i]].pb(i);
- } init(); for(R i=;i<=k;++i) if(!dfn[i]) tarjan(i);
- solve(); memset(vis,false,sizeof(vis));
- for(R i=;i<=cc;++i) if(!vis[i]) dp(i);
- printf("%d\n",ans); return ;
- }
2019.04.21
upd:5秒后 (发布时显示:博文中含有违规内容: 自_由_门! (并没有下划线) ????不知所言)
BZOJ 1924 && Luogu P2403 [SDOI2010]所驼门王的宝藏 恶心建图+缩点DP的更多相关文章
- BZOJ1924 [Sdoi2010]所驼门王的宝藏 【建图 + tarjan】
题目 输入格式 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti ...
- Luogu P2403 [SDOI2010]所驼门王的宝藏
比较显然的缩点+拓扑排序题,只不过要建虚点优化建边. 首先我们发现在一个SCC里的点都是可以一起对答案产生贡献的,因此先缩成DAG,然后拓扑找最长链. 但是我们发现这题最坏情况下边数会达到恐怖的\(O ...
- [bzoj1924]P2403 [SDOI2010]所驼门王的宝藏
tarjan+DAG 上的 dp 难点在于建图和连边,其实也不难,就是细节挺恶心 我和正解对拍拍出来 3 个错误... 传送门:luogu bzoj 题目描述 有座宫殿呈矩阵状,由 \(R\times ...
- Luogu 2403 [SDOI2010]所驼门王的宝藏
BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...
- 洛谷 P2403 [SDOI2010]所驼门王的宝藏 题解
题目描述 分析 先放一张图便于理解 这一道题如果暴力建图会被卡成\(n^{2}\) 实际上,在我们暴力建图的时候,有很多边都是重复的 假如一行当中有许多横天门的话,我们就不必要把这一行当中的所有点和每 ...
- bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- 洛咕 P2403 [SDOI2010]所驼门王的宝藏
简单tarjan. 一行的横天门如果暴力连边会被卡成平方,所以只要相邻两个横天门连双向边,再随便选一个横天门向整行连边即可.纵寰门同理.ziyou门直接map暴力连边. 然后tarjan直接dp. / ...
- [BZOJ 1924][Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1285 Solved: 574[Submit][Sta ...
- 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)
[题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...
随机推荐
- noip2017列队(线段树)
维护一个方阵,支持 1.删掉一个点,剩下的点先向左看齐再向前看齐 2.询问一个位置上是哪个点 $n,m,q \leq 3 \times 10^5$ sol: 我们每行前$m-1$列维护一个线段树,最后 ...
- google android sdk下载hoosts
203.208.46.146 www.google.com #这行是为了方便打开Android开发官网 现在好像不VPN也可以打开 74.125.113.121 developer.android.c ...
- [转]前端网络(性能)监测工具berserkJS
berserkJS 是基于 Qt (C++跨平台库)开发的前端网络(性能)监测工具. 它的核心功能是通过内置 webkit 收集由页面实际网络请求相关数据. 偏重于页面上线前检测与评估. 页面性能分析 ...
- Java中读取输入方式的性能比较
程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...
- ES6学习之Reflect
Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API Reflect设计目的: 将Object对象的一些明显属于语言内部的方法(比如Object.definePrope ...
- openssh for windows
- linux日常管理-防火墙netfilter工具-iptables-2
分别是包的数量:26 包的字节:1320 处理方式 tcp协议 opt in out 源ip 目标ip 到80端口的行为. 处理行为处理有REJECT外 还有DROP ACCEPT.分别是看一 ...
- mongodb-help功能
mongo-help功能 version:2.6.12下面是示例: > help db.help() help on db methods db.m ...
- 网络编程之socket编程实例
简单实例1 server.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include ...
- 【总结整理】JQuery基础学习---样式篇
进入官方网站获取最新的版本 http://jquery.com/download/ 中文 https://www.jquery123.com/ <!--JQuery:轻量级的JavaScr ...