제출 #1192641

#제출 시각아이디문제언어결과실행 시간메모리
1192641vukhacminh새로운 문제 (POI11_met)C++20
100 / 100
822 ms58184 KiB
/**
*    Author :  Vu Khac Minh
**/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 3e5 + 5;
const int mod = 1e9+7;
int n,m,l[maxn],r[maxn],ctry[maxn],k,res[maxn];
struct node
{
    int l,r,c;
}rain[maxn];
vector<int> tocheck[maxn],a[maxn];
ll bit[4*maxn];
void add(int u,ll val)
{
    for(;u<=m+1;u+=u&-u) bit[u]+=val;
}
ll get(int u)
{
    ll s = 0;
    for(;u;u-=u&-u) s+=bit[u];
    return s;
}
void rangeadd(int l,int r,ll val)
{
    add(l,val);
    add(r+1,-val);
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i =1;i<=m;i++)
    {
        int p;
        cin>>p;
        a[p].push_back(i);
    }
    for(int i =1;i<=n;i++) cin>>ctry[i];
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        int L,R,C;
        cin>>L>>R>>C;
        rain[i] = {L,R,C};
    }
    for(int i =1;i<=n;i++)
    {
        l[i] = 1;
        r[i] = k;
        res[i] = -1;
    }
    while(true)
    {
        bool check = false;
        for(int i =1;i<=k;i++) tocheck[i].clear();
        for(int i =1;i<=n;i++)
        {
            if(l[i]<=r[i])
            {
                int mid = (l[i] + r[i]) >>1;
                tocheck[mid].push_back(i);
                check  = true;
            }
        }
        if(!check) break;
        fill(bit,bit + m + 5, 0);
        for(int i =1;i<=k;i++)
        {
            int L= rain[i].l, R = rain[i].r, C = rain[i].c;
            if(L<=R) rangeadd(L,R,C);
            else
            {
                rangeadd(L,m,C);
                rangeadd(1,R,C);
            }
            for(auto id : tocheck[i])
            {
                ll tol = 0;
                for(auto j : a[id])
                {
                    tol+=get(j);
                    if(tol>=ctry[id]) break;
                }
                if(tol>=ctry[id])
                {
                    r[id] = i-1;
                    res[id] = i;
                }
                else l[id] = i+1;
            }
        }
    }
    for(int i =1;i<=n;i++)
    {
        if(res[i] == -1) cout<<"NIE"<<'\n';
        else cout<<res[i]<<'\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...