Submission #487272

#TimeUsernameProblemLanguageResultExecution timeMemory
487272kymFancy Fence (CEOI20_fancyfence)C++14
0 / 100
1 ms512 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...