Submission #945911

#TimeUsernameProblemLanguageResultExecution timeMemory
945911teacupFancy Fence (CEOI20_fancyfence)C++17
30 / 100
6 ms604 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> typedef vector<int> vi; #define iii tuple<int,int,int> typedef vector<ii> vii; typedef vector<iii> viii; typedef map<int,int> mii; #ifndef debug #define cerr if (0) cerr #endif int N,H[10005],W[10005]; int pref[10005], last_mins[10005]; const int mod=1e9+7; int nc2(int n){ return ((n*(n-1))/2)%mod; } int rect(int h, int w){ return (nc2(h+1)*nc2(w+1))%mod; } struct node{ int s,e,mn,mx,sum,add_val,set_val; bool lset; node *l, *r; node (int _s, int _e, int A[]=NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL){ if (A==NULL) return; if (s==e) mn=mx=sum=A[s]; else{ l=new node(s, (s+e)>>1,A), r=new node((s+e+2)>>1,e,A); combine(); } } void create_children(){ if (s==e) return; if (l!=NULL) return; int m=(s+e)>>1; l=new node(s,m); r=new node(m+1,e); } void self_set(int v){ lset=1; mn=mx=set_val=v; sum=v*(e-s+1); add_val=0; } void self_add(int v){ if (lset) {self_set(v+set_val); return;} mn+=v, mx+=v, add_val+=v; sum+=v*(e-s+1); } void lazy(){ if (s==e) return; if (lset){ l->self_set(set_val), r->self_set(set_val); set_val=0; lset=0; } if (add_val!=0){ l->self_add(add_val), r->self_add(add_val); add_val=0; } } void combine(){ if (l==NULL) return; sum=l->sum +r->sum; mn=min(l->mn,r->mn); mx=max(l->mx,r->mx); } #define UPDATE(name)\ void name(int x, int y, int v){\ if (s==x&&e==y) {self_##name(v); return;}\ int m=(s+e)>>1; \ create_children(); lazy();\ if (x<=m) l->name(x,min(y,m),v);\ if (y>m) r->name(max(x,m+1),y,v);\ combine();\ } UPDATE(add) UPDATE(set) #define QUERY(name,fn,var,lazyfn)\ int range_##name(int x, int y){\ if (s==x&&e==y) return var;\ if (l==NULL||lset) return lazyfn(var);\ int m=(s+e)>>1; lazy();\ if (y<=m) return l->range_##name(x,y);\ if (x>m) return r->range_##name(x,y);\ return fn(l->range_##name(x,m), r->range_##name(m+1,y));\ } #define SAME(var) (var) #define PART(var) ((var)/(e-s+1)*(y-x+1)) #define SUM(a,b) ((a)+(b)) QUERY(min,min,mn,SAME) QUERY(max,max,mx,SAME) QUERY(sum,SUM,sum,PART) ~node(){ if (l!=NULL) delete l; if (r!=NULL) delete r; } }*root; int32_t main(){ cin>>N; int last_min = -1; for (int i=0; i<N; i++)cin>>H[i]; for (int i=0; i<N; i++){ cin>>W[i]; if (i==0) pref[i]=W[i]; else pref[i]=W[i]+pref[i-1]; last_mins[i]=last_min; if (i>0 && H[i-1]>H[i]){ last_min = i; } } int ans=0, sum=0; stack<iii> st; for (int i=0; i<N; i++){ ans += rect(H[i],W[i]); ans %= mod; int total_w = 0; while (st.size() && get<0>(st.top()) >= H[i]){ auto [h,w,p] = st.top(); st.pop(); total_w += w; total_w %= mod; sum = (sum-p + mod); sum %= mod; } ans += (sum*W[i])%mod; ans %= mod; ans += total_w * nc2(H[i]+1)%mod * W[i]%mod; ans %= mod; total_w += W[i]; total_w %= mod; int t = total_w * nc2(H[i]+1); t %= mod; sum += t; sum %= mod; st.push({H[i], total_w, t}); } cout<<ans; }

Compilation message (stderr)

fancyfence.cpp: In constructor 'node::node(long long int, long long int, long long int*)':
fancyfence.cpp:25:7: warning: 'node::lset' will be initialized after [-Wreorder]
   25 |  bool lset;
      |       ^~~~
fancyfence.cpp:24:20: warning:   'long long int node::add_val' [-Wreorder]
   24 |  int s,e,mn,mx,sum,add_val,set_val;
      |                    ^~~~~~~
fancyfence.cpp:27:2: warning:   when initialized here [-Wreorder]
   27 |  node (int _s, int _e, int A[]=NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL){
      |  ^~~~
#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...