Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- */
- //#pragma comment(linker, "/STACK:16777216")
- #define _CRT_SECURE_NO_WARNINGS
- #include <fstream>
- #include <iostream>
- #include <string>
- #include <complex>
- #include <math.h>
- #include <set>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stdio.h>
- #include <stack>
- #include <algorithm>
- #include <list>
- #include <ctime>
- #include <memory.h>
- #include <assert.h>
- #define y0 sdkfaslhagaklsldk
- #define y1 aasdfasdfasdf
- #define yn askfhwqriuperikldjk
- #define j1 assdgsdgasghsf
- #define tm sdfjahlfasfh
- #define lr asgasgash
- #define eps 1e-9
- #define M_PI 3.141592653589793
- #define bs 1000000007
- #define bsize 512
- const int N = 1000500;
- const double INF = 1e18;
- using namespace std;
- int n;
- int ar[N];
- int brute()
- {
- int ans = 0;
- for (int i = 0; i < n; i++)
- {
- for (int j = i; j < n; j++)
- {
- for (int q = j + 1; q < n; q++)
- {
- for (int w = q; w < n; w++)
- {
- int mn = 1e9;
- for (int a = i; a <= j; a++)
- {
- mn = min(mn, ar[a]);
- }
- for (int a = q; a <= w; a++)
- {
- mn = min(mn, ar[a]);
- }
- ans += mn;
- ans %= bs;
- }
- }
- }
- }
- return ans;
- }
- vector<pair<int, pair<int, int> > > events;
- int block[N];
- set<int> ban;
- long long ttl;
- int get_prev(int x)
- {
- set<int>::iterator it;
- it = ban.lower_bound(x);
- --it;
- return *it;
- }
- int get_next(int x)
- {
- set<int>::iterator it;
- it = ban.lower_bound(x);
- return *it;
- }
- long long TTL;
- long long C(long long x)
- {
- return x*(x + 1) / 2 % bs;
- }
- void remove_segment(int l, int r)
- {
- TTL -= C(r - l - 1);
- }
- void add_segment(int l, int r)
- {
- TTL += C(r - l - 1);
- }
- int smart()
- {
- long long ans = 0;
- events.clear();
- for (int i = 0; i < n; i++)
- {
- events.push_back(make_pair(ar[i], make_pair(1, i)));
- }
- sort(events.begin(), events.end());
- ban.clear();
- ban.insert(-1);
- ban.insert(n);
- TTL = C(n);
- TTL %= bs;
- for (int i = 0; i < events.size(); i++)
- {
- int ps = events[i].second.second;
- int l, r;
- l = get_prev(ps);
- r = get_next(ps);
- int span = r - l - 1;
- long long val1 = TTL - C(span) + bs;
- val1 %= bs;
- ans += 1ll * val1*(ps - l) % bs*(r - ps) % bs*ar[ps]%bs;
- ans %= bs;
- //cout << ps << " " << l << " " << r << " "<<ar[ps]<<" "<<ans<<endl;
- for (int Q = l + 1; Q <= ps; Q++)
- {
- ans += C(Q - l - 1)*(r - ps)%bs*ar[ps]%bs;
- ans %= bs;
- }
- for (int Q = ps; Q < r; Q++)
- {
- ans += C(r - Q - 1)*(ps - l)%bs*ar[ps]%bs;
- ans %= bs;
- }
- remove_segment(l, r);
- add_segment(l, ps);
- add_segment(ps, r);
- ban.insert(ps);
- }
- return ans;
- }
- int main(){
- //freopen("route.in","r",stdin);
- //freopen("route.out","w",stdout);
- //freopen("F:/in.txt", "r", stdin);
- //freopen("F:/output.txt", "w", stdout);
- ios_base::sync_with_stdio(0);
- //cin.tie(0);
- // srand(10);
- cin >> n;
- for (int i = 0; i < n; i++)
- {
- //cin >> ar[i];
- ar[i]=i;
- }
- // cout << brute() << endl;
- cout << smart() << endl;
- cin.get(); cin.get();
- return 0;
- }
Add Comment
Please, Sign In to add comment