Guest User

Untitled

a guest
Feb 22nd, 2016
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. /*
  2. */
  3.  
  4. //#pragma comment(linker, "/STACK:16777216")
  5. #define _CRT_SECURE_NO_WARNINGS
  6.  
  7. #include <fstream>
  8. #include <iostream>
  9. #include <string>
  10. #include <complex>
  11. #include <math.h>
  12. #include <set>
  13. #include <vector>
  14. #include <map>
  15. #include <queue>
  16. #include <stdio.h>
  17. #include <stack>
  18. #include <algorithm>
  19. #include <list>
  20. #include <ctime>
  21. #include <memory.h>
  22. #include <assert.h>
  23.  
  24. #define y0 sdkfaslhagaklsldk
  25. #define y1 aasdfasdfasdf
  26. #define yn askfhwqriuperikldjk
  27. #define j1 assdgsdgasghsf
  28. #define tm sdfjahlfasfh
  29. #define lr asgasgash
  30.  
  31. #define eps 1e-9
  32. #define M_PI 3.141592653589793
  33. #define bs 1000000007
  34. #define bsize 512
  35.  
  36. const int N = 1000500;
  37.  
  38.  
  39. const double INF = 1e18;
  40.  
  41. using namespace std;
  42.  
  43. int n;
  44. int ar[N];
  45.  
  46. int brute()
  47. {
  48. int ans = 0;
  49.  
  50. for (int i = 0; i < n; i++)
  51. {
  52. for (int j = i; j < n; j++)
  53. {
  54. for (int q = j + 1; q < n; q++)
  55. {
  56. for (int w = q; w < n; w++)
  57. {
  58. int mn = 1e9;
  59. for (int a = i; a <= j; a++)
  60. {
  61. mn = min(mn, ar[a]);
  62. }
  63. for (int a = q; a <= w; a++)
  64. {
  65. mn = min(mn, ar[a]);
  66. }
  67. ans += mn;
  68. ans %= bs;
  69. }
  70. }
  71. }
  72. }
  73. return ans;
  74. }
  75.  
  76. vector<pair<int, pair<int, int> > > events;
  77. int block[N];
  78.  
  79. set<int> ban;
  80. long long ttl;
  81.  
  82. int get_prev(int x)
  83. {
  84. set<int>::iterator it;
  85. it = ban.lower_bound(x);
  86. --it;
  87. return *it;
  88. }
  89.  
  90. int get_next(int x)
  91. {
  92. set<int>::iterator it;
  93. it = ban.lower_bound(x);
  94. return *it;
  95. }
  96.  
  97. long long TTL;
  98.  
  99. long long C(long long x)
  100. {
  101. return x*(x + 1) / 2 % bs;
  102. }
  103.  
  104. void remove_segment(int l, int r)
  105. {
  106. TTL -= C(r - l - 1);
  107. }
  108.  
  109. void add_segment(int l, int r)
  110. {
  111. TTL += C(r - l - 1);
  112. }
  113.  
  114. int smart()
  115. {
  116. long long ans = 0;
  117.  
  118. events.clear();
  119.  
  120. for (int i = 0; i < n; i++)
  121. {
  122. events.push_back(make_pair(ar[i], make_pair(1, i)));
  123. }
  124.  
  125. sort(events.begin(), events.end());
  126.  
  127. ban.clear();
  128. ban.insert(-1);
  129. ban.insert(n);
  130.  
  131. TTL = C(n);
  132. TTL %= bs;
  133.  
  134. for (int i = 0; i < events.size(); i++)
  135. {
  136. int ps = events[i].second.second;
  137. int l, r;
  138. l = get_prev(ps);
  139. r = get_next(ps);
  140. int span = r - l - 1;
  141. long long val1 = TTL - C(span) + bs;
  142. val1 %= bs;
  143. ans += 1ll * val1*(ps - l) % bs*(r - ps) % bs*ar[ps]%bs;
  144. ans %= bs;
  145. //cout << ps << " " << l << " " << r << " "<<ar[ps]<<" "<<ans<<endl;
  146.  
  147. for (int Q = l + 1; Q <= ps; Q++)
  148. {
  149. ans += C(Q - l - 1)*(r - ps)%bs*ar[ps]%bs;
  150. ans %= bs;
  151. }
  152. for (int Q = ps; Q < r; Q++)
  153. {
  154. ans += C(r - Q - 1)*(ps - l)%bs*ar[ps]%bs;
  155. ans %= bs;
  156. }
  157.  
  158. remove_segment(l, r);
  159. add_segment(l, ps);
  160. add_segment(ps, r);
  161. ban.insert(ps);
  162.  
  163. }
  164.  
  165. return ans;
  166. }
  167.  
  168. int main(){
  169. //freopen("route.in","r",stdin);
  170. //freopen("route.out","w",stdout);
  171. //freopen("F:/in.txt", "r", stdin);
  172. //freopen("F:/output.txt", "w", stdout);
  173. ios_base::sync_with_stdio(0);
  174. //cin.tie(0);
  175.  
  176. // srand(10);
  177.  
  178. cin >> n;
  179. for (int i = 0; i < n; i++)
  180. {
  181. //cin >> ar[i];
  182. ar[i]=i;
  183. }
  184.  
  185. // cout << brute() << endl;
  186. cout << smart() << endl;
  187.  
  188. cin.get(); cin.get();
  189. return 0;
  190. }
Add Comment
Please, Sign In to add comment