【JZOJ 3738】理想城市
来源:互联网 发布:手机安装电脑软件 编辑:程序博客网 时间:2024/04/30 10:14
Description
Solution
看到是网格上求距离,考虑一下把横竖分开来求,
注意:题目保证两两点的最短路都是唯一的。
先统计竖着总共走了多少步,把每一段连续的横着划分,使得图由很多个宽度为1的矩形组成,
把两两相连的矩形连边,发现是一棵树,树上的每个点中都包含了原图中的一些点,
那么,原图中点
用树形DP即可。
现在,竖着走的问题解决了,横着走也一样。
复杂度:
Code
#include <iostream>#include <cstdio>#include <cstdlib>#define fo(i,a,b) for(int i=a;i<=b;i++)#define efo(i,q) for(int i=A[q];i;i=B1[i][0])#define YS(x,y) ((LL)(x)*1000000+(y))using namespace std;typedef long long LL;const int N=100500,M=250317,mo=1e9;int read(int &n){ char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;}int m,n,m1;LL Hx[M][2];int B[N][4],B1[N*2][2],A[N],B0;int FX[4][2]={{-1,0},{1,0},{0,-1},{0,1}};bool z[N];int si[N];int HX(int x,int y){ LL q=YS(x,y); int i=q%M; while(Hx[i][0]&&Hx[i][1]!=q)i=(i+1)%M; return i;}void link(int q,int w){ B1[++B0][0]=A[q],A[q]=B0,B1[B0][1]=w;}int dfsf1(int q){ int t=++m1; si[t]=-1; for(int i=q;i;i=B[i][2])z[i]=1,si[t]++; for(int i=q;i;i=B[i][3])z[i]=1,si[t]++; for(int i=q;i;i=B[i][2])fo(j,0,1)if(!z[B[i][j]])link(t,dfsf1(B[i][j])); for(int i=q;i;i=B[i][3])fo(j,0,1)if(!z[B[i][j]])link(t,dfsf1(B[i][j])); return t;}int dfsf2(int q){ int t=++m1; si[t]=-1; for(int i=q;i;i=B[i][0])z[i]=0,si[t]++; for(int i=q;i;i=B[i][1])z[i]=0,si[t]++; for(int i=q;i;i=B[i][0])fo(j,2,3)if(z[B[i][j]])link(t,dfsf2(B[i][j])); for(int i=q;i;i=B[i][1])fo(j,2,3)if(z[B[i][j]])link(t,dfsf2(B[i][j])); return t;}LL f[N],f1[N],ans;void dfs(int q){ f[q]=f1[q]=0; efo(i,q) { dfs(B1[i][1]); ans=(ans+f[q]*f1[B1[i][1]]+f[B1[i][1]]*f1[q])%mo; f[q]=(f[q]+f[B1[i][1]])%mo,f1[q]+=f1[B1[i][1]]; } ans=(ans+si[q]*f[q])%mo; f1[q]+=si[q]; f[q]+=f1[q];}int main(){ freopen("city.in","r",stdin); freopen("city.out","w",stdout); int q,w; read(n); fo(i,1,n) { read(q),read(w); int t=HX(q,w); Hx[t][0]=i; Hx[t][1]=YS(q,w); fo(j,0,3) { int t=Hx[HX(q+FX[j][0],w+FX[j][1])][0]; if(!t)continue; B[i][j]=t; if(j<2)B[t][(j+1)%2]=i; else B[t][(j-1)%2+2]=i; } } z[0]=1;m1=0; dfsf1(1); dfs(1); z[0]=m1=B0=0; fo(i,0,n)A[i]=0; dfsf2(1); dfs(1); printf("%lld\n",ans); return 0;}
0 0
- 【JZOJ 3738】理想城市
- 【IOI 2012】【JZOJ 3738】理想城市
- 【JZOJ3738】理想城市(city)
- 【NOI2014模拟7.11】理想城市(city)
- GPU人脸识别构建智慧城市_你理想中的智能城市长啥样?
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- 理想
- Android ThreadLocal理解--续篇
- 算法训练 最大的算式
- KMP字符串模式匹配
- 常用算符之一——回溯
- ecipse edit source lookup path
- 【JZOJ 3738】理想城市
- 蓝桥杯 ALGO-91 Anagrams问题
- 元素浮动之后文字会环绕而不是重合原因
- POJ 2386 Lake Counting(经典dfs)
- 数据库范式
- javaScript获取当前16位时间及日期
- C#数据流
- Python与人工神经网络(7)——其他正则化方法
- FASTDFS 分布式文件系统 入门