国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj3204[SDOI2013]城市規劃

2019-11-06 06:10:44
字體:
來源:轉載
供稿:網友

傳送門 一道蛋疼的線段樹。 發現m很小,于是我們按照橫坐標建線段樹。然后用并查集維護上下2*m個節點的連通性。 然后這題略卡內存。

#include<cstring> #include<cmath> #include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm>#define N 100005using namespace std;char ch[10];int n,m,mp[N][10],x,y,f[30],tag[30],v[30],q;int get(int x){return f[x]==x?x:f[x]=get(f[x]);}struct node{ int f[14],tag[14],l,r,sum; int get(int x){return x==f[x]?x:f[x]=get(f[x]);} void make(){ int p=l; sum=0; for (int i=1;i<=2*m;i++) f[i]=i,tag[i]=0; for (int i=1;i<=m;i++) if (mp[p][i]==4) tag[i]=1,sum++; for (int i=1;i<=m;i++) if (mp[p][i]>1){ if (i!=1&&mp[p][i-1]>1){ int x=get(i),y=get(i-1); if (x!=y){ f[y]=x; if (tag[x]&&tag[y]) sum--; else if (tag[y]) tag[x]=1; } } if (i!=m&&mp[p][i+1]>1){ int x=get(i),y=get(i+1); if (x!=y){ f[y]=x; if (tag[x]&&tag[y]) sum--; else if (tag[y]) tag[x]=1; } } } for (int i=1;i<=m;i++) f[i+m]=f[i]; }}t[N*4];node merge(node x,node y){ node tmp; memset(tmp.tag,0,sizeof(tmp.tag)); tmp.l=x.l; tmp.r=y.r; tmp.sum=x.sum+y.sum; for (int i=1;i<=2*m;i++) f[i]=x.f[i],tag[i]=x.tag[i]; for (int i=1;i<=2*m;i++) f[i+2*m]=y.f[i]+2*m,tag[i+2*m]=y.tag[i]; int p=x.r,q=p+1; for (int i=1;i<=m;i++) if (mp[p][i]!=0&&mp[p][i]!=2&&mp[q][i]!=0&&mp[q][i]!=2){ int x=get(m+i),y=get(m*2+i); if (x!=y){ f[x]=y; if (tag[x]&&tag[y]) tmp.sum--; else if (tag[x]) tag[y]=1; } } memset(v,0,sizeof(v)); for (int i=1;i<=m;i++){ int x=get(i); if (!v[x]) v[x]=i,tmp.tag[i]=tag[x]; x=get(i+3*m); if (!v[x]) v[x]=i+m,tmp.tag[i+m]=tag[x]; } for (int i=1;i<=m;i++){ tmp.f[i]=v[get(i)]; tmp.f[i+m]=v[get(i+3*m)]; } return tmp;}void build(int x,int l,int r){ t[x].l=l,t[x].r=r; if (l==r){ t[x].make(); return; } int mid=(l+r)/2; build(x*2,l,mid); build(x*2+1,mid+1,r); t[x]=merge(t[x*2],t[x*2+1]);}void rebuild(int x,int y){ int l=t[x].l,r=t[x].r,mid=(l+r)/2; if (l==r){ t[x].make(); return; } if (y<=mid) rebuild(x*2,y); else rebuild(x*2+1,y); t[x]=merge(t[x*2],t[x*2+1]);}node ask(int x,int a,int b){ int l=t[x].l,r=t[x].r,mid=(l+r)/2; if (l==a&&r==b) return t[x]; if (b<=mid) return ask(x*2,a,b); if (a>mid) return ask(x*2+1,a,b); return merge(ask(x*2,a,mid),ask(x*2+1,mid+1,b));}inline int change(char ch){ if (ch=='.') return 0; if (ch=='|') return 1; if (ch=='-') return 2; if (ch=='+') return 3; if (ch=='O') return 4;}int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i++){ scanf("%s",ch+1); for (int j=1;j<=m;j++) mp[i][j]=change(ch[j]); } build(1,1,n); scanf("%d",&q); for (int i=1;i<=q;i++){ scanf("%s",ch); if (ch[0]=='Q'){ scanf("%d%d",&x,&y);
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永兴县| 保定市| 大安市| 宝鸡市| 安阳市| 抚顺市| 航空| 苍山县| 德惠市| 阿坝县| 内丘县| 梁山县| 大渡口区| 吉林市| 泰州市| 浠水县| 射洪县| 江达县| 忻城县| 河南省| 闽侯县| 台安县| 湘潭县| 隆化县| 永宁县| 抚州市| 黄龙县| 黄大仙区| 邓州市| 荃湾区| 长兴县| 建平县| 鹤峰县| 资溪县| 丹东市| 凤山县| 永修县| 揭东县| 四子王旗| 南溪县| 伊通|