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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[bzoj4625][BeiJing2016]水晶

發布時間:2024/8/26 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [bzoj4625][BeiJing2016]水晶 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來自FallDream的博客,未經允許,請勿轉載,謝謝。


?不用驚慌,今天的題都不是小強出的。——融入了無數心血的作品,現在卻不得不親手毀掉,難以體會他的心情啊

。——那也是沒有辦法的事情,能量共振不消除的話……望著已經被裝上炸*藥的水晶,02放下了望遠鏡,看向了手 中的共振分析報告。還是會有一些水晶,幸存下來的……也許吧。地圖由密鋪的六邊形單元組成,每個單元與其他 六個單元相鄰。為了方便起見,我們用坐標(x,y,z)描述一個單元的位置,表示從原點開始按如圖所示的x,y,z方向 各走若干步之后到達的地方。有可能有兩個坐標描述同一個單元,比如(1,1,1)和(0,0,0)描述的都是原點 顯然(x,y,z)單元和(x+1, y,z),(x-1,y,z),(x,y+1,z),(x,y-1,z),(x, y, z+1),(x,y, z-1)相鄰。有N塊水晶 位于地圖的單元內,第i塊水晶位于坐標(xi, yi, zi)所表示的單元中,并擁有ci的價值。每個單元內部可能會有 多塊水晶。地圖中,有一些單元安裝有能量源。如下圖,任何滿足x+y+z是3的整數倍的坐標所描述的單元內都安裝 有能量源。 有能量源的單元中的水晶價值將會額外增加10%.如果三塊水晶所在的單元滿足特定排列,那么它們將會引發共振。 共振分兩種,a共振和b共振。a共振:如果三塊水晶所在的單元兩兩相鄰地排成一個三角形,那么會引起a共振。 圖中每一個三角形表示這三個單元各有一塊水晶將會發生一個a共振。b共振:如果三塊水晶所在的單元依次相鄰地 排成一條長度為2的直線段,且正中間的單元恰好有能量源,那么會引起b共振。 圖中粉紅色線段表示這三個單元各有一塊水晶將會發生一個b共振,黑色線段表示即使這三個單元有水晶也不會發 生b共振。現在你要炸掉一部分水晶,使得任何共振都不會發生的前提下,剩余水晶的價值總和最大。 n<=50000 考慮染成三種顏色,發現構成一個三分圖,然后最小割就可以了。 #include<iostream> #include<cstdio> #include<cstring> #include<map> #define num(x,y) ((x+2000)*4000+y+2000) #define S 0 #define T 100001 #define INF 2000000000 using namespace std; inline int read() {int x = 0 , f = 1; char ch = getchar();while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f; } bool mark[T+5];map<int,int> mp; int cnt=1,q[T+5],top,n,d[T+5],c[T+5],head[T+5],ans=0; struct crystal{int x,y,z,c;}s[T+5]; struct edge{int to,next,w;}e[T*20+5]; inline void ins(int f,int t,int w) {if(!t) return;e[++cnt]=(edge){t,head[f],w};head[f]=cnt;e[++cnt]=(edge){f,head[t],0};head[t]=cnt; }bool Ins(crystal a,int id) {int ha=num(a.x,a.y);if(mp[ha]) return s[mp[ha]].c+=a.c,1;else return 0*(mp[ha]=id); }int dfs(int x,int f) {if(x==T) return f;int used=0;for(int&i=c[x];i;i=e[i].next) if(e[i].w&&d[e[i].to]==d[x]+1){int w=dfs(e[i].to,min(e[i].w,f-used));used+=w;e[i].w-=w;e[i^1].w+=w;if(used==f) return used; }return d[x]=-1,used; } bool bfs() {memset(d,0,sizeof(d));int i,j;for(d[q[top=i=1]=S]=1;i<=top;++i) for(int j=c[q[i]]=head[q[i]];j;j=e[j].next)if(e[j].w&&!d[e[j].to])d[q[++top]=e[j].to]=d[q[i]]+1;return d[T]; }int main() {n=read();for(int i=1;i<=n;++i) {s[i].x=read(),s[i].y=read(),s[i].z=read();s[i].c=read()*10;s[i].x-=s[i].z;s[i].y-=s[i].z;s[i].z=0;if((s[i].x+s[i].y)%3==0) s[i].c+=s[i].c/10;if(Ins(s[i],i)) mark[i]=1;ans+=s[i].c;}for(int i=1;i<=n;++i) if(!mark[i]) {ins(i,i+n,s[i].c);if((s[i].x+s[i].y+30000)%3==2) ins(S,i,INF);if((s[i].x+s[i].y+30000)%3!=1){ins(i+n,mp[num(s[i].x,s[i].y+1)],INF);ins(i+n,mp[num(s[i].x+1,s[i].y)],INF);ins(i+n,mp[num(s[i].x-1,s[i].y-1)],INF);}else ins(i+n,T,INF);}while(bfs()) ans-=dfs(S,INF);printf("%.1lf",(double)ans/10);return 0; }

轉載于:https://www.cnblogs.com/FallDream/p/bzoj4625.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的[bzoj4625][BeiJing2016]水晶的全部內容,希望文章能夠幫你解決所遇到的問題。

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