日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 3809. 【NOIP2014模拟8.25】设备塔

發(fā)布時(shí)間:2025/3/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 3809. 【NOIP2014模拟8.25】设备塔 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

為了封印輝之環(huán),古代塞姆利亞大陸的人民在異空間中建造了一座設(shè)備塔。
簡(jiǎn)單的說(shuō),這座設(shè)備塔是一個(gè)漂浮在異空間中的圓柱體,圓柱體兩頭的圓是計(jì)算核心,而側(cè)面則是
傳輸信息所用的數(shù)據(jù)通道,劃分成 N?m 個(gè)區(qū)塊。
然而,隨著工作的繼續(xù)進(jìn)行,他們希望把側(cè)面的一部分區(qū)塊也改造成其他模塊。然而,任何時(shí)候都
必須保證存在一條數(shù)據(jù)通道,能從圓柱體的一端通向另一端。
由于無(wú)法使用輝之環(huán)掌控下的計(jì)算系統(tǒng),他們尋求你的幫助來(lái)解決這個(gè)問(wèn)題。他們將逐個(gè)輸入想要
改造的區(qū)域,而你則執(zhí)行所有可行的改造并忽略可能導(dǎo)致數(shù)據(jù)中斷的改造。

Input

第一行,包含兩個(gè)整數(shù) N;M;K,表示側(cè)面的長(zhǎng)和寬,以及操作數(shù)。
接下來(lái)K 行,每行包含三個(gè)整數(shù) xi;yi ,表示操作的區(qū)塊的坐標(biāo)。
數(shù)據(jù)保證不會(huì)對(duì)已經(jīng)操作成功的區(qū)塊進(jìn)行操作。

Output

輸出一行,表示有多少個(gè)操作可以被執(zhí)行。

Sample Input

3 4 9
2 2
3 2
2 3
3 4
3 1
1 3
2 1
1 1
1 4

Sample Output

6

Data Constraint

? 對(duì)于分值為30 的子任務(wù)1,保證 N;M<=100;K<=5000
? 對(duì)于分值為30 的子任務(wù)2,保證 N;M<=3000;K<=5000
? 對(duì)于分值為40 的子任務(wù)3,保證 N;M<=3000;K<=300000

Hint

Solution

  • 這道題是一道神奇的模擬題!!!

  • 很容易想到的普通暴力枚舉在這個(gè)超大范圍下也無(wú)能為力~

  • 這里有一個(gè)利用并查集的巧妙方法

  • 首先,注意到路徑可以橫跨左右邊界

  • 所以,把這個(gè)圖向右復(fù)制一份,即 長(zhǎng)*2 ,點(diǎn)都雙份處理

  • 每一個(gè)點(diǎn)(編號(hào)排成一列地處理)與八連通的點(diǎn)進(jìn)行并查集

  • 那么如何判斷加點(diǎn)時(shí),所構(gòu)成的聯(lián)通快有沒(méi)有橫向封蓋呢?

  • 于是設(shè)一個(gè)標(biāo)記數(shù)組,記號(hào)可以設(shè)為數(shù)據(jù)編號(hào)這種獨(dú)一無(wú)二的號(hào)碼

  • 將要加入的點(diǎn)在左邊地圖里的八連通點(diǎn),這些點(diǎn)的父親編號(hào)在標(biāo)記數(shù)組里賦值

  • 然后在右邊地圖里的八連通點(diǎn)的父親編號(hào)在標(biāo)記數(shù)組里查詢

  • 如果已賦值,說(shuō)明加入的話會(huì)構(gòu)成橫向封蓋,則不能加入!

  • 這樣,我們就能方便的判斷,省去了在并查集數(shù)組里加加刪刪的麻煩!

  • 這樣巧妙地運(yùn)用并查集,使時(shí)間復(fù)雜度降到了 O(K) 再加一些常數(shù)!!!

Code

#include<cstdio> using namespace std; const int N=3001,M=2*N*N; const int way[8][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{-1,1},{-1,-1},{1,-1}}; int n,m,cnt,ans; int f[M],g[M]; bool bz[M]; bool pd; inline int read() {int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data; } inline int get(int x,int y){return (x-1)*2*m+y;} inline int find(int x){return (f[x]==x)?x:f[x]=find(f[x]);} inline void work(int x,int y) {int p=get(x,y);bz[p]=true;for(int i=0;i<8;i++){int xx=x+way[i][0],yy=y+way[i][1];if(!xx || xx>n) continue;if(!yy) yy+=2*m; else if(yy>2*m) yy-=2*m;int q=get(xx,yy);if(bz[q]){int f1=find(p),f2=find(q);if(f1!=f2) f[f1]=f2;} } } int main() {n=read(),m=read(),cnt=get(n,2*m);for(int i=1;i<=cnt;i++) f[i]=i;int k=read()+1;while(--k){int x=read(),y=read();for(int i=0;i<8;i++){int xx=x+way[i][0],yy=y+way[i][1];if(!xx || xx>n) continue;if(!yy) yy+=2*m; else if(yy>2*m) yy-=2*m;int p=get(xx,yy);if(bz[p]) g[find(p)]=k;}for(int i=pd=0;i<8;i++){int xx=x+way[i][0],yy=y+m+way[i][1];if(!xx || xx>n) continue;if(!yy) yy+=2*m; else if(yy>2*m) yy-=2*m;int p=get(xx,yy);if(bz[p] && g[find(p)]==k){pd=true;break;}}if(!pd){ans++;work(x,y);work(x,y+m);}}printf("%d",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的JZOJ 3809. 【NOIP2014模拟8.25】设备塔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。