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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ 2731 Luogu P3219 [HNOI2012]三角形覆盖问题 (扫描线)

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 2731 Luogu P3219 [HNOI2012]三角形覆盖问题 (扫描线) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=2731

(luogu)https://www.luogu.org/problemnew/show/P3219

題解: 先講一種復雜度明顯不對但是本題數據跑得很快的做法: 先按底邊\(y\)坐標排序,從下往上掃,每掃到一行鏈表維護當前的所有區間,另外再開個數組記錄每個橫坐標被覆蓋的次數。復雜度\(O(\sum d_i)\)

然后ckw巨佬的做法: 按底邊\(y\)坐標排序,找出所有三角形的最左點和最右點的\(x\)坐標作為關鍵點,按\(x\)坐標從左到右掃每一個關鍵點。

對于每相鄰兩個關鍵點之間的區間,找到所有包含它的三角形,那么每個三角形在此區間內一定是一個梯形,分類討論(注意到我們已經按底邊縱坐標排好序了)

如果上面的梯形頂端比下面的梯形頂端低,那么什么也不用做;

如果上面的梯形底端比下面的梯形頂端高,那么直接把下面梯形面積加入答案然后用上面梯形取代即可;

否則i,如果上面的梯形的底邊比下面的梯形的右上點低,那么把兩個梯形拼成一個梯形即可;

如果上面的梯形的底邊比下面梯形的右上點高,那么計算下面梯形不被上面覆蓋的面積(一個矩形減一個等腰直角三角形)加入答案,然后用上面梯形取代。

時間復雜度\(O(n^2)\)

(ckw: “這種SB題有什么做的必要么”)

代碼

做法一

#include<cstdio> #include<cstdlib> #include<cstring> #include<cassert> #include<algorithm> #define llong long long using namespace std;const int N = 1e4; const int C = 2e6; struct Point {llong x,y;Point() {}Point(llong _x,llong _y) {x = _x,y = _y;} }; struct Triangle {Point x; llong d;bool operator <(const Triangle &arg) const {return x.y<arg.x.y;} }; struct Element {int lb,rb,nxt,prv; } cur[N+3]; Triangle a[N+3]; int num[C+3]; //±??2??′?êy int n,cnt;int main() {scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%lld%lld%lld",&a[i].x.x,&a[i].x.y,&a[i].d);}sort(a+1,a+n+1);int j = 0; llong ans = 0ll,tmp = 0ll;for(int i=0; i<=C; i++){//±éàúá′±í£?é?μ???é?μ? for(int k=cur[0].nxt; k!=0; k=cur[k].nxt){num[cur[k].rb]--; if(num[cur[k].rb]==0) tmp--;cur[k].rb--; if(cur[k].lb>=cur[k].rb) {cur[cur[k].prv].nxt = cur[k].nxt; cur[cur[k].nxt].prv = cur[k].prv;}}ans += tmp;//?óè?ò?′??aμ×±?μ?èy??D? while(j<n && a[j+1].x.y==i){j++;if(a[j].d==0) continue;for(int k=a[j].x.x+1; k<=a[j].x.x+a[j].d; k++){num[k]++; if(num[k]==1) tmp++;}cnt++; cur[cnt].prv = cur[0].prv; cur[cur[cnt].prv].nxt = cnt; cur[0].prv = cnt; cur[cnt].nxt = 0;cur[cnt].lb = a[j].x.x; cur[cnt].rb = a[j].x.x+a[j].d;}ans += tmp;}for(int i=0; i<=C; i++) assert(num[i]==0);printf("%lld",ans/2); if(ans&1) printf(".5"); else printf(".0");return 0; }

做法二

#include<cstdio> #include<cstdlib> #include<cstring> #include<cassert> #include<algorithm> #include<vector> #define llong long long using namespace std;const int N = 1e4; const int C = 2e6; struct Point {llong x,y;Point() {}Point(llong _x,llong _y) {x = _x,y = _y;} }; struct Triangle {Point x; llong d;bool operator <(const Triangle &arg) const {return x.y<arg.x.y;} }; Triangle a[N+3]; vector<int> ky; int n,cnt;llong sqr(llong x) {return x<0ll ? 0ll : x*x;}int main() {scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%lld%lld%lld",&a[i].x.x,&a[i].x.y,&a[i].d);if(a[i].d==0) continue;ky.push_back(a[i].x.x); ky.push_back(a[i].x.x+a[i].d);}sort(ky.begin(),ky.end());ky.erase(unique(ky.begin(),ky.end()),ky.end());sort(a+1,a+n+1);llong ans = 0ll;for(int i=1; i<ky.size(); i++){int dn = 0,up = 0; //uplfor(int j=1; j<=n; j++){if(a[j].d==0) continue;if(a[j].x.x<=ky[i-1] && a[j].x.x+a[j].d>=ky[i]){if(dn==0 && up==0) {dn = a[j].x.y; up = a[j].x.y+a[j].d-(ky[i-1]-a[j].x.x);}else{if(a[j].x.y>up){ans += 2ll*(up-dn)*(ky[i]-ky[i-1])-sqr(ky[i]-ky[i-1]);dn = a[j].x.y; up = a[j].x.y+a[j].d-(ky[i-1]-a[j].x.x);}else if(a[j].x.y+a[j].d-(ky[i-1]-a[j].x.x)>up){ans += 2ll*(ky[i]-ky[i-1])*(a[j].x.y-dn);if(a[j].x.y>up-(ky[i]-ky[i-1])) {ans -= sqr(a[j].x.y-(up-(ky[i]-ky[i-1])));}dn = a[j].x.y; up = a[j].x.y+a[j].d-(ky[i-1]-a[j].x.x);}}}}if(up==0 && dn==0);else {ans += 2ll*(up-dn)*(ky[i]-ky[i-1])-sqr(ky[i]-ky[i-1]);}}printf("%lld",ans/2); if(ans&1) printf(".5"); else printf(".0");return 0; }

總結

以上是生活随笔為你收集整理的BZOJ 2731 Luogu P3219 [HNOI2012]三角形覆盖问题 (扫描线)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 91福利在线观看视频 | 免费亚洲一区二区 | 国产美女无遮挡永久免费观看 | 波多野结衣免费观看视频 | av导航站 | 国产在线视频卡一卡二 | 欧美激情精品久久久久久变态 | 91黄色免费版| 欧美性猛交xxxx | av电影在线观看不卡 | 日本黄色a视频 | 二级毛片视频 | 久久综合色综合 | 性爽爽 | 一级性生活毛片 | 琪琪五月天| 欧美精品免费在线 | 91精品日韩 | 成人毛片在线 | 日韩精品偷拍 | 亚洲成人视屏 | 欧美一区二区三区在线视频 | 成人性生交大片 | wwwxxxx在线观看 | 免费国产视频在线观看 | 成熟女人毛片www免费版在线 | 制服丝袜第一页在线观看 | 欧美a一级 | 亚洲欧美日韩成人 | av片在线免费观看 | 97久久国产精品 | 日韩欧美国产激情 | 麻豆视频一区二区 | 少妇色视频 | 亚洲永久精品ww.7491进入 | 欧美黄色小视频 | 国产亚洲成av人在线观看导航 | 超级砰砰砰97免费观看最新一期 | аⅴ天堂中文在线网 | 中文精品一区二区三区 | 欧美国产日本在线 | 精品伦精品一区二区三区视频 | 黑人精品无码一区二区三区AV | 欧美少妇视频 | 欧美全黄| 黄色污网站在线观看 | 永久av在线免费观看 | 人人涩| 色婷婷午夜 | 精品久久久久久久久久久 | 污污视频在线免费观看 | 国产小精品 | 一级在线播放 | 国产乱国产乱300精品 | 国内精品久久久久久久久 | 精品亚洲永久免费 | 永久免费精品 | 伊人精品视频在线观看 | 成人三级在线看 | 亚洲精品乱码久久久久久蜜桃麻豆 | 性欧美一级 | 亚洲欧美激情一区二区三区 | 亚洲两性 | 亚洲精品影视 | 亚洲一区免费观看 | 不卡视频在线观看 | 91精品视频网站 | 操啊操 | 无码人妻精品一区二区蜜桃视频 | 久热在线视频 | 免费吃奶摸下激烈视频 | 免费网站黄色 | 毛片免 | 日韩一及片 | 亚洲国产精品久久人人爱 | 日本一道在线 | 婷婷综合另类小说色区 | 国产精品.xx视频.xxtv | 99午夜视频| 中国在线观看视频高清免费 | 久久久久精彩视频 | 日韩色道 | 凹凸福利视频 | 国产无精乱码一区二区三区 | 足疗店女技师按摩毛片 | 亚洲精品视频在线观看免费 | 中文字幕播放 | 国产熟妇搡bbbb搡bbbb搡 | 亚洲一区影视 | 日韩欧美国产成人精品免费 | 一区二区三区不卡在线 | 丝袜制服中文字幕 | 日韩久久成人 | 在线观看入口 | 这里只有精品6 | 亚洲视频一区在线播放 | 日本少妇吞精囗交 | 黄色小视频在线免费观看 | av十大美巨乳|