Advertisement
Guest User

Untitled

a guest
Apr 26th, 2015
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define FRE(i,a,b) for(i = a; i <= b; i++)
  5. #define FRL(i,a,b) for(i = a; i < b; i++)
  6. #define mem(t, v) memset ((t) , v, sizeof(t))
  7. #define sqr(x) (x)*(x)
  8. #define all(x) x.begin(),x.end()
  9. #define un(x) x.erase(unique(all(x)), x.end())
  10. #define sf(n) scanf("%d", &n)
  11. #define sff(a,b) scanf("%d %d", &a, &b)
  12. #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
  13. #define D(x) cout<<#x " = "<<(x)<<endl
  14. #define pf printf
  15. #define VI vector <int>
  16. #define pii pair <int, int>
  17. #define pll pair <LL, LL>
  18. #define pb push_back
  19. #define mp make_pair
  20. #define pi acos(-1.00)
  21. #define DBG pf("Hi\n")
  22. #define sz size()
  23. #define ins insert
  24. #define fi first
  25. #define se second
  26. #define xx first
  27. #define yy second
  28. #define inf (1<<29)
  29. #define MOD 1000000007
  30. #define eps 1e-9
  31. #define MAX 30000
  32.  
  33. typedef long long int LL;
  34. typedef double db;
  35.  
  36. //int dx[] = {+0,+1,+0,-1};
  37. //int dy[] = {+1,+0,-1,+0};
  38. //int dx[] = {-1,-1,-1,+0,+0,+1,+1,+1};
  39. //int dy[] = {-1,+0,+1,-1,+1,-1,+0,+1};
  40. //bool check(int n, int pos) {return (bool) (n & (1<<pos));}
  41. //int on(int n, int pos) {return n | (1<<pos); }
  42. //int off(int n, int pos) {return n & ~(1<<pos); }
  43. int n, m, tree[MAX*4 + 10], A[MAX+10];
  44. void update(int node, int st, int ed, int pos)
  45. {
  46. if(st > pos || ed < pos)
  47. return;
  48. if(st == ed)
  49. {
  50. tree[node] = A[pos];
  51. return;
  52. }
  53. int mid, left, right;
  54. mid = (st + ed)/2;
  55. left = node * 2;
  56. right = left + 1;
  57. update(left, st, mid, pos);
  58. update(right, mid+1, ed, pos);
  59. tree[node] = min(tree[left],tree[right]);
  60. }
  61.  
  62. int Q(int node, int st, int ed, int qst, int qed)
  63. {
  64. if(st > qed || ed < qst)
  65. return inf;
  66. if(st == ed)
  67. return tree[node];
  68.  
  69. int mid, right, left;
  70. mid = (st +ed) /2 ;
  71. left = node*2;
  72. right = node*2 + 1;
  73. int ret = Q(left, st, mid, qst, qed);
  74. ret = min(ret,Q(right, mid+1, ed, qst, qed));
  75. return ret;
  76. }
  77.  
  78. int main()
  79. {
  80. int i, j, k, t, cs;
  81. int nw, hi, lo, mid;
  82. sf(t);
  83. FRE(cs , 1, t)
  84. {
  85. sf(n);
  86. FRE(i, 1, n)
  87. sf(A[i]);
  88. FRE(i,1,n)
  89. update(1, 1, n, i);
  90. int ans = -12;
  91. FRE(i,1,n)
  92. {
  93. hi = n;
  94. lo = i;
  95. while(lo<hi)
  96. {
  97. mid = lo + ceil((hi-lo)/2.0) + eps;
  98. if(Q(1,1,n,i+1,mid)<A[i])
  99. hi = mid-1;
  100. else
  101. lo = mid;
  102. }
  103. j = lo;
  104. hi = 1;
  105. lo = i;
  106. while(hi<lo)
  107. {
  108. mid = lo + (hi-lo)/2.0;
  109. if(Q(1,1,n,mid,lo)<A[i])
  110. hi = mid + 1;
  111. else
  112. lo = mid;
  113. }
  114. k = lo;
  115. nw = (j-k+1)*A[i];
  116. ans = max(ans, nw);
  117. }
  118. pf("Case %d: %d\n",cs, ans);
  119. }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement