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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[补集转化 有序化去重] Ural 1212 Battleship

發布時間:2023/12/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [补集转化 有序化去重] Ural 1212 Battleship 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

論文:許智磊--淺談補集轉化思想在統計問題中的應用


可以發現這道題長度極小 總數極小 轉化為總數減去有相交

去重可以運用有序化的思想?


如何排除這種重復計數呢?我們采用一種排除重復的常用方法:有序化。也就是設法對于新矩形的一種擺放方案,只在處理與它相交的編號最小的已有矩形時才允許計入總數T。例如圖七中,如果我們規定左邊的黑色矩形編號較小,則在處理右邊的黑色矩形時,與它相交的藍色擺放方案就不允許計入T,因為右邊的黑色矩形并不是與藍色方案相交的編號最小的已擺放矩形。容易證明,這樣計數不會出現重復。


#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++; }inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); }inline void read(char &x){for (x=nc();x!='V' && x!='H';x=nc()); }const int N=35;struct Rect{int x1,y1,x2,y2;Rect() { }Rect(int x1,int y1,int x2,int y2):x1(x1),y1(y1),x2(x2),y2(y2) { }friend bool cross(Rect A,Rect B){return B.x1<=A.x2+1 && B.x2>=A.x1-1 && B.y1<=A.y2+1 && B.y2>=A.y1-1;} }R[N];int n,m,L;int main(){char type; int len; int dx,dy;freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n); read(m); read(L);for (int i=1;i<=L;i++){read(R[i].x1); read(R[i].y1); swap(R[i].x1,R[i].y1);read(len); R[i].x2=R[i].x1; R[i].y2=R[i].y1;read(type); if (type=='V') R[i].x2+=len-1; else R[i].y2+=len-1;}read(len); int Ans=0;if (len<=m){dx=1; dy=len;Ans+=(n-dx+1)*(m-dy+1);for (int i=1;i<=L;i++){for (int x=R[i].x1-dx;x<=R[i].x2+1;x++)for (int y=R[i].y1-dy;y<=R[i].y2+1;y++){if (x<=0 || x+dx-1>n || y<=0 || y+dy-1>m) continue;Rect tem=Rect(x,y,x+dx-1,y+dy-1);int flag=0;for (int j=i+1;j<=L && !flag;j++)if (cross(tem,R[j]))flag=1;if (!flag)Ans--;}}}if (len!=1 && len<=n){dx=len; dy=1;Ans+=(n-dx+1)*(m-dy+1);for (int i=1;i<=L;i++){for (int x=R[i].x1-dx;x<=R[i].x2+1;x++)for (int y=R[i].y1-dy;y<=R[i].y2+1;y++){if (x<=0 || x+dx-1>n || y<=0 || y+dy-1>m) continue;Rect tem=Rect(x,y,x+dx-1,y+dy-1);int flag=0;for (int j=i+1;j<=L && !flag;j++)if (cross(tem,R[j]))flag=1;if (!flag)Ans--;}}}printf("%d\n",Ans);return 0; }

總結

以上是生活随笔為你收集整理的[补集转化 有序化去重] Ural 1212 Battleship的全部內容,希望文章能夠幫你解決所遇到的問題。

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