Advertisement
shamiul93

SPOJ - GSS1 - Can you answer these queries I

Apr 21st, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.08 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - GSS1 - Can you answer these queries I (SPOJ)
  4.  
  5. Concept -
  6.     # Segment Tree
  7.  
  8.     # So called - "Beginner Level" problem. -_-
  9.  
  10.     # I am a beginner level programmer. Every problem can be tough to me. This problem was tough.
  11.     # Took me 3-4 days to understand the logic behind the solve.
  12.     # From CF blog , tutorials.
  13.  
  14. Bangla -
  15.  
  16.      a.sum + b.prefix যদি ম্যাক্স হয় , তাহলে এই নোডের প্রিফিক্সে জমা থাকবে ,
  17.             পরের নোডে গিয়ে সেটা রেজাল্টে কাউন্ট হবে - এভাবে চিন্তা করসিলাম ।
  18.             আসলে এরকম প্রব্লেম এটাই ফার্স্ট । সি এফ এর ব্লগ পড়ে ৩-৪ দিন বুঝি নাই । পরে বুঝে করসি ।
  19.  
  20.             ১। প্রিফিক্সে থাকবে একটা নোডের আন্ডারে থাকা প্রথম ইন্ডেক্স থেকে শুরু হওয়া
  21.             রেঞ্জের সরবোচ্চ consecutive sum. সেটা হতে পারে total sum এর সমান অথবা ছোট ।
  22.  
  23.             ২। সাফিক্সে ...... শেষ ইন্ডেক্স দিয়ে শেষ হওয়া রেঞ্জের ...... (১ এর মতোই ) ,
  24.  
  25.             ৩। sum মানে চাইল্ডের টোটাল সাম ।
  26.  
  27.             ৪। result এর মধ্যে বেস্ট টা রাখবো । যেহেতু consecutive sum , তাই ৩ টা হতে পারে ,
  28.  
  29.             প্রথমত , কোন ইন্টারভালের প্রথম ইন্ডেক্স থেকে শুরু হতে পারে ,
  30.             দ্বিতীয়ত , কোণ ইন্টারভালের শেষ ইন্ডেক্স থেকে শুরু হতে পারে ।
  31.             তৃতীয়ত , মাঝের কোথাও অর্থাৎ , দুই নোডের মাঝে বিস্তৃত থাকতে পারে ।
  32.             এজন্য লেফট চাইল্ডের শেষ ইন্ডেক্স এর জন্য সরবোচ্চ যোগফল (suffix) আর
  33.             রাইট চাইল্ডের প্রথম ইন্ডেক্স এর জন্য সরবোচ্চ যোগফল (prefix) -
  34.             এ দুইটা যেহেতু একে অপরের সাথে কানেক্টেড , এজন্য এদের যোগ করে দিসি ।
  35.  
  36.     প্রশ্নঃ একে অপরের সাথে কানেক্টেড মানে ? উঃ লেফট নোডের শেষটা আর রাইট নোডের ফার্স্টের টা পরপর ২ টা সংখ্যা না ? হ্যাঁ । এটাই বুঝাইসি ।
  37.  
  38.     প্রশ্নঃ t.prefix = max( a.prefix, (a.sum + b.prefix) ) ; - এই লাইনের মানে কি ???
  39.     উঃ যেহেতু consecutive sum , সেহেতু  , হতে পারে a এর প্রিফিক্স ই এন্সার , হতে পারে , a এর সাম এর সাথে b এর প্রিফিক্স যোগ হয়ে সেটাই ম্যাক্স  ।
  40.     সাম যোগ করবো কারণ নাইলে consecutive হবে না ।
  41.  
  42.     ***** ওহ ভালো কথা । sum কিন্তু আসলে consecutive sum.
  43.  
  44.     ***** মোটামুটি এটুক বুঝলেই এনাফ । আর যদি না বুঝো , লাইগা থাকো । বুঝবা । আমার ৩ - ৪ দিন লাগসে । ছুইড়া ফেলতে ইচ্ছা করসে ।
  45.     না । কঠিন এজন্য না । সহজ কিন্তু আমি পারতেসি না এজন্য ।
  46.  
  47.     *** কন্সেপ্ট যদি আরো ক্লিয়ার করতে পারি , আপডেট করে দিবো সমস্যা নাই । :3
  48.  
  49.     -   22 এপ্রিল , ২০১৭।
  50. */
  51.  
  52.  
  53. #include <iostream>
  54. #include<algorithm>
  55. #include <cstdio>
  56. #define ll                                      long long
  57. #define fi                                      freopen("in.txt", "r", stdin)
  58. #define fo                                      freopen("out.txt", "w", stdout)
  59. #define m0(a) memset(a , 0 , sizeof(a))
  60. #define m1(a) memset(a , -1 , sizeof(a))
  61.  
  62. #define mx 50003
  63. using namespace std;
  64.  
  65. int i, j  ;
  66.  
  67. class node
  68. {
  69. public:
  70.     int prefix ;
  71.     int suffix ;
  72.     int sum ;
  73.     int result ;
  74.  
  75.     node(int tem)
  76.     {
  77.         prefix = suffix = sum = result = tem ;
  78.     }
  79.  
  80.     node()
  81.     {
  82.         prefix = suffix = sum = result = -1000000 ;
  83.     }
  84. };
  85.  
  86.  
  87. node combineChild(node a, node b)
  88. {
  89.     node t ;
  90.  
  91.     t.sum = a.sum + b.sum ;
  92.     t.prefix = max( a.prefix, (a.sum + b.prefix) ) ;
  93.     t.suffix = max( b.suffix, (b.sum + a.suffix) ) ;
  94.     t.result = max( a.suffix + b.prefix, max(a.result, b.result)) ;
  95.  
  96.     /**************/
  97.     t.result = max(t.result, t.prefix);
  98.     t.result = max(t.result, t.suffix);
  99.     t.result = max(t.result, t.sum);
  100.     /**************/
  101.     /// এই তিন টা লাইন অ্যাড করলেও হয় না করলেও হয় । বাট সেফ সাইডে থাকা আর কি । :3 জানি না কাজে লাগে কি না । তাহসীন ভাই এর কাছ থেকে ।
  102.     return t ;
  103. }
  104.  
  105.  
  106. int A[mx] ;
  107. node seg[mx*4] ;
  108.  
  109.  
  110. node buildTree(int lo, int hi, int sp)
  111. {
  112.     if(lo == hi)
  113.     {
  114.         node n ;
  115.         n = node(A[lo]) ;
  116.         seg[sp] = n ;
  117.         return seg[sp] ;
  118.     }
  119.  
  120.     int mid ;
  121.     mid = (lo+hi) / 2 ;
  122.  
  123.     node left = buildTree(lo, mid, 2*sp+1) ;
  124.     node right = buildTree(mid + 1, hi, 2*sp + 2) ;
  125.  
  126.     seg[sp] = combineChild(left, right) ;
  127.  
  128.     return seg[sp] ;
  129. }
  130.  
  131.  
  132. node query(int lo, int hi, int sp)
  133. {
  134.     if(hi < i || lo > j)
  135.     {
  136.         node n;
  137.         return n ;
  138.     }
  139.     if(lo >= i && hi <= j)
  140.     {
  141.         return seg[sp] ;
  142.     }
  143.  
  144.     int mid ;
  145.     mid = ( lo + hi ) / 2 ;
  146.  
  147.     node l, r ;
  148.  
  149.     l = query(lo, mid, 2*sp+1) ;
  150.     r = query(mid + 1, hi, 2*sp + 2 ) ;
  151.  
  152.     return combineChild(l, r) ;
  153. }
  154.  
  155. int main()
  156. {
  157.     for(int ii = 0 ; ii < mx ; ii++)
  158.     {
  159.         A[ii] = -1000000 ;
  160.     }
  161.  
  162.     int N ;
  163.     scanf("%d",&N) ;
  164.     for(int ii = 0 ; ii < N ; ii++)
  165.     {
  166.         scanf("%d",&A[ii]) ;
  167.     }
  168.  
  169.     buildTree(0, N-1, 0) ;
  170.  
  171.     int M ;
  172.     scanf("%d",&M) ;
  173.  
  174.     while(M--)
  175.     {
  176.         scanf("%d %d", &i, &j) ;
  177.         i-- ;
  178.         j-- ;
  179.         int ans ;
  180.  
  181.         ans = query(0, N-1, 0).result ;
  182.         printf("%d\n",ans);
  183.     }
  184.     return 0 ;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement