답안 #660130

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
660130 2022-11-20T12:45:36 Z beepbeepsheep Meteors (POI11_met) C++17
74 / 100
1084 ms 36760 KB
#include <bits/stdc++.h>

using namespace std;
#define ll long long
typedef pair<ll,ll> ii;
const ll inf=1e18;
const ll maxn=3e5+5;
const ll mod=1e9+7;

vector<ll> adj[maxn];
ll arr[maxn];
ll n,e,op,ele,a,b,c;
vector<tuple<ll,ll,ll>> v;
ll fen[maxn];
void upd(ll x, ll y, ll val){
    while (x<maxn){
        fen[x]+=val;
        x+=(x&-x);
    }
    y++;
    while (y<maxn){
        fen[y]-=val;
        y+=(y&-y);
    }
}
ll query(ll p){
    ll ans=0;
    while (p){
        ans+=fen[p];
        p-=(p&-p);
    }
    return ans;
}
ll ans[maxn];
queue<tuple<ll,ll,vector<ll>>> q;
ll curr=0;
void solve(ll l, ll r, vector<ll> &pple){
    if (l==0) memset(fen,0,sizeof(fen)),curr=0; //do a reset
    if (l==r){
        for (auto u:pple) ans[u]=l; //done
        return;
    }
    ll m=(l+r)>>1;
    for (int i=curr;i<=m;i++){
        tie(a,b,c) = v[i];
        if (a<=b) upd(a,b,c);
        else upd(1,b,c),upd(a,e,c); //add all up to m operations
    }
    vector<ll> can,cannot;
    for (auto u:pple){
        ll tot=0;
        for (auto x:adj[u]){
            tot+=query(x);
        }
        if (tot>=arr[u]) can.emplace_back(u);
        else cannot.emplace_back(u);
    }
    curr=m+1;
    q.emplace(l,m,can);
    q.emplace(m+1,r,cannot);
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>e;
    vector<ll> pple;
    for (int i=1;i<=e;i++){
        cin>>ele;
        adj[ele].emplace_back(i);
    }
    for (int i=1;i<=n;i++){
        cin>>arr[i];
        pple.emplace_back(i);
    }
    cin>>op;
    for (int i=1;i<=op;i++){
        cin>>a>>b>>c;
        v.emplace_back(a,b,c);
    }
    v.emplace_back(1,e,inf);
    q.emplace(0,op,pple);
    while (q.size()){
        tie(a,b,pple) = q.front();
        q.pop();
        solve(a,b,pple);
    }
    for (int i=1;i<=n;i++){
        if (ans[i]==op) cout<<"NIE"<<endl;
        else cout<<ans[i]+1<<endl;
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 9812 KB Output is correct
2 Correct 7 ms 9812 KB Output is correct
3 Correct 7 ms 9812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 9812 KB Output is correct
2 Correct 7 ms 9812 KB Output is correct
3 Correct 7 ms 9816 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 76 ms 13052 KB Output is correct
2 Correct 183 ms 14288 KB Output is correct
3 Correct 120 ms 13820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 13568 KB Output is correct
2 Correct 144 ms 13620 KB Output is correct
3 Correct 196 ms 14012 KB Output is correct
4 Correct 46 ms 11536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 13360 KB Output is correct
2 Correct 180 ms 14420 KB Output is correct
3 Correct 112 ms 12348 KB Output is correct
4 Correct 129 ms 14052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 139 ms 12828 KB Output is correct
2 Correct 167 ms 13488 KB Output is correct
3 Correct 91 ms 13064 KB Output is correct
4 Correct 162 ms 14600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1084 ms 36760 KB Output is correct
2 Incorrect 622 ms 29984 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1032 ms 36028 KB Output is correct
2 Incorrect 735 ms 30020 KB Output isn't correct
3 Halted 0 ms 0 KB -