제출 #1149921

#제출 시각아이디문제언어결과실행 시간메모리
1149921sitablechairFlooding Wall (BOI24_wall)C++20
0 / 100
140 ms102460 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC target("avx2,popcnt,lzcnt,abm,bmi,bmi2,fma,tune=native,sse,sse2,sse3") #define ll long long #define ldb long double #define endl '\n' #define For(i,l,r) for(int i=l;i<=r;i++) #define ForD(i,r,l) for(int i=r;i>=l;i--) #define ff first #define ss second #define pb push_back #define all(x) x.begin(),x.end() #define sz(x) (signed)x.size() #define unq(x) x.resize(unique(all(x))-x.begin()) #define F "C" #define fio freopen(F".INP","r",stdin);freopen(F".OUT","w",stdout); #ifdef NCGM #include"debug.h" #else #define debug(...) "fr"; #endif using namespace std; const int N=1e6+3,MOD=1e9+7,INV=500000004; ll prw[N]; ll binpow(ll x,ll y) { if(y == MOD - 2 && x <= 1000000) return prw[x]; x%=MOD; ll res=1; while(y>0) { if (y%2) res=res*x%MOD; x=x*x%MOD; y/=2; } return res; } int n,a[N],b[N],c[N],d[N],e[N][2]; ll pw[N*2]; pair<int,int> vt[N*2]; vector<ll> big; ll ans=0; struct SegTree1 { struct Node { ll mul=0,x=0,x1=0; Node(ll mul=1,ll x=0,ll x1=0): mul(mul),x(x),x1(x1) {}; } tr[N*4]; Node mrg(const Node A,const Node B) { Node res; res.mul=A.mul*B.mul%MOD; res.x=(B.x+A.x*B.mul%MOD)%MOD; res.x1=(B.x1+A.x1*B.mul%MOD)%MOD; return res; } void build(int id,int l,int r) { if (l==r) { tr[id]=Node(c[l],d[l]*(l+1)%MOD*pw[l-1]%MOD,d[l]*pw[l-1]%MOD); return; } int mid=l+r>>1; build(id*2,l,mid); build(id*2+1,mid+1,r); tr[id]=mrg(tr[id*2],tr[id*2+1]); } void update(int id,int l,int r,int u) { if (l>u || r<u) return; if (l==r) { tr[id]=Node(c[l],d[l]*(l+1)%MOD*pw[l-1]%MOD,d[l]*pw[l-1]%MOD); return; } int mid=l+r>>1; update(id*2,l,mid,u); update(id*2+1,mid+1,r,u); tr[id]=mrg(tr[id*2],tr[id*2+1]); } Node query(int id,int l,int r,int u,int v) { if (l>v || r<u) return Node(1,0,0); if (l>=u && r<=v) return tr[id]; int mid=l+r>>1; return mrg(query(id*2,l,mid,u,v),query(id*2+1,mid+1,r,u,v)); } } st1; void solve(bool lmao=0) { fill(c,c+1+n,0); For(i,1,n) c[i]=0,d[i]=2; st1.build(1,1,n); For(i,1,2*n) { auto el=vt[i]; if (el.ff>1) { ll right=(el.ff==n?1:st1.query(1,1,n,el.ff+1,n).mul); auto mmb=st1.query(1,1,n,1,el.ff-1); ll x=mmb.x%MOD,x1=mmb.x1%MOD; ll tmp=(1LL*x1*el.ff%MOD-x)%MOD; ans=(ans+e[el.ff][el.ss]*right%MOD*tmp%MOD); ans=(ans+e[el.ff][el.ss]*pw[el.ff-1]%MOD*right%MOD); if (lmao && el.ff<n) { ll left=st1.query(1,1,n,1,el.ff-1).mul; ans=(ans-e[el.ff][el.ss]*left%MOD*right%MOD); } } d[el.ff]--; c[el.ff]++; st1.update(1,1,n,el.ff); } } // 222,221,212,211,122,121,112,111 // (1,0): A:4 - 4 + 2 // (2,0): A:4 - 4 - 2 + 2 // (3,0): A:4 - 4 // (1,1): A:4 - 4 // (2,1): A:2 - 2, B:1 cai 2, 1 cai 1 // (3,1): A:4 - 4 ll powv(ll x, ll y) { ll ans = 1; while(y > 0) { if(y % 2 == 0) { y /= 2; x *= x; x %= MOD; }else { y--; ans *= x; ans %= MOD; } } return ans; } int main() { // fio cin.tie(0)->sync_with_stdio(0); cin >> n; for(ll i = 1;i <= 1000000;i++) { prw[i] = powv(i,MOD - 2); } pw[0]=1; For(i,1,n) pw[i]=pw[i-1]*2%MOD; For(i,1,n) { a[i]=2; cin >> a[i]; e[i][0]=a[i]; big.pb(a[i]); } For(i,1,n) { b[i]=1; cin >> b[i]; e[i][1]=b[i]; big.pb(b[i]); } For(i,1,n) vt[i]={i,0},vt[i+n]={i,1}; sort(vt+1,vt+1+2*n,[=](const pair<int,int> A,const pair<int,int> B) { return e[A.ff][A.ss]<e[B.ff][B.ss]; }); sort(all(big)); unq(big); solve(); reverse(b+1,b+1+n); reverse(a+1,a+1+n); For(i,1,n) { e[i][0]=a[i]; e[i][1]=b[i]; } For(i,1,n*2) vt[i].ff=n-vt[i].ff+1; solve(1); For(i,1,n) ans=(ans-1LL*a[i]*pw[n-1]%MOD)%MOD; For(i,1,n) ans=(ans-1LL*b[i]*pw[n-1]%MOD)%MOD; ans=(ans+MOD)%MOD; cout << ans; return 0; }
#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...