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...