注意h的範圍和n的範圍,縱向建立線段樹
題意:h*w的木板,放進一些1*l的物品,求每次放空間能容納且最上邊的位子
思路:每次找到最大值的位子,然後減去l
線段樹功能:query:區間求最大值的位子(直接把update的操作在query裡做了)
3 5 524
3331
213-1
2015-05-15
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
namespace
std;
9#define mod 1000000007
10const
int inf=0x3f3f3f3f;11
const
double eps=1e-5;12
#define cl(a) memset(a,0,sizeof(a))
13#define ts printf("*****\n");
14#define lson l,mid,rt<<1
15#define rson mid+1,r,rt<<1|1
16#define root 1,n,1
17#define mid ((l+r)>>1)
18const
int maxn=200050;19
intn,m,t;
20int
num[maxn],w,h;
21struct
node
22node[maxn<<2
];26
void build(int l,int r,int
rt)27
35int query(int val,int
rt)36
42int ret=0;43
if(node[rt<<1].sum>=val) ret=query(val,rt<<1
);44
else ret=query(val,rt<<1|1
);45 node[rt].sum=max(node[rt<<1|1].sum,node[rt<<1
].sum);
46return
ret;47}
48int
main()
4965
}66 }
1 #include2 #include3 #include4 #include5 #include6 #include7#define lson l,m,rt<<1
8#define rson m+1,r,rt<<1|1
9using
namespace
std;
10const
int maxn=222225;11
int sum[maxn<<2
];12
intn,m,t,h,w;
13void pushup(int
rt)14
17void build(int l,int r,int
rt)18
25int query(int add,int l,int r,int
rt)26
32int m=(l+r)>>1;33
intret;
34if(sum[rt<<1]>=add)
3538
else ret=query(add,rson);
39pushup(rt);
40return
ret;41}
42int
main()
4356}57
return0;
58 }
hdu 2795(線段樹的應用)
hdu 2795 1 思路 每個格仔的寬度都已經確定,所以一開始預設已知所有的格仔,建立線段樹,單點更新區間值 x位置的點,因為線段樹的結構類似二叉樹,所以可以將線段樹看做乙個類二叉樹,每次x先找左區間 先找下標小的區間 否則找右的區間,遞迴縮小區間,最終修改最接近x且最靠前的 點的值。2 注意 這...
hdu 2795 線段樹更新單個節點
題意 給你乙個高位h寬為w的木板,現在給你一些通知條高度為1,寬度為wi,現在要盡可能的將每乙個通知條往木板的最上層放,並盡量向當前層的左邊放 從最高層到最低層的按1 min h,n 開始編號 對於每輸入的乙個紙條輸出其可以擺放的最高層次,若該紙條不能被放,那麼輸出 1 分析 由於h和w均為10 9...
HDU2795(線段樹 單點更新 思維)
題目鏈結 題目大意 給乙個h高,w寬的廣告牌,以及n條廣告的寬度,每條廣告的高度預設為1,問n條廣告能插上的話所在的最高行數,插入不了輸入 1.解題思路 比較容易到用mlen維護區間h能夠裝下的最長廣告的長度 未插入 n在2e5內,所以線段樹最多就開8e5就足夠了!之後單點更新的時候順帶返回下標。c...