假設我們列舉數列中長度為len的區間,那麼如何判斷兩個數列可以匹配呢?
對於提取的數列從小到大排序,從大到小排序,然後兩兩配對,如果所有的都滿足
>=
h ,那麼就可以匹配。應該算是貪心吧。
這樣做的時間複雜度是o(
n∗le
n∗loglen
) 還是上面的思想,我們如何快速判斷呢?
假設我們確定了提取出的區間數列,對於數列中的每乙個數我們找到中最靠左的可以與之配對的數的位置pos,那麼對於每個位置我們要求po
s<=
x 。設t=
x−po
s ,對於數列b我們用線段樹對於每個位置維護t,如果區間中的最小值
<
0 ,那麼當前方案不合法。
如何動態的維護?我們提取出最靠前的區間,然後按照上述方法預處理。
每次的操作就是刪去乙個數再加入乙個數。
有影響的區間就是兩個數中較小的數作為pos的最靠前的位置(因為有重複的數,或者數比較緊密,有可能有的數乙個位置都沒有控制到,所以我們直接在b陣列中二分b[
i]+x
<
h 最靠左的位置)為左端點,較大的數作為pos的最靠右的位置(b[
i]+x
>=
h 最靠右的位置)為端點的區間。
如果插入的數大,剔除的數小,區間+1
如果插入的數小,剔除的數大,區間-1
三維計算幾何。
這道題應該有兩種做法,一種是將地面旋轉到x-y平面上,相應的所有的點都進行座標變換。但是我不大會座標變換所以棄掉了。
第二種利用三維計算幾何的知識,求出所有光源與凸多面體頂點連線與平面的交點,然後在平面上做凸包,最後凸包的面積就是答案。
那麼如何求交點呢?
黑色的框表示投影平面,n是平面的法向量。紅色的點是光源,紫色的點事凸多面體的乙個頂點。兩個點所在的向量與平面的交點p即為所求。
我們知道點加向量=點,那麼如果我們能夠求出l2
那麼問題就解決了。 l1
可以計算出來,設k=
|l2|
|l1|
=|l3
||l4
| 。問題就轉化成了求向量l1
和法向量起點-光源兩條向量在法向量上投影的比值。投影的長度?其實就是向量與法向量的點積。
這樣我們就可以求出交點p。
給出三個點如何確定乙個平面,一般平面的儲存都是利用法向量,設給出的點是p1
,p2,
p3,那麼法向量就是向量p2
−p1,
p3−p
1 的叉積。注意三維的叉積上向量。
那麼三維平面中的向量如何判斷左右關係呢?左叉右與右叉左得到向量與法向量的方向是不同的,所以可以用求出向量與法向量正反向來判斷。
如何求面積?還是劃分成三角形,三角形的兩條邊向量求叉積得到向量,該向量的長度/2即為答案。向量長度?點積相乘再開平方。
#include
#include
#include
#include
#include
using namespace std
;struct data
}p1,p2,p3,p[303],sun,st[303];
data operator +(data a,data b)
data operator -(data a,data b)
data operator *(data a,double t)
data cross(data a,data b)
bool operator ==(data a,data b)
int cmp(data a,data b)
struct line
}n; int n,m,top;
double dot(data a,data b)
bool onright(data a,data b,data c)
double area(data a,data b)
int main()
sort(p+1,p+n+1,cmp);
n=unique(p+1,p+n+1)-p-1
; m=0
; //for (int i=1
;i<=n;i++) printf("%.2lf %.2lf %.2lf\n",p[i].x,p[i].y,p[i].z);
for (int i=1
;i<=n;i++)
int k=m;
for (int i=n;i>=1;i--)
if (n>1) m--;
double ans=0
; for (int i=3
;i<=m;i++) ans+=area(st[i]-st[1],st[i-1]-st[1]);
printf("%.2lf\n",ans);
}
集訓預備隊選拔day2
a序列劃分 codeforces1197c 將非遞減的序列劃分成k段,使最右減最左的和最小。和這種序列差值有關的,用差分來寫,就轉化成和的問題。b轉移矩陣 poj3070 就是個模板題 include include using namespace std const int max 10 defi...
省隊集訓Round2 DAY2
首先字首和的變化一定是連續的。那麼對於每個區間,我們找到他最大值和最小值所在的位置,如果k在最小最大值之間,那麼一定可以從最小值最大值位置所構成的區間中得到。那麼根據單調性二分就可以了。每次二分出乙個位置用杜教篩計算一下。對於最大值最小值所在的位置可以打表啊。這道題以前做過乙個靜態的,就是樹在開始的...
省隊集訓Round2 DAY3
用splay維護權值有序。每次加入乙個人,貪心的選出前i 1個人中要求最小的vi 1,判斷能否滿足,如果能滿足就把這vi 1個人的權值 1,剩下的人不需要他們的支援,那麼都賦值成0,並且把這些點移動到平衡樹中0所在的位置 如果不能滿足就直接在平衡樹中加入乙個 1.要求每乙個時間每條邊只能有乙個人經過...