This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int ll
#define FOR(i,s,e) for(ll i = s; i <= (ll)e; ++i)
#define DEC(i,s,e) for(ll i = s; i >= (ll)e; --i)
#define IAMSPEED ios_base::sync_with_stdio(false); cin.tie(0);
#ifdef LOCAL
#define db(x) cerr << #x << "=" << x << "\n"
#define db2(x, y) cerr << #x << "=" << x << " , " << #y << "=" << y << "\n"
#define db3(a,b,c) cerr<<#a<<"="<<a<<","<<#b<<"="<<b<<","<<#c<<"="<<c<<"\n"
#define dbv(v) cerr << #v << ":"; for (auto ite : v) cerr << ite << ' '; cerr <<"\n"
#define dbvp(v) cerr << #v << ":"; for (auto ite : v) cerr << "{" << ite.f << ',' << ite.s << "} "; cerr << "\n"
#define dba(a,ss,ee) cerr << #a << ":"; FOR(ite,ss,ee) cerr << a[ite] << ' '; cerr << "\n"
#define reach cerr << "LINE: " << __LINE__ << "\n";
#else
#define db(x)
#define db2(x,y)
#define db3(a,b,c)
#define dbv(v)
#define dbvp(v)
#define dba(a,ss,ee)
#define reach
#endif
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define ll long long
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define f first
#define s second
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define g3(x) get<3>(x)
typedef pair <ll, ll> pi;
typedef tuple<ll,ll,ll> ti3;
typedef tuple<ll,ll,ll,ll> ti4;
ll rand(ll a, ll b) { return a + rng() % (b-a+1); }
const int MOD = 1e9 + 7;
const int inf = (int)1e9 + 500;
const long long oo = (ll)1e18 + 500;
template <typename T> void chmax(T& a, const T b) { a=max(a,b); }
template <typename T> void chmin(T& a, const T b) { a=min(a,b); }
const int MAXN = 100005;
int ans;
int H[MAXN], W[MAXN];
int sum[MAXN];
int n;
int rsq(int x, int y) { return sum[y] - sum[x-1]; }
struct SparseTable {
vector<vector<int> > ST;
int N, K;
SparseTable(int _N, vector<int> a): N(_N) {
K = MSB(N);
ST.resize(K);
ST[0] = a;
for (int k = 1; k < K; ++k)
for (int i = 0; i+(1<<k) <= N; ++i)
ST[k].push_back( min(ST[k-1][i], ST[k-1][i+(1<<(k-1))]) ); //min
}
/* returns most significant bit of an integer */
inline int MSB(unsigned int x) { return 32-__builtin_clz(x); }
/* Min of range (x, x + 2^k-1) and (y-2^k+1, y) */
int query(int x, int y) {
--x;--y;
int k = MSB(y-x+1) - 1;
return min(ST[k][x], ST[k][y-(1<<k)+1]);
}
};
int getseq(int st, int en) {
db2(st,en);
return (st+en)*(en-st+1)/2;
}
int32_t main()
{
IAMSPEED
vector<int> v;
cin >> n;
FOR(i,1,n) cin >> H[i];
FOR(i,1,n) v.pb(H[i]);
SparseTable ST=SparseTable(n,v);
FOR(i,1,n) cin >> W[i];
FOR(i,1,n) sum[i]=sum[i-1]+W[i];
priority_queue<int> pq;
set<int> in;
H[n+1]=0;
FOR(i,1,n+1) {
if(in.find(H[i]) != in.end());
else {
pq.push(H[i]);
in.insert(H[i]);
}
while(pq.size() && pq.top()>H[i]) {
int x=pq.top();
pq.pop();
int lo=0,hi=i;
while(lo<hi-1) {
int mid=(lo+hi)/2;
if(ST.query(mid,i-1)>=x) {
hi=mid;
} else {
lo=mid;
}
}
db(hi);
int sz=rsq(hi,i-1);
sz=sz*(sz+1)/2;
db(sz);
sz%=MOD;
int dif=x;
if(pq.size())dif=x-pq.top();
db(sz);
sz*=getseq(x-dif+1,x);
db(getseq(x-dif+1,x));
sz%=MOD;
ans+=sz;
ans%=MOD;
db(ans);
}
db(pq.size());
}
cout << ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |