Submission #1085157

#TimeUsernameProblemLanguageResultExecution timeMemory
1085157vjudge1Flooding Wall (BOI24_wall)C++17
100 / 100
4870 ms105652 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define all(x) x.begin(),x.end() #define pb push_back #define for1(i,x,n) for(int i=x;i<=n;i++) #define for2(i,x,n) for(int i=x;i>=n;i--) #define int ll typedef long long ll; typedef pair<int,int> pii; const ll maxn=5e5+69; const ll mod=1e9+7; const ll inf=1e18; int n,a[maxn],b[maxn]; int mu2[maxn],chia2; namespace subdevaicalon { int m; vector<int> tmp; int aa[maxn],bb[maxn],res[maxn]; struct segtree { int f[maxn*8],g[maxn*8],lazy[maxn*8]; void push(int id) { int t=lazy[id]; f[id*2]=(f[id*2]*t)%mod; f[id*2+1]=(f[id*2+1]*t)%mod; g[id*2]=(g[id*2]*t)%mod; g[id*2+1]=(g[id*2+1]*t)%mod; lazy[id*2]=lazy[id*2]*t%mod; lazy[id*2+1]=lazy[id*2+1]*t%mod; lazy[id]=1; } void Add(int u,int val,int id=1,int l=0,int r=m) { if (l==r) { f[id]+=val; g[id]=f[id]*tmp[l]; f[id]%=mod; g[id]%=mod; return; } if (lazy[id]!=1) push(id); int mid=l+r>>1; if (u<=mid) Add(u,val,id*2,l,mid); else Add(u,val,id*2+1,mid+1,r); f[id]=(f[id*2]+f[id*2+1])%mod; g[id]=(g[id*2]+g[id*2+1])%mod; } void Mul(int u,int v,int val,int id=1,int l=0,int r=m) { if (u>r || v<l) return; if (u<=l&& r<=v) { f[id]=(f[id]*val)%mod; g[id]=(g[id]*val)%mod; lazy[id]=lazy[id]*val%mod; // if (u==0 && v==m) cerr<< id<<'\n'; return; } int mid=l+r>>1; if (lazy[id]!=1) push(id); Mul(u,v,val,id*2,l,mid); Mul(u,v,val,id*2+1,mid+1,r); f[id]=(f[id*2]+f[id*2+1])%mod; g[id]=(g[id*2]+g[id*2+1])%mod; } int Get_fsum(int u,int v,int id=1,int l=0,int r=m) { if (u>r || v<l) return 0; if (u<=l && r<=v) return f[id]; int mid=l+r>>1; if (lazy[id]!=1) push(id); return (Get_fsum(u,v,id*2,l,mid) + Get_fsum(u,v,id*2+1,mid+1,r))%mod; } int Get_gsum(int u,int v,int id=1,int l=0,int r=m) { if (u>r || v<l) return 0; if (u<=l && r<=v) return g[id]; int mid=l+r>>1; if (lazy[id]!=1) push(id); return (Get_gsum(u,v,id*2,l,mid) + Get_gsum(u,v,id*2+1,mid+1,r))%mod; } }tree; void Update(int i) { tree.Mul(bb[i]+1,m,2); // if (i==1) cerr<< " acssac "<<tree.Get_fsum(0,bb[i])<<'\n'; tree.Add(bb[i],tree.Get_fsum(0,bb[i])); tree.Add(aa[i],tree.Get_fsum(0,aa[i]-1)); tree.Mul(0,aa[i]-1,0); } int Get(int i) { int res=0; int r1=tree.Get_fsum(bb[i]+1,m), r2=tree.Get_gsum(bb[i]+1,m); r1=r1*chia2%mod; r2=r2*chia2%mod; res=r2+mod-(r1*b[i]%mod); res%=mod; int fb=tree.Get_fsum(bb[i],bb[i]); int xx=tree.Get_fsum(aa[i],bb[i]-1); fb-=xx; fb=fb*chia2%mod; r1+=xx+fb; r2+=tree.Get_gsum(aa[i],bb[i]-1); r2+=fb*b[i]; r1%=mod; r2%=mod; res+=r2+mod-(r1*a[i]%mod); return res%mod; } void sol() { for1(i,1,n) { tmp.pb(a[i]); tmp.pb(b[i]); } tmp.pb(0); sort(all(tmp)); tmp.resize(unique(all(tmp))-tmp.begin()); m=tmp.size(); for1(i,1,n) { aa[i]=lower_bound(all(tmp),a[i])-tmp.begin();//tmp[aa[i]]=a[i] bb[i]=lower_bound(all(tmp),b[i])-tmp.begin(); } for1(i,0,m*4) tree.lazy[i]=1; tree.Add(0,1); for1(i,1,n) { Update(i); // if (i==1)cerr << tree.Get_fsum(1,1)<<'\n'; res[i]=Get(i)*mu2[n-i]%mod; } for1(i,0,m*4) { tree.lazy[i]=1; // tree.f[i]=0; // tree.g[i]=0; } tree.Mul(0,m,0); tree.Add(0,1); for2(i,n,1) { // if(i==1) for1(i,0,m) cerr<< tree.Get_fsum(i,i)<<" gg\n"; // if (i==1) cerr<< tree.Get_fsum(0,4)<<'\n'; Update(i); res[i]=(res[i]+ (Get(i)*mu2[i-1]%mod))%mod; // cerr<< Get(i)<<'\n'; } int ans=0; for1(i,1,n) { ans=ans+res[i]+mod-Get(i); ans%=mod; } cout << ans; } } void sol() { // cerr<< pw(2,mod-2); chia2=500000004; cin >> n; for1(i,1,n) { cin >> a[i]; // cerr<< "aaa\n"; } bool is_sub2=1; mu2[0]=1; for1(i,1,n) mu2[i]=mu2[i-1]*2%mod; for1(i,1,n) { cin >> b[i]; if (b[i]<a[i]) swap(a[i],b[i]); if (a[i]!=1 || b[i]!=2) is_sub2=0; } subdevaicalon::sol(); } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("wall.inp","r",stdin); // freopen("wall.out","w",stdout); int t=1;//cin >> t; while (t--) { sol(); } } /* 10 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 */

Compilation message (stderr)

Main.cpp: In member function 'void subdevaicalon::segtree::Add(ll, ll, ll, ll, ll)':
Main.cpp:51:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   51 |             int mid=l+r>>1;
      |                     ~^~
Main.cpp: In member function 'void subdevaicalon::segtree::Mul(ll, ll, ll, ll, ll, ll)':
Main.cpp:68:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   68 |             int mid=l+r>>1;
      |                     ~^~
Main.cpp: In member function 'll subdevaicalon::segtree::Get_fsum(ll, ll, ll, ll, ll)':
Main.cpp:79:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   79 |             int mid=l+r>>1;
      |                     ~^~
Main.cpp: In member function 'll subdevaicalon::segtree::Get_gsum(ll, ll, ll, ll, ll)':
Main.cpp:87:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   87 |             int mid=l+r>>1;
      |                     ~^~
Main.cpp: In function 'void sol()':
Main.cpp:179:10: warning: variable 'is_sub2' set but not used [-Wunused-but-set-variable]
  179 |     bool is_sub2=1;
      |          ^~~~~~~
#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...