http://acm.hdu.edu.cn/showproblem.php?pid=1823 二維線段樹

來源:互聯網
上載者:User

/*<br />二維的線段樹跟一維的似乎一樣的<br />身高建為x軸 活潑度為y軸<br />*/<br />#include <iostream><br />#include <cstdio><br />#include <cstring><br />#include <algorithm><br />#define LL(x) ((x) << 1)<br />#define RR(x) ((x) << 1 | 1)<br />using namespace std;<br />const int N = 100;<br />struct Sub_tree {<br />int l, r;<br />double love;<br />int mid() {<br />return (l + r) >> 1;<br />}<br />};</p><p>struct Main_tree {<br />int lh, rh;<br />int mid() {<br />return (lh + rh) >> 1;<br />}<br />Sub_tree active[30 * N];<br />} high[3 * N];<br />inline bool readint(int &ret) {<br />int sgn;<br />char c;<br />c = getchar();<br />if (c == EOF)<br />return true;<br />while (c != '-' && c < '0' || c > '9')<br />c = getchar();<br />sgn = (c == '-') ? -1 : 1;<br />ret = (c == '-') ? 0 : (c - '0');<br />while ((c = getchar()) >= '0' && c <= '9')<br />ret = ret * 10 + (c - '0');<br />ret *= sgn;<br />return false;<br />}<br />inline bool readdouble(double &ret) {<br />int sgn;<br />double bit = 0.1;<br />char c;<br />c = getchar();<br />if (c == EOF)<br />return true;<br />while (c != '-' && c != '.' && (c < '0' || c > '9'))<br />c = getchar();<br />sgn = (c == '-') ? -1 : 1;<br />ret = (c == '-') ? 0 : (c - '0');<br />while ((c = getchar()) >= '0' && c <= '9')<br />ret = ret * 10 + (c - '0');<br />if (c == ' ' || c == '/n') {<br />ret *= sgn;<br />return true;<br />}<br />while ((c = getchar()) >= '0' && c <= '9')<br />ret += (c - '0') * bit, bit /= 10;<br />ret *= sgn;<br />return false;<br />}<br />inline void Sub_Build(int fa, int node, int l, int r) {<br />high[fa].active[node].l = l;<br />high[fa].active[node].r = r;<br />high[fa].active[node].love = -1;<br />if (l == r)<br />return;<br />int mid = (l + r) >> 1;<br />Sub_Build(fa, LL(node), l, mid);<br />Sub_Build(fa, RR(node), mid + 1, r);<br />}<br />inline void Build(int node, int lh, int rh, int l, int r) {<br />high[node].lh = lh;<br />high[node].rh = rh;<br />Sub_Build(node, 1, l, r);<br />if (lh == rh) {<br />return;<br />}<br />int mid = (lh + rh) >> 1;<br />Build(LL(node), lh, mid, l, r);<br />Build(RR(node), mid + 1, rh, l, r);<br />}<br />inline void Sub_Update(int fa, int node, int act, double love) {<br />high[fa].active[node].love = max(love, high[fa].active[node].love);<br />if (high[fa].active[node].l == high[fa].active[node].r) {<br />return;<br />}<br />int mid = high[fa].active[node].mid();<br />//int mid = (high[fa].active[node].l + high[fa].active[node].r) >> 1;<br />if (act <= mid)<br />Sub_Update(fa, LL(node), act, love);<br />else<br />Sub_Update(fa, RR(node), act, love);<br />high[fa].active[node].love = max(high[fa].active[LL(node)].love,<br />high[fa].active[RR(node)].love);<br />}<br />inline void Update(int node, int hig, int act, double love) {<br />Sub_Update(node, 1, act, love);<br />if (high[node].lh == high[node].rh) {<br />return;<br />}<br />if (hig <= high[LL(node)].rh)<br />Update(LL(node), hig, act, love);<br />else<br />Update(RR(node), hig, act, love);<br />}<br />inline double Sub_Query(int fa, int node, int l, int r) {<br />//puts("2");<br />if (high[fa].active[node].l == l && high[fa].active[node].r == r) {<br />return high[fa].active[node].love;<br />}<br />int mid = high[fa].active[node].mid();<br />//int mid = (high[fa].active[node].l + high[fa].active[node].r) >> 1;<br />//printf("Sub_Query mid :: %d/n", mid);<br />if (r <= mid) {<br />return Sub_Query(fa, LL(node), l, r);<br />} else if (l > mid) {<br />return Sub_Query(fa, RR(node), l, r);<br />} else {<br />return max(Sub_Query(fa, LL(node), l, mid), Sub_Query(fa, RR(node), mid<br />+ 1, r));<br />}<br />}<br />inline double Query(int node, int lh, int rh, int l, int r) {<br />//puts("1");<br />if (high[node].lh == lh && high[node].rh == rh) {<br />//puts("3");<br />return Sub_Query(node, 1, l, r);<br />}<br />int mid = high[node].mid();<br />//int mid = (high[node].lh + high[node].rh) >> 1;<br />//printf("mid :: %d/n", mid);<br />if (rh <= mid) {<br />return Query(LL(node), lh, rh, l, r);<br />} else if (lh > mid) {<br />return Query(RR(node), lh, rh, l, r);<br />} else {<br />return max(Query(LL(node), lh, mid, l, r), Query(RR(node), mid + 1, rh,<br />l, r));<br />}<br />}<br />inline void Swep(int &a, int &b) {<br />if (a > b) {<br />int temp = a;<br />a = b;<br />b = temp;<br />}<br />}<br />int main() {<br />int n;<br />while (scanf("%d", &n) != EOF && n) {<br />char str[2];<br />int hig;<br />double active, love;<br />int lh, rh;<br />double lactive, ractive;<br />Build(1, 100, 200, 0, 1000);<br />//puts("Build");<br />while (n--) {<br />scanf("%s", str);<br />if (str[0] == 'I') {<br />//scanf("%d %lf %lf", &hig, &active, &love);<br />readint(hig);<br />readdouble(active);<br />readdouble(love);<br />int tt = (int) (10 * active);<br />Update(1, hig, tt, love);<br />//puts("Update");<br />} else {<br />//scanf("%d %d %lf %lf", &lh, &rh, &lactive, &ractive);<br />readint(lh);<br />readint(rh);<br />readdouble(lactive);<br />readdouble(ractive);<br />//Swep(lh, rh);<br />if (lh > rh) {<br />int temp = lh;<br />lh = rh;<br />rh = temp;<br />}<br />if (lactive > ractive) {<br />double temp = lactive;<br />lactive = ractive;<br />ractive = temp;<br />}<br />//printf("%d %d %lf %lf/n", lh, rh, lactive, ractive);<br />double ans = Query(1, lh, rh, (int) (10 * lactive), (int) (10<br />* ractive));<br />//puts("Query");<br />if (ans == -1) {<br />puts("-1");<br />continue;<br />}<br />printf("%0.1lf/n", ans);<br />}<br />}<br />}<br />}<br /> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.