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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ3498 : PA2009 Cakes

發(fā)布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ3498 : PA2009 Cakes 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

令三元環(huán)(i,j,k)中i>j>k,則每條邊只需要從大點連向小點

設(shè)d[x]表示從x連出的邊的條數(shù)

從1到n枚舉點i,然后枚舉所有與i相連的邊(i,x)(x<i)

如果$d[x]\leq\sqrt{m}$,則依次判斷與x相連的邊(x,y)(y<x)中的y是否與i相連

否則,依次判斷與i相連的邊(i,y)(y<x)中的y是否與x相連

用Hash表支持$O(1)$詢問

時間復(fù)雜度$O(m\sqrt{m})$

?

#include<cstdio> #include<algorithm> using namespace std; const int N=100010,M=250010,B=(1<<23)-1,BUF=5000000; struct edge{int v;edge*nxt;}epool[M],*ecur=epool,*g[N],*j,*k; struct Edge{int x,y;Edge*nxt;}Epool[M],*Ecur=Epool,*G[B+1],*l; int n,m,i,a[N],d[N],x,y,lim,hash;long long ans;char Buf[BUF],*buf=Buf;pair<int,int>e[M]; inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;} inline int vis(int x,int y){for(l=G[(x<<8|y)&B];l;l=l->nxt)if(l->x==x&&l->y==y)return 1;return 0;} int main(){fread(Buf,1,BUF,stdin),read(n),read(m);while(lim*lim<m)lim++;for(i=1;i<=n;i++)read(a[i]);for(i=0;i<m;i++){read(x),read(y);if(x<y)swap(x,y);e[i].first=x,e[i].second=y;}for(sort(e,e+m),i=0;i<m;i++){d[x=e[i].first]++;ecur->v=y=e[i].second;ecur->nxt=g[x];g[x]=ecur++;Ecur->x=x;Ecur->y=y;Ecur->nxt=G[hash=(x<<8|y)&B];G[hash]=Ecur++;}for(i=3;i<=n;i++)for(j=g[i];j;j=j->nxt){y=a[i]>a[x=j->v]?a[i]:a[x];if(d[x]<=lim){for(k=g[x];k;k=k->nxt)if(vis(i,k->v))ans+=y>a[k->v]?y:a[k->v];}else for(k=j->nxt;k;k=k->nxt)if(vis(x,k->v))ans+=y>a[k->v]?y:a[k->v];}return printf("%lld",ans),0; }

  

?

總結(jié)

以上是生活随笔為你收集整理的BZOJ3498 : PA2009 Cakes的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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