답안 #1006197

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1006197 2024-06-23T14:20:09 Z Unforgettablepl 수확 (JOI20_harvest) C++17
5 / 100
421 ms 40892 KB
#include <bits/stdc++.h>
using namespace std;


#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
typedef tree<pair<long long,long long>,null_type,less<>,rb_tree_tag,tree_order_statistics_node_update> orderedset;

#define int long long

const int INF = 1e18;

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m,l,c;
    cin >> n >> m >> l >> c;
    vector<int> employee(n+1);
    vector<int> apple(m);
    vector<pair<int,int>> adj(n+1);
    vector<vector<int>> revadj(n+1);
    for(int i=1;i<=n;i++)cin>>employee[i];
    for(int&i:apple)cin>>i;
    for(int i=1;i<=n;i++){
        int modded = c%l;
        int iter = 0;
        for(int jump=131072;jump;jump/=2){
            if(iter+jump>n)continue;
            if((l+employee[i]-employee[(n-iter-jump+i)%n +1])%l < modded)iter+=jump;
        }
        iter++;
        if(iter==n+1){
            adj[i] = {i,(c/l)*l + l};
            continue;
        }
        adj[i] = {(n-iter+i)%n +1,(c/l)*l + (l+employee[i]-employee[(n-iter+i)%n +1])%l};
        revadj[adj[i].first].emplace_back(i);
    }
    vector<int> depth(n+1);
    vector<bool> visited(n+1);
    vector<int> heads;
    function<void (int)> front_dfs = [&](int x){
        if(visited[x])return;
        visited[x]=true;
        front_dfs(adj[x].first);
        if(depth[adj[x].first]==0)heads.emplace_back(x);
        depth[x] = depth[adj[x].first]+adj[x].second;
    };
    for(int i=1;i<=n;i++)if(!visited[i])front_dfs(i);
    vector<vector<int>> apples(n+1);
    vector<vector<pair<int,int>>> queries(n+1);
    for(int&i:apple){
        int start = -1;
        if(i<employee[1])start = n;
        else {
            start = upper_bound(employee.begin()+1,employee.end(),i)-employee.begin()-1;
        }
        apples[start].emplace_back((l+i-employee[start])%l);
    }
    int q;
    cin >> q;
    vector<int> ans(q+1);
    for(int i=1;i<=q;i++){
        int v,t;
        cin >> v >> t;
        queries[v].emplace_back(t,i);
    }
    visited = vector<bool>(n+1);
    int uid = 0;
    function<orderedset(int)> calc_linear_dfs = [&](int x){
        orderedset curr;
        if(visited[x])return curr;
        visited[x] = true;
        for(int&i:revadj[x]){
            auto t = calc_linear_dfs(i);
            if(curr.size()<t.size())swap(curr,t);
            for(auto j:t)curr.insert(j);
        }
        for(int&i:apples[x])curr.insert({i+depth[x],++uid});
        for(auto[t,idx]:queries[x]){
            ans[idx] = curr.order_of_key({t+depth[x],200000000ll});
        }
        return curr;
    };
    for(int&i:heads){
        auto t = calc_linear_dfs(i);
        orderedset curr;
        for(auto [x,y]:t)curr.insert({x-adj[i].second,y});
        int cycle_len = depth[adj[i].first];
        function<void(int,int)> calc = [&](int x,int len){
            for(auto[t,idx]:queries[x]){
                t-=len;
                if(t<0)continue;
                ans[idx]+=curr.size()*(t/cycle_len);
                t%=cycle_len;
                ans[idx]+=curr.order_of_key({t,200000000ll});
            }
            if(x==i)return;
            calc(adj[x].first,len+adj[x].second);
        };
        calc(adj[i].first,adj[i].second);
    }
    for(int i=1;i<=q;i++)cout<<ans[i]<<'\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 3 ms 860 KB Output is correct
3 Correct 4 ms 1372 KB Output is correct
4 Correct 14 ms 1428 KB Output is correct
5 Correct 110 ms 2132 KB Output is correct
6 Correct 107 ms 2128 KB Output is correct
7 Correct 101 ms 2128 KB Output is correct
8 Correct 4 ms 1116 KB Output is correct
9 Correct 3 ms 1180 KB Output is correct
10 Correct 3 ms 1128 KB Output is correct
11 Correct 5 ms 1116 KB Output is correct
12 Correct 150 ms 2296 KB Output is correct
13 Correct 134 ms 2132 KB Output is correct
14 Correct 49 ms 1596 KB Output is correct
15 Correct 65 ms 1624 KB Output is correct
16 Correct 54 ms 1620 KB Output is correct
17 Correct 91 ms 1676 KB Output is correct
18 Correct 99 ms 1552 KB Output is correct
19 Correct 60 ms 1728 KB Output is correct
20 Correct 53 ms 1656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 8976 KB Output is correct
2 Incorrect 421 ms 40892 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 3 ms 860 KB Output is correct
3 Correct 4 ms 1372 KB Output is correct
4 Correct 14 ms 1428 KB Output is correct
5 Correct 110 ms 2132 KB Output is correct
6 Correct 107 ms 2128 KB Output is correct
7 Correct 101 ms 2128 KB Output is correct
8 Correct 4 ms 1116 KB Output is correct
9 Correct 3 ms 1180 KB Output is correct
10 Correct 3 ms 1128 KB Output is correct
11 Correct 5 ms 1116 KB Output is correct
12 Correct 150 ms 2296 KB Output is correct
13 Correct 134 ms 2132 KB Output is correct
14 Correct 49 ms 1596 KB Output is correct
15 Correct 65 ms 1624 KB Output is correct
16 Correct 54 ms 1620 KB Output is correct
17 Correct 91 ms 1676 KB Output is correct
18 Correct 99 ms 1552 KB Output is correct
19 Correct 60 ms 1728 KB Output is correct
20 Correct 53 ms 1656 KB Output is correct
21 Correct 75 ms 8976 KB Output is correct
22 Incorrect 421 ms 40892 KB Output isn't correct
23 Halted 0 ms 0 KB -