記憶體限制:256 mib 時間限制:1000 ms 標準輸入輸出
題目型別:傳統 評測方式:special judge
上傳者: 匿名
題目描述
給出若干條線段,用 (x1,y2),(x2,y2) 表示其兩端點座標,現在要求支援兩種操作:
輸入格式
第一行兩個正整數 n 、m 為初始的線段個數和操作個數。
接下來 n 行,每行四個整數,表示一條線段。
接下來 m 行,每行為乙個操作0 x1 y1 x2 y2
或1 x0
。
輸出格式
對於每乙個詢問操作,輸出一行,為乙個實數,當你的答案與標準答案誤差不超過10^-2時,則視為正確。
樣例樣例輸入
3 4
0 -1 4 1
4 2 7 2
7 1 8 2
1 41 3
0 3 3 6 3
1 3
樣例輸出
2
0.53
資料範圍與提示
對於 10% 的資料,n,m≤1000;
對於另外 20%的資料,所有的 1 操作都在 0 操作之後;
對於另外 20% 的資料,所有線段的兩端的 x 座標都包含所有詢問的 x 座標,你可以將每條線段當做直線處理;
對於 100% 的資料,1≤n≤50000,1≤m≤150000 ,x1,x2,y1,y2均為整數,0
題意:在平面直角座標系中給你$n$條線段,$m$次詢問,每次詢問$x$處一條$y$值最大的線段。
題解:容易發現我們需要用乙個資料結構維護每個$x$處$y$最大的線段,支援查詢,修改操作。
考慮線段樹維護覆蓋$[l,r]$區間的$y$最大線段是否可行。
但如果兩條線段同時覆蓋$[l,r]$且交點在$[l,r]$內則無法確定取哪條。
換句話說,一條線段如果沒有被完爆就都是有貢獻的。
但如果我們考慮維護覆蓋$[l,r]$區間且在$mid$處$y$最大的線段呢?
(子區間不維護與父區間相同的線段)
這是一棵不下傳父節點標記的標記永久化線段樹,專業名詞叫做李超樹。
現在維護應該十分好想了。
**自網路dalao,侵刪)
每當在區間$[l,r]$更新一條線段時,
若該線段在$mid$處小於該區間原有線段
線段維護雙點或點截距均可。
**:
#include#include#include
#include
using
namespace
std;
#define maxn 100005
#define maxm 500005
#define inf 0x7fffffff
#define ll long long
struct
node
}tree[maxn
<<2
];inline
intread()
double gety(int x0,int x1,int x2,double y1,double
y2)void build(int l,int r,int
k)void insert(int x1,int x2,double y1,double y2,int
k)
if(gety(mid,tree[k].x1,tree[k].x2,tree[k].y1,tree[k].y2)>gety(mid,x1,x2,y1,y2))
return
; }
if(x1<=mid) insert(x1,x2,y1,y2,k<<1
);
if(x2>mid) insert(x1,x2,y1,y2,k<<1|1
);
return;}
double query(int x0,int
k)int
main()
for(int i=1;i<=m;i++)
else
}return0;
}/*3 40 -1 4 1
4 2 7 2
7 1 8 2
1 41 3
0 3 3 6 3
1 3*/
雅禮集訓 2017 Day2 解題報告
我怎麼知道這種題目都能構造樹形結構。根據高度構造一棵樹,在樹上倍增找到最大的小於約束條件高度的隔板,開乙個 vector 記錄一下,然後對於每個 vector 按照高度排序一下,樹形 dp 即可 code below include define pii pair define mp make pa...
雅禮集訓 2017 價
傳送門 乙個不太顯然的最小割做法。我們這麼連邊 源點向藥物連 infty p i 容量的邊,藥物向它對應的藥材連 infty 容量的邊,藥材向匯點連 infty 容量的邊。用源點的流量減去最小割,再負回來就可以求出答案了。怎麼理解呢?割掉一條邊表示不選其對應的藥物或藥材,我們發現最後的方案一定是完美...
雅禮集訓 2017 Day5 珠寶
題目描述 miranda 準備去市裡最有名的珠寶展覽會,展覽會有可以購買珠寶,但可惜的是只能現金支付,miranda 十分糾結究竟要帶多少的現金,假如現金帶多了,就會比較危險,假如帶少了,看到想買的右買不到。展覽中總共有 n種珠寶,每種珠寶都只有乙個,對於第 i種珠寶,它的售價為 ci 萬元,對 m...