Submission #877546

#TimeUsernameProblemLanguageResultExecution timeMemory
877546mrwangHarvest (JOI20_harvest)C++17
100 / 100
255 ms148356 KiB
#include<bits/stdc++.h> #define pb push_back #define pli pair<ll,ll> #define fi first #define se second #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); using namespace std; using ll=long long; const ll maxn=4e5+10; const ll inf=1e18; const ll mod=1e9+7; ll n,m,l,c,a[maxn/2],b[maxn/2]; ll dis(ll i,ll j) { return (j-i+l)%l; } vector<ll>g[maxn]; ll deg[maxn]; bool vis[maxn]; vector<ll>vec[maxn],vv[maxn]; ll nxt[maxn],w[maxn]; bool in[maxn]; void dtmt() { queue<int>q; for(int i=1;i<=n+m;i++) { in[i]=true; if(deg[i]==0) q.push(i); } while(!q.empty()) { ll u=q.front(); in[u]=false; q.pop(); deg[nxt[u]]--; if(deg[nxt[u]]==0) q.push(nxt[u]); } } pli e[maxn]; ll tg=0,tin[maxn],tout[maxn],cnt=0,rte[maxn],id[maxn]; ll h[maxn]; vector<ll>app[maxn],pre[maxn]; void dfs(ll u) { tin[u]=++tg; id[u]=cnt; if(u>n) app[cnt].pb(h[u]); vis[u]=true; for(int v:g[u]) h[v]=h[u]+w[v],dfs(v); tout[u]=tg; } ll root[maxn],sum[maxn]; ll bit[maxn]; void update(ll i,ll v) { while(i<maxn) bit[i]+=v,i+=i&(-i); } ll get(ll i) { ll aa=0; while(i>0) aa+=bit[i],i-=i&(-i); return aa; } ll beg[maxn],ans[maxn]; vector<pli>nen1,nen2; struct Tq { ll v,l,r,id; bool operator<(const Tq&o) { return v<o.v; } }; vector<Tq>query1,query2; void solve() { cin >> n >> m >> l >> c; for(int i=1;i<=n;i++) cin >> a[i],e[i]={a[i],i}; for(int i=1;i<=m;i++) cin >> b[i]; sort(e+1,e+n+1); for(int i=1;i<=n;i++) { ll x=lower_bound(e+1,e+n+1,(pli){(a[i]-(c%l)+l)%l+1,0})-e-1; ll id; if(x==0) id=e[n].se; else id=e[x].se; nxt[i]=id; w[i]=dis(a[id],(a[i]-(c%l)+l)%l)+c; deg[id]++; } for(int i=1;i<=m;i++) { ll x=lower_bound(e+1,e+n+1,(pli){b[i]+1,0})-e-1; ll id; if(x==0) id=e[n].se; else id=e[x].se; nxt[i+n]=id; w[i+n]=dis(a[id],b[i]); deg[id]++; } dtmt(); for(int i=1;i<=n+m;i++) if(in[i]==false) g[nxt[i]].pb(i); ll sz=0; for(int i=1;i<=n+m;i++) { if(in[i]==true&&vis[i]==false) { cnt++; root[cnt]=i; vec[cnt].pb(i); vis[i]=true; sum[cnt]=w[i]; for(int j=nxt[i];j!=i;j=nxt[j]) { vis[j]=true; g[nxt[j]].pb(j); sum[cnt]+=w[j]; vec[cnt].pb(j); } dfs(i); sort(app[cnt].begin(),app[cnt].end()); beg[cnt]=sz+1; for(int j=sz+1;j<=sz+app[cnt].size();j++) nen2.pb({app[cnt][j-sz-1]%sum[cnt],j}); pre[cnt].resize(app[cnt].size()); for(int j=0;j<app[cnt].size();j++) { pre[cnt][j]=app[cnt][j]/sum[cnt]; if(j>0) pre[cnt][j]+=pre[cnt][j-1]; } sz+=app[cnt].size(); ll luu=0; for(auto zz:vec[cnt]) rte[zz]=luu,luu+=w[zz]; rte[i]=luu; } } for(int i=1;i<=m;i++) nen1.pb({h[i+n],tin[i+n]}); sort(nen1.begin(),nen1.end()); sort(nen2.begin(),nen2.end(),greater<pli>()); ll q; cin >> q; for(int i=1;i<=q;i++) { ll v,T; ans[i]=0; cin >> v >> T; query1.pb({T+h[v],tin[v],tout[v],i}); if(in[v]) { ll u=v; ll ii=id[u]; ll vc=upper_bound(app[ii].begin(),app[ii].end(),T-rte[u])-app[ii].begin(); if(vc==0) continue; ll r1=(T-rte[u])/sum[ii]; ll du=(T-rte[u])%sum[ii]; ans[i]+=vc; ans[i]+=r1*vc-pre[ii][vc-1]; query2.pb({du+1,beg[ii],beg[ii]+vc-1,i}); } } sort(query1.begin(),query1.end()),fill(bit,bit+maxn,0); ll j=0; for(int i=0;i<query1.size();i++) { while(j<nen1.size()&&nen1[j].fi<=query1[i].v) update(nen1[j].se,1),j++; ans[query1[i].id]+=get(query1[i].r)-get(query1[i].l-1); } sort(query2.begin(),query2.end());fill(bit,bit+maxn,0); j=0; for(int i=(int)query2.size()-1;i>=0;i--) { while(j<nen2.size()&&nen2[j].fi>=query2[i].v) update(nen2[j].se,1),j++; ans[query2[i].id]-=get(query2[i].r)-get(query2[i].l-1); } for(int i=1;i<=q;i++) cout << ans[i]<<'\n'; } int main() { fastio //freopen("c.INP","r",stdin); //freopen("c.OUT","w",stdout); solve(); }

Compilation message (stderr)

harvest.cpp: In function 'void solve()':
harvest.cpp:124:29: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
  124 |             for(int j=sz+1;j<=sz+app[cnt].size();j++) nen2.pb({app[cnt][j-sz-1]%sum[cnt],j});
      |                            ~^~~~~~~~~~~~~~~~~~~~
harvest.cpp:126:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |             for(int j=0;j<app[cnt].size();j++)
      |                         ~^~~~~~~~~~~~~~~~
harvest.cpp:163:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Tq>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  163 |     for(int i=0;i<query1.size();i++)
      |                 ~^~~~~~~~~~~~~~
harvest.cpp:165:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |         while(j<nen1.size()&&nen1[j].fi<=query1[i].v) update(nen1[j].se,1),j++;
      |               ~^~~~~~~~~~~~
harvest.cpp:172:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  172 |         while(j<nen2.size()&&nen2[j].fi>=query2[i].v) update(nen2[j].se,1),j++;
      |               ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...