從天而降很多個多邊形,現在有n(1<=n<=25000)個詢問,詢問區間[l,r]之間多邊形的面積
第一行表示資料組數t
每一組資料第一行包含乙個整數n,表示操作的數量
r p 表示有乙個多邊形出現了,這個多邊形有p個點,接下來的一行有2*p個數,以逆時針方向給出多邊形的形狀
q a b 查詢區間[a,b]的面積
sample input17
q 1 100
r 410 10 11 10 13 11 12 11
q 10 11
q 1 100
r 3100 20 120 20 110 30
q 1 100
q 12 120
sample output
0.000
0.250
1.000
1.000
100.250
hint:無小資料
把原來的梯形變成了多邊形,但是,其實仔細觀察後可以發現任意乙個多邊形都可以剖成多個梯形,乙個重要的技巧就是,因為資料保證是逆時針讀入,而只要我們花乙個圖就可以輕鬆發現,當從左往右列舉頂點的時候,把兩個頂點之間與過最低點的水平線組成的乙個直角梯形作為負面積,相反從右往左便利時候的構成的直角梯形作為正面積,然後用正面積減掉負面積就可以得到多邊形的面積,好了,這就轉化成為最開始的冰雪奇緣的問題了。這也是乙個很重要的技巧吧。
#include#include#include#include#define ls u<<1,l,mid
#define rs u<<1|1,mid,r
#define maxn 25020
#includeusing namespace std;
void init()
int n,cur[maxn*10],tot,cnt;
struct nodenod[maxn * 4];
struct question
else
} ne[++tot].h1=que[i].b[1]-que[i].min,ne[tot].h2=que[i].b[que[i].n]-que[i].min;
ne[tot].x1=que[i].a[1];ne[tot].x2=que[i].a[que[i].n];
}bool cmp(int a,int b)
void push_up(int u)
double q(int x,double y,int a,double b,int mid)
void push_down(int u)
void updata(int u,int l,int r,int x,int y,double add1,double add2)
push_down(u);
int mid=l+r>>1;
if(x>=mid)updata(rs,x,y,add1,add2);
else if(y<=mid)updata(ls,x,y,add1,add2);
else
push_up(u);
}
double query(int u,int l,int r,int x,int y)
push_down(u);
int mid=l+r>>1;
if(x>=mid)return query(rs,x,y);
else if(y<=mid)return query(ls,x,y);
else return query(ls,x,mid)+query(rs,mid,y);
} int main()
else
}} front();
build(1,1,cnt);
for(int i=1;i<=tot;i++)
else
} }return 0;
}
凸多邊形的三角剖分
給定一具有 n 個頂點 從 1到 n 編號 的凸多邊形,每個頂點的權均已知。問如何把這個凸多邊形劃分成 n 2個互不相交的三角形,使得這些三角形頂點的權的乘積之和最小?第一行 頂點數 n n 50 第二行 n 個頂點 從 1到 n 的權值,權值為小於 32768 的整數。第一行為各三角形頂點的權的乘...
凸多邊形三角剖分問題
1 凸多邊形的三角剖分 將凸多邊形分割成互不相交的三角形的弦的集合t。2 最優剖分 給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。凸多邊形三角剖分如下圖所示 設 p v0,v1,vn 是n 1個頂點的多邊形 ...
凸多邊形最優三角剖分
問題描述 使用動態規劃演算法解凸多邊形最優三角剖分問題,具體來說就是,依據遞迴式,按照順序求得子問題,使得該三角剖分中諸三角形上權之和為最小。輸入形式 在螢幕上輸入凸多邊形頂點個數和頂點座標。輸出形式 最優三角剖分後的三角形頂點。樣例輸入 8 26 0 20 0 10 10 0 22 12 27 2...