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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 3815. 【NOIP2014模拟9.7】克卜勒

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 3815. 【NOIP2014模拟9.7】克卜勒 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

一閃一閃亮晶晶/好像你的身體/藏在眾多孤星之中/還是找得到你/掛在天上放光明/反射我的孤寂/提醒我/我也只是一顆寂寞的星星/oh~/浩瀚的世界里/更迭的人海里/和你互相輝映/而我們連續/連接所有思念/唱一首歌給你/給你

Zyh在浩瀚的宇宙中發現了一個神奇的星系。這個星系上很可能有文明的痕跡,因為它的星球的連接方式非常特別。
具體的來說整個星系由若干個小星系組成,這若干個小星系是由若干個星球組成的。星系由n個小星系組成,這n個小星系在這里可以抽象成一個小圓。小星系編號1~n首尾相接形成一個大圓。若將第i個小星系放大,那么看到的就是Ci個星球。這些星球也是首尾相接形成了一個大圓。特別地,每個小星系中有兩個星球x,y,分別成為起始星球和結束星球。在整個星系大圓的構成中實際上是由上一個小星系的結束星球連接著下一個小星系的起始星球。如果嫌棄語文拿B的Zyh說的不清楚可以看下面的圖。

其中用黃綠色細線畫的圈是一個個小星系,其中是有若干個星球,紅色是起始星球,藍色是結束星球。
然而星球之間的通信是一個問題。Zyh認為,星球會有兩個狀態,允許通行和禁止通行。星球的編號即使是在不同的小星系中也是兩兩不同的,如果是第I個小星系的第J個星球,那么編號應該是[sigma(1<=i

Input

首先是一個正整數n表示小星系的個數,然后是n行。每行的開始是Ci表示這個小星系的星球個數。接著是Ci+2個數字,分別是S[1] …… S[Ci] x y。S[j]表示第i個小星系的第j個星球的通行狀態。0表示禁止通行,1表示允許通行。x和y表示這個小星系的第x第y個分別是起始和結束星球。
然后是一個正整數m,表示操作和詢問總數。接下來是m行。如果是操作那么是這樣的形式給出:1 x,表示將編號為x的星球狀態置反。如果是詢問:2 x y,表示詢問星球x和y能不能互相到達。如果可以輸出Yes,否則輸出No。

Output

對于每個詢問輸出對應的答案。

Sample Input

4
3 1 1 0 2 1
2 1 0 2 1
3 0 1 0 1 3
4 0 0 1 1 2 4
12
2 1 2
2 1 4
1 5
2 1 11
1 6
1 7
1 8
2 2 8
1 6
2 2 8
1 10
2 2 8

Sample Output

Yes
No
Yes
Yes
No
Yes

Data Constraint

對于30%的數據 sigma Ci<=1000 , n<=100 , m<=10000
另有10%的數據 Ci<=500000,n=1 , m<=500000
對于100%的數據 sigmaCi<=500000 , n<=10000 , m<=500000 , Ci>1 , x!=y無論是詢問還是起始結束星球

Solution

  • 只要用樹狀數組在小環內維護各個點之間的連通性。(有一個點不連通則整體不連通)

  • 然后將起始點和結束點之間的連通性看成一個點,然后再用另一個樹狀數組維護即可。

  • 時間復雜度 O(N?log?N)

  • 要注意很多細節,如 n=1 時起始點和結束點有連邊、

  • 當要查詢的兩點在同一連通塊時,可以在塊內走,也能在外面繞一大圈走……

Code

#include<cstdio> #include<algorithm> #include<cctype> using namespace std; const int N=1e4+5,M=5e5+5; int n,tot,num; int f[M],g[N]; int a[M],bel[M],l[N],r[N],st[N],ed[N]; bool bz[N]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline void changef(int x,int val) {while(x<=num) f[x]+=val,x+=x&-x; } inline void changeg(int x,int val) {while(x<=n) g[x]+=val,x+=x&-x; } inline int getf(int x,int y) {int sum=0;while(y) sum+=f[y],y-=y&-y;for(x--;x;x-=x&-x) sum-=f[x];return sum; } inline int getg(int x,int y) {int sum=0;while(y) sum+=g[y],y-=y&-y;for(x--;x;x-=x&-x) sum-=g[x];return sum; } inline bool check(int x,int y) {if(x>y) swap(x,y);return !getf(x,y) || !(getf(l[bel[x]],x)+getf(y,r[bel[x]])); } int main() {n=read();for(int i=1;i<=n;i++){int c=read();l[i]=num+1,r[i]=num+c;for(int j=num+1;j<=num+c;j++){a[j]=read()^1;bel[j]=i;}st[i]=num+read(),ed[i]=num+read();num+=c;}for(int i=1;i<=num;i++)if(a[i]) changef(i,1);for(int i=1;i<=n;i++){int x=st[i],y=ed[i];if(x>y) swap(x,y);if(getf(x,y) && getf(l[i],x)+getf(y,r[i])) changeg(i,bz[i]=1);}int m=read();while(m--){if(read()==1){int pos=read();changef(pos,(a[pos]^1)-a[pos]);a[pos]^=1;int z=bel[pos],x=st[z],y=ed[z];if(x>y) swap(x,y);if(getf(x,y) && getf(l[z],x)+getf(y,r[z])){if(!bz[z]) bz[z]=true,changeg(z,1);}elseif(bz[z]) bz[z]=false,changeg(z,-1);}else{int x=read(),y=read();if(n==1)if(check(x,y) || check(st[1],x) && check(y,ed[1]) || check(ed[1],x) && check(y,st[1])){puts("Yes");continue;}if(bel[x]==bel[y]){int z=bel[x];if(check(x,y) || !(getg(1,z-1)+getg(z+1,n)) &&(check(st[z],x) && check(y,ed[z]) || check(ed[z],x) && check(y,st[z]))){puts("Yes");continue;}else{puts("No");continue;}}int xx=bel[x],yy=bel[y];if(xx>yy) swap(xx,yy),swap(x,y);if(!getg(xx+1,yy-1) && check(x,ed[xx]) && check(st[yy],y)){puts("Yes");continue;}if(!(getg(1,xx-1)+getg(yy+1,n)) && check(st[xx],x) && check(ed[yy],y)){puts("Yes");continue;}puts("No");}}return 0; }

總結

以上是生活随笔為你收集整理的JZOJ 3815. 【NOIP2014模拟9.7】克卜勒的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。