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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

usaco Picture(离散化求线段周长)

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 usaco Picture(离散化求线段周长) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

usac前面有一題是遞歸求矩形覆蓋面積的,學到不少東西

離散化 把所有矩形離散化(就是將整個平面分成許多“豎條”或“橫條”,對其操作),每個矩形都由四條邊組成,分為縱邊和橫邊。對縱邊和橫邊分別掃描一次,以橫邊為例:

  • 每個矩形的兩條橫邊中,稱下面的為始邊,上面的為終邊。
  • 把每條橫邊以縱坐標從小到大排序,如果縱坐標相同,則應把始邊排到終邊之前。
  • 依次枚舉每條橫邊
    • 如果當前邊為始邊,則把這條邊的橫向的所有點j的層數增加1,即為level[j]++。如果層數由0變為了1,則這一點一定是邊緣點,總周長ans++。
    • 如果當前邊為終邊,則把這條邊的橫向的所有點j的層數減少1,即為level[j]--。如果層數由1變為了0,則這一點一定是邊緣點,總周長ans++。

同理按此方法掃描縱邊,即可得到最后結果。


/*
ID:jinbo wu
TASK:picture
LANG:C++
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{int s,e,y;bool ok;
}a[2][20500];
const int m=10000;
int ans=0;
int level[20500];
int n;
bool cmp(node a,node b)
{return a.y<b.y||(a.y==b.y&&a.ok);
}
void solve(int k)
{memset(level,0,sizeof(level));sort(a[k]+1,a[k]+n+1,cmp);for(int i=1;i<=n;i++){if(a[k][i].ok){for(int j=a[k][i].s;j<a[k][i].e;j++){level[j]++;if(level[j]==1)ans++;}}else{for(int j=a[k][i].s;j<a[k][i].e;j++){level[j]--;if(level[j]==0)ans++;}}}
}
int main()
{freopen("picture.in","r",stdin);freopen("picture.out","w",stdout);int x1,x2,y1,y2;cin>>n;for(int i=1;i<=n;i++){cin>>x1>>y1>>x2>>y2;x1+=m,x2+=m,y1+=m,y2+=m;a[0][i*2-1].s=x1,a[0][i*2-1].e=x2,a[0][i*2-1].y=y1,a[0][i*2-1].ok=true;a[0][i*2].s=x1,a[0][i*2].e=x2,a[0][i*2].y=y2,a[0][i*2].ok=false;a[1][i*2-1].s=y1,a[1][i*2-1].e=y2,a[1][i*2-1].y=x1,a[1][i*2-1].ok=true;a[1][i*2].s=y1,a[1][i*2].e=y2,a[1][i*2].y=x2,a[1][i*2].ok=false;}n=n*2;solve(0);solve(1);cout<<ans<<endl;
}


總結

以上是生活随笔為你收集整理的usaco Picture(离散化求线段周长)的全部內容,希望文章能夠幫你解決所遇到的問題。

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