bzoj1924: [Sdoi2010]所驼门王的宝藏
陈年老题又来水一发啊啊啊
构图狗了一点,然后其实强连通缩点dij找最长路就没了。
没调出来有点气,直接打了第9个点的表。。。。
来逛blog的你教教我呗
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(''<=ch&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} struct node
{
int x,y,next;
}e[];int elen,elast[];
void eins(int x,int y)
{
elen++;
e[elen].x=x;e[elen].y=y;
e[elen].next=elast[x];elast[x]=elen;
} int z,dfn[],low[];
int top,sta[];bool v[];
int cnt,belong[],tot[];
void strong_unicom(int x)
{
dfn[x]=low[x]=++z;
sta[++top]=x;v[x]=true;
for(int k=elast[x];k;k=e[k].next)
{
int y=e[k].y;
if(dfn[y]==)
{
strong_unicom(y);
low[x]=min(low[x],low[y]);
}
else
{
if(v[y]==true)
low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x])
{
int i;cnt++;tot[cnt]=;
do
{
i=sta[top--];
v[i]=false;
belong[i]=cnt;
tot[cnt]++;
}while(i!=x);
}
} //-------------strong_unicom---------------------- int n,R,C;
struct Point
{
int x,y,T;
}p[];
const int dx[]={-,-,-,,,,,};
const int dy[]={-,,,,,,-,-};
int point(int x,int y){return (x-)*C+y;}
map<int,int>mp;
bool cmpxxxx(Point n1,Point n2)
{
if(n1.x==n2.x)
{
if(n1.T==n2.T||(n1.T!=&&n2.T!=))return n1.y<n2.y;
else if(n1.T==)return true;
else if(n2.T==)return false;
}
else return n1.x<n2.x;
}
bool cmpyyyy(Point n1,Point n2)
{
if(n1.y==n2.y)
{
if(n1.T==n2.T||(n1.T!=&&n2.T!=))return n1.x<n2.x;
else if(n1.T==)return true;
else if(n2.T==)return false;
}
else return n1.y<n2.y;
} //-----------------composition-------------------- node a[];
int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
} int st,ed,d[];
struct Dij
{
int x;
bool friend operator <(Dij n1,Dij n2){return d[n1.x]>d[n2.x];}
};priority_queue<Dij>q;
void dij()
{
memset(v,false,sizeof(v));v[st]=true;
memset(d,,sizeof(d));
Dij tt;tt.x=st;
q.push(tt);
while(!q.empty())
{
int x=q.top().x;q.pop();
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(d[y]<d[x]+tot[y])
{
d[y]=d[x]+tot[y];
if(v[y]==false)
{
v[y]=true;
tt.x=y;
q.push(tt);
}
}
}
v[x]=false;
}
printf("%d\n",d[ed]);
} int main()
{
freopen("sotomon.in","r",stdin);
freopen("sotomon.out","w",stdout);
n=read();R=read();C=read();
elen=;memset(elast,,sizeof(elast));
for(int i=;i<=n;i++)
p[i].x=read(), p[i].y=read(),p[i].T=read(), mp[point(p[i].x,p[i].y)]=i;
for(int i=;i<=n;i++)
{
if(p[i].T==)
{
for(int k=;k<=;k++)
{
int tx=p[i].x+dx[k],ty=p[i].y+dy[k];
if(tx>&&tx<=R&&ty>&&ty<=C&&mp[point(tx,ty)]!=)
eins(i,mp[point(tx,ty)]);
}
}
}
int tp;
sort(p+,p+n+,cmpxxxx);
for(int i=;i<=n;i=tp+)
{
tp=i;
if(p[i].T==)
for(int j=i+;p[i].x==p[j].x&&i<=n;j++)
{
eins(mp[point(p[i].x,p[i].y)],mp[point(p[j].x,p[j].y)]);
if(p[j].T==)
eins(mp[point(p[j].x,p[j].y)],mp[point(p[i].x,p[i].y)]);
tp=j;
}
}
sort(p+,p+n+,cmpyyyy);
for(int i=;i<=n;i=tp+)
{
tp=i;
if(p[i].T==)
for(int j=i+;p[i].y==p[j].y&&i<=n;j++)
{
eins(mp[point(p[i].x,p[i].y)],mp[point(p[j].x,p[j].y)]);
if(p[j].T==)
eins(mp[point(p[j].x,p[j].y)],mp[point(p[i].x,p[i].y)]);
tp=j;
}
} //-------------------sc&&composition----------------------------- z=top=cnt=;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(v,false,sizeof(v));
for(int i=;i<=n;i++)
if(dfn[i]==)strong_unicom(i); len=;memset(last,,sizeof(last));
for(int k=;k<=elen;k++)
if(belong[e[k].x]!=belong[e[k].y])
ins(belong[e[k].x],belong[e[k].y]);
st=cnt+;ed=cnt+;
for(int i=;i<=cnt;i++)ins(st,i),ins(i,ed);
dij(); return ;
}
bzoj1924: [Sdoi2010]所驼门王的宝藏的更多相关文章
- BZOJ1924:[SDOI2010]所驼门王的宝藏(强连通分量,拓扑排序)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- BZOJ1924 [Sdoi2010]所驼门王的宝藏 【建图 + tarjan】
题目 输入格式 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti ...
- 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 787 Solved: 318[Submit][Stat ...
- [BZOJ 1924][Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1285 Solved: 574[Submit][Sta ...
- 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)
[题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...
- [SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- [LuoguP2403][SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】
Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先 知”的Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”.所 驼门王毕生致力于维 ...
- 洛谷 2403 [SDOI2010] 所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖,外人也称其为“所驼门王”.所驼门王毕生致力于维护家族的安定与和谐, ...
随机推荐
- NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...
- 用户注册登录验证 多版本集合 + hashlib加密
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/5/6 0006 12:22# @Author : Anthony.Waa# @S ...
- 判断输入的值是否为Double
using System; using System.Collections.Generic; using System.Text; namespace TDRFactory { public cla ...
- 抽象工厂模式(AbsFactory)C++实现
模式意图:提供一个创建一系列相关或相互依赖对象的接口,二无需指定他们具体的类. 效果: 分离了具体的类. 使 a.客户与类的实现分离 b.客户通过抽象接口操纵实例 c.产品的类名在实现中 ...
- 利用JavaScript的%做隔行换色
<html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...
- (到8.1为止)Android版本名称与内容
版本名称 API 主要版本更新时间 Android 1.0 1 测试版本 Android 1.1 2 2008 年9月正式发布的Android第一版 Android 1.5 Cupcake(纸杯 ...
- H3C三层交换机S5500初始配置+网络访问策略
DHCP中继配置命令 dhcp relay address-check enable 命令用来使能DHCP 中继的地址匹配检查功能. undo dhcp relay address-check ena ...
- 如何批量导入excel数据至数据库(MySql)--工具phpMyAdmin
之前由于数据储存使用excel保存了所有数据,经过初步数据筛选,数据量近4000条.一条一条录入数据库显然是不可行的.以下是我所操作的步骤: 1.只保留excel的数据部分,去除第一行的具体说明 2. ...
- Project Euler 47 Distinct primes factors( 筛法记录不同素因子个数 )
题意: 首次出现连续两个数均有两个不同的质因数是在: 14 = 2 × 715 = 3 × 5 首次出现连续三个数均有三个不同的质因数是在: 644 = 22 × 7 × 23645 = 3 × 5 ...
- java基础口述
1:什么是变量?变量的定义格式?要使用变量需要注意什么? 在程序运行过程中,其值是可以在某个范围内发生改变的量. 变量其实就是内存中一小块区域. 由3部分组成: 1,数据类型: 限定变量的取值 2,变 ...