답안 #660126

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

using namespace std;
#define ll long long
#define ld long double
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==r){
        for (auto u:pple) ans[u]=l;
        return;
    }
    if (l==0) memset(fen,0,sizeof(fen)),curr=0; //do a reset
    ll m=(l+r)/2;
    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,n,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 9824 KB Output is correct
3 Correct 8 ms 9808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 9812 KB Output is correct
2 Correct 7 ms 9824 KB Output is correct
3 Correct 9 ms 9812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 13016 KB Output is correct
2 Correct 180 ms 15512 KB Output is correct
3 Correct 118 ms 14888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 132 ms 13532 KB Output is correct
2 Correct 147 ms 14624 KB Output is correct
3 Correct 181 ms 15316 KB Output is correct
4 Correct 48 ms 11996 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 13272 KB Output is correct
2 Correct 197 ms 15484 KB Output is correct
3 Correct 122 ms 12860 KB Output is correct
4 Correct 117 ms 15184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 141 ms 12832 KB Output is correct
2 Correct 169 ms 14716 KB Output is correct
3 Correct 85 ms 14052 KB Output is correct
4 Correct 167 ms 15764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 999 ms 36788 KB Output is correct
2 Incorrect 661 ms 37836 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1008 ms 36128 KB Output is correct
2 Incorrect 765 ms 36336 KB Output isn't correct
3 Halted 0 ms 0 KB -