HDU 4553 line segment tree dual-Keyword interval merge

Source: Internet
Author: User

HDU 4553 line segment tree dual-Keyword interval merge

Use two keywords to record the dash time and Goddess time.

Update the time if the silk is about

Update the Time of the diaosi and goddess if the goddess appointment

Learning, then both are cleared


# Include "stdio. h "# include" string. h "struct Data {int l, r, x1, x2, l1, l2, r1, r2;} data [400010]; int Max (int a, int B) {if (
 
  
= X) return data [k]. l; if (data [k * 2]. x1> = x) return query (x, k * 2, op); if (data [k * 2]. r1 + data [k * 2 + 1]. l1> = x) return data [k * 2]. r-data [k * 2]. r1 + 1; return query (x, k * 2 + 1, op);} if (op = 2) {if (data [k]. x2
  
   
= X) return data [k]. l; if (data [k * 2]. x2> = x) return query (x, k * 2, op); if (data [k * 2]. r2 + data [k * 2 + 1]. l2> = x) return data [k * 2]. r-data [k * 2]. r2 + 1; return query (x, k * 2 + 1, op) ;}} void Pushdown (int k) {int ll, rr, sum; if (data [k]. l = data [k]. r) return; ll = data [k * 2]. r-data [k * 2]. l + 1; rr = data [k * 2 + 1]. r-data [k * 2 + 1]. l + 1; sum = data [k]. r-data [k]. l + 1; if (data [k]. x1 = 0) {data [k * 2]. x1 = data [k * 2]. l1 = data [k * 2]. r1 = 0; data [k * 2 + 1]. x1 = data [k * 2 + 1]. l1 = data [k * 2 + 1]. r1 = 0;} if (data [k]. x1 = sum) {data [k * 2]. x1 = data [k * 2]. l1 = data [k * 2]. r1 = ll; data [k * 2 + 1]. x1 = data [k * 2 + 1]. l1 = data [k * 2 + 1]. r1 = rr;} if (data [k]. x2 = 0) {data [k * 2]. x2 = data [k * 2]. l2 = data [k * 2]. r2 = 0; data [k * 2 + 1]. x2 = data [k * 2 + 1]. l2 = data [k * 2 + 1]. r2 = 0;} if (data [k]. x2 = sum) {data [k * 2]. x2 = data [k * 2]. l2 = data [k * 2]. r2 = ll; data [k * 2 + 1]. x2 = data [k * 2 + 1]. l2 = data [k * 2 + 1]. r2 = rr;} void Pushup (Int k) {int ll, rr; ll = data [k * 2]. r-data [k * 2]. l + 1; rr = data [k * 2 + 1]. r-data [k * 2 + 1]. l + 1; data [k]. l1 = data [k * 2]. l1; if (data [k]. l1 = ll) data [k]. l1 + = data [k * 2 + 1]. l1; data [k]. r1 = data [k * 2 + 1]. r1; if (data [k]. r1 = rr) data [k]. r1 + = data [k * 2]. r1; data [k]. x1 = Max (data [k * 2]. x1, data [k * 2 + 1]. x1), data [k * 2]. r1 + data [k * 2 + 1]. l1); data [k]. x1 = Max (data [k]. l1, data [k]. r1), data [k]. x1); data [k]. l2 = data [k * 2]. l2; if (data [k]. l 2 = ll) data [k]. l2 + = data [k * 2 + 1]. l2; data [k]. r2 = data [k * 2 + 1]. r2; if (data [k]. r2 = rr) data [k]. r2 + = data [k * 2]. r2; data [k]. x2 = Max (data [k * 2]. x2, data [k * 2 + 1]. x2), data [k * 2]. r2 + data [k * 2 + 1]. l2); data [k]. x2 = Max (data [k]. l2, data [k]. r2), data [k]. x2);} void updata (int l, int r, int k, int op) {int mid, sum; if (data [k]. l = l & data [k]. r = r) {sum = data [k]. r-data [k]. l + 1; if (op = 0) {data [k]. x1 = data [k]. l1 = data [k]. r 1 = sum; data [k]. x2 = data [k]. l2 = data [k]. r2 = sum; return;} if (op = 1) {data [k]. x1 = data [k]. l1 = data [k]. r1 = 0; return;} if (op = 2) {data [k]. x1 = data [k]. l1 = data [k]. r1 = 0; data [k]. x2 = data [k]. l2 = data [k]. r2 = 0; return ;}} Pushdown (k); mid = (data [k]. l + data [k]. r)/2; if (r <= mid) updata (l, r, k * 2, op); else if (l> mid) updata (l, r, k * 2 + 1, op); else {updata (l, mid, k * 2, op); updata (mid + 1, r, k * 2 + 1, op);} Pushup (k);} int ma In () {int T, Case, x, y, start, n, m; char ch [10]; scanf ("% d", & T); Case = 0; while (T --) {Case ++; printf ("Case % d: \ n", Case); scanf ("% d", & n, & m ); build (1, n, 1); while (m --) {scanf ("% s", ch); if (ch [0] = 'D ') {scanf ("% d", & x); start = query (x,); // you can call this operation to check whether the x-ray time is consecutive. if (start = 0) printf ("fly with yourself \ n"); else {updata (start, start + X-1,); // x consecutive from start, printf ("% d, let's fly \ n", start) ;}} else I F (ch [0] = 'n') {scanf ("% d", & x); start = query (x, 1, 1); if (start! = 0) {updata (start, start + X-1, 1, 2); printf ("% d, don't put my gezi \ n", start); continue ;} start = query (x, 1, 2); // ask if there is x consecutive goddess time if (start! = 0) {updata (start, start + X-1, 1, 2); // x consecutive starting from start, update diaosi and Goddess time printf ("% d, don't put my gezi \ n ", start); continue;} printf (" wait for me \ n ");} else {scanf (" % d ", & x, & y); updata (x, y, 1, 0); // update the learning time printf ("I am the hope of chinese chengxuyuan !! \ N ") ;}} return 0 ;}
  
 


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

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.