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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces 1109F. Sasha and Algorithm of Silence's Sounds

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 1109F. Sasha and Algorithm of Silence's Sounds 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

給出一個 n?mn*mn?m 的網格圖,保證所有位置上的數形成一個 1?n?m1 -n*m1?n?m 的排列。

問有多少個值域區間 [l,r][l,r][l,r] 滿足,在 [l,r][l,r][l,r] 中的數在網格圖上的位置形成一棵樹。

n?m≤200000,n,m≤1000n*m\leq200000,n,m\leq1000n?m200000,n,m1000

題目鏈接:Codeforces 1109F. Sasha and Algorithm of Silence’s Sounds

Solution

  • 考慮到形成一棵樹要同時滿足兩個條件:無環、連通

  • 維護兩個指針 l,rl,rl,r ,表示當前做到的值域范圍。

  • 每次將 rrr 右移一位,用 LCT 維護最小的 lll 使得將 [l,r][l,r][l,r] 的點加入后沒有成環,即森林(條件①)。

  • 那么我們要計算的就是這個區間內有多少個 l′l'l 使得 [l′,r][l',r][l,r] 滿足條件。

  • 由于 連通塊個數 = 點數 - 邊數 ,那么我們維護一棵線段樹記錄每個位置的 “點數 - 邊數” 。

  • 注意到這個值是非負的,于是線段樹統計區間最小值及其個數,支持區間加減和區間查詢即可。

  • 我們看看區間 [l,r][l,r][l,r] 內的最小值是不是 111 ,是就加上其個數就可以了(條件②)。

  • 時間復雜度 O(nmlog(nm))O(nm\ log\ (nm))O(nm?log?(nm))

Code

#include<cstdio> #include<algorithm> #include<cctype> using namespace std; typedef pair<int,int> PI; const int N=2e5+5,M=1005; const int way[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; struct node {int x,y; }a[N]; int n,m,up,top,qx,qy,qz; long long ans; int fa[N],s[N][2],st[N]; bool rev[N]; PI f[N<<2]; int b[M][M],c[N<<2]; 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 bool pd(int x) {return x==s[fa[x]][1]; } inline bool isroot(int x) {return x^s[fa[x]][0] && x^s[fa[x]][1]; } inline void rotate(int x) {int y=fa[x],w=pd(x);if((fa[x]=fa[y]) && !isroot(y)) s[fa[y]][pd(y)]=x;if(s[y][w]=s[x][w^1]) fa[s[y][w]]=y;s[fa[y]=x][w^1]=y; } inline void reverse(int x) {if(x) swap(s[x][0],s[x][1]),rev[x]^=1; } inline void down(int x) {if(rev[x]){reverse(s[x][0]),reverse(s[x][1]);rev[x]=false;} } inline void splay(int x) {for(int y=st[top=1]=x;!isroot(y);y=fa[y]) st[++top]=fa[y];while(top) down(st[top--]);for(int y;!isroot(x);rotate(x))if(!isroot(y=fa[x])) rotate(pd(x)==pd(y)?y:x); } inline void access(int x) {for(int y=0;x;x=fa[y=x]) splay(x),s[x][1]=y; } inline void mkroot(int x) {access(x),splay(x),reverse(x); } inline void link(int x,int y) {mkroot(x),fa[x]=y; } inline void cut(int x,int y) {mkroot(x),access(y),splay(y);s[y][0]=fa[x]=0; } inline bool connect(int x,int y) {mkroot(x),access(y),splay(y);while(s[y][0]) y=s[y][0];return x==y; } inline void down1(int v) {if(c[v]){f[v<<1].first+=c[v];f[v<<1|1].first+=c[v];c[v<<1]+=c[v];c[v<<1|1]+=c[v];c[v]=0;} } void make(int v,int l,int r) {if(l==r){f[v].second=1;return;}int mid=l+r>>1;make(v<<1,l,mid);make(v<<1|1,mid+1,r);f[v].second=f[v<<1].second+f[v<<1|1].second; } PI cmin(PI x,PI y) {if(x.first<y.first) return x;if(x.first>y.first) return y;return make_pair(x.first,x.second+y.second); } void change(int v,int l,int r) {if(qx<=l && r<=qy){f[v].first+=qz;c[v]+=qz;return;}down1(v);int mid=l+r>>1;if(qx<=mid) change(v<<1,l,mid);if(qy>mid) change(v<<1|1,mid+1,r);f[v]=cmin(f[v<<1],f[v<<1|1]); } PI find(int v,int l,int r) {if(qx<=l && r<=qy) return f[v];down1(v);int mid=l+r>>1;PI val(N,0);if(qx<=mid) val=find(v<<1,l,mid);if(qy>mid) val=cmin(val,find(v<<1|1,mid+1,r));return val; } inline bool judge(int l,int r) {for(int i=0;i<3;i++){int x=a[r].x+way[i][0],y=a[r].y+way[i][1];if(!x || x>n || !y || y>m) continue;if(b[x][y]<l || b[x][y]>r) continue;for(int j=i+1;j<4;j++){int xx=a[r].x+way[j][0],yy=a[r].y+way[j][1];if(!xx || xx>n || !yy || yy>m) continue;if(b[xx][yy]<l || b[xx][yy]>r) continue;if(connect(b[x][y],b[xx][yy])) return true;}}return false; } inline void del(int l) {for(int i=0;i<4;i++){int x=a[l].x+way[i][0],y=a[l].y+way[i][1];if(!x || x>n || !y || y>m) continue;if(connect(b[x][y],l))cut(b[x][y],l);} } inline void add(int l,int r) {for(int i=0;i<4;i++){int x=a[r].x+way[i][0],y=a[r].y+way[i][1];if(!x || x>n || !y || y>m) continue;if(l<=b[x][y] && b[x][y]<r){link(b[x][y],r);qx=1,qy=b[x][y],qz=-1;change(1,1,up);}}qx=l,qy=r,qz=1;change(1,1,up); } int main() {n=read(),m=read(),up=n*m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){b[i][j]=read();a[b[i][j]]=(node){i,j};}make(1,1,up);for(int i=1,j=1;i<=up;i++){while(judge(j,i)) del(j++);add(j,i);qx=j,qy=i;PI sum=find(1,1,up);ans+=sum.first==1?sum.second:0;}printf("%I64d",ans);return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Codeforces 1109F. Sasha and Algorithm of Silence's Sounds的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧美熟妇毛茸茸 | 欧美在线小视频 | 日韩三级在线 | 波多野一区 | 国产激情无码一区二区 | 欧美高清视频在线观看 | 视频国产在线 | 欧美激情片在线观看 | 蜜桃精品视频 | 久久亚洲精 | 国产中文字字幕乱码无限 | 国产午夜福利100集发布 | 少妇精品偷拍高潮白浆 | 一区视频免费观看 | 欧美一本| www.夜夜爱 | 一边摸一边做爽的视频17国产 | 亚洲av无一区二区三区久久 | 国产亚洲精品码 | 日本久久黄色 | 喷水视频在线观看 | 久久久久久久久久久久久av | 夜夜躁狠狠躁日日躁av | 欧美亚洲在线播放 | 欧美一二三区在线观看 | 黄色免费网站观看 | 国产成人一区在线观看 | 91看片黄 | 男女黄色网 | 日本三级中文字幕在线观看 | 国产成人无码精品久久久久 | 日韩精品在线第一页 | 亚洲中出 | 国产麻豆精品在线观看 | 日韩国产第一页 | 中文字幕一区二区三区在线不卡 | 波多野结衣在线观看视频 | 老外一级片 | 初尝人妻少妇中文字幕 | 黄色男女网站 | 国产精品无遮挡 | 免费看黄色的网站 | 搡8o老女人老妇人老熟 | 一区二区三区毛片 | 欧美视频性 | 夜夜嗨一区二区三区 | 亚洲av永久无码国产精品久久 | 欧美天天爽| 天天综合国产 | 香蕉成人在线视频 | 能免费看18视频网站 | xxxxx毛片 | 国产经典三级在线 | 白白色视频在线 | 超碰五月天 | 亚洲男人的天堂在线 | 亚洲蜜桃视频 | 一卡二卡三卡在线视频 | 欧美美女爱爱视频 | 中日韩av在线 | 色爱色| 欧美福利视频在线观看 | 日韩精品黄 | 欧美日韩专区 | 国产剧情一区在线 | 午夜三区 | 午夜性色福利视频 | 免费亚洲视频 | 亚洲图片自拍偷拍区 | 亚洲国产无线乱码在线观看 | 极品av在线 | 免费黄色资源 | 999伊人| 日韩裸体视频 | 成年人免费在线观看 | 国产又粗又大又爽 | 久久精品电影网 | gai免费观看网站外网 | 久久国产精品影院 | 国产视频污在线观看 | 丰满孕妇性春猛交xx大陆 | 最近中文字幕第一页 | 亚洲成人伊人 | 屁屁影院一区二区三区 | av永久免费在线观看 | 久精品免费视频 | 久草影视在线观看 | 一级肉体全黄裸片中国 | 国产第一精品视频 | 精品国产一区二区在线观看 | 91尤物视频在线观看 | 91免费看国产 | 波多野结衣1区2区3区 | 欧美日韩电影一区二区 | 中文字幕国产精品 | 国产一级生活片 | 少妇按摩一区二区三区 | 久久99热这里只有精品 | 欧美激情免费在线观看 |