QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#698682#5415. RopewayblackfrogRE 0ms3656kbC++143.6kb2024-11-01 21:18:292024-11-01 21:18:29

Judging History

你现在查看的是最新测评结果

  • [2024-11-01 21:18:29]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:3656kb
  • [2024-11-01 21:18:29]
  • 提交

answer

#include<iostream>
#include<vector>
#include<string>
#include<queue>
using namespace std;

int t,n,k,qu;

string s;

struct node{
    long long val, ord;
};

void solve(){
    deque<node> q;
    cin>>n>>k;
    vector<long long> a(n*2+10), predp(n*2+10), sufdp(n*2+10);
    for(int i = 1;i<=n;i++){
        cin>>a[i];
    }
    cin>>s;
    s = s + "  ";
    for(int i = 0;i<=n+1;i++){
        while(!q.empty() && q.front().ord < i-k)q.pop_front();
        if(i<=1)predp[i] = a[i];
        else{
            predp[i] = a[i] + q.front().val;
            if(s[i-1] == '1'){
                q.clear();
            }
            while(!q.empty() && q.back().val > predp[i])q.pop_back();   
        }
        q.push_back(node{predp[i], i});
    }
    q.clear();
    for(int i = n+1;i>=0;i--){
        while(!q.empty() && q.front().ord > i + k)q.pop_front();
        if(i>=n)sufdp[i] = a[i];
        else{
            sufdp[i] = a[i] + q.front().val;
            if(s[i-1] == '1'){
                q.clear();
            }
            while(!q.empty() && q.back().val > sufdp[i])q.pop_back();   
        }
        q.push_back(node{sufdp[i], i});
    }
    cin>>qu;
    while(qu--){
        long long p,v;
        cin>>p>>v;
        if(s[p-1] == '1'){
            cout<<predp[n+1] - a[p]+v<<'\n';
            continue;
        }
        if(a[p]>=v)
        {
            long long l=max(0ll,p-k);
            long long prex=1e18;
            for(int i=p-1;i>=l;i--)
            {
                if(i!=0&&s[i-1]=='1')
                {
                    prex=predp[i];
                    break;
                }
                prex=min(prex,predp[i]);
            }
            long long r=min((long long)(n+1),p+k);
            long long sufx=1e18;
            for(int i=p+1;i<=r;i++)
            {
                if(i!=n+1&&s[i-1]=='1')
                {
                    sufx=sufdp[i];
                    break;
                }
                sufx=min(sufx,sufdp[i]);
            }
            cout<<min(v+prex+sufx,predp[n+1])<<'\n';
        }
        else
        {
            long long l=max(0ll,p-k+1);
            long long r=min((long long)n+1,p+k-1);
            long long res=1e18;
            q.clear();
            for(int i=l;i<p;i++)
            {
                if(i!=0&&s[i-1]=='1')
                {
                    l=i;
                }
            }
            for(int i=r;i>p;i--)
            {
                if(i!=n+1&&s[i-1]=='1')
                {
                    r=i;
                }
            }
            if(r-l<=k)
            {
                cout<<min(predp[l]+sufdp[r],predp[n+1]+v-a[p])<<'\n';
                return;
            }
            else
            {
                int j=l+k;
                long long sufx=1e18;
                for(int i=p+1;i<=j;i++)
                {
                    sufx=min(sufx,sufdp[i]);
                }
                long long res=1e18;
                for(int i=l;i<p;i++)
                {
                    res=min(predp[i]+sufx,res);
                    //cout<<"!"<<i<<" "<<sufdp[i]<<" "<<sufx<<" "<<res<<endl;
                    if(j<=r)
                    {
                    j++;
                    sufx=min(sufx,sufdp[j]);
                    }
                }
                cout<<min(res,predp[n+1]+v-a[p])<<'\n';
                return;
            }
        }
    }
}


int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--){
        solve();
    }

    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3656kb

input:

3
10 3
5 10 7 100 4 3 12 5 100 1
0001000010
2
2 3
6 15
5 6
1 1 1 1 1
00000
1
3 100
5 6
1 1 1 1 1
00100
1
3 100

output:

206
214
0
100

result:

ok 4 number(s): "206 214 0 100"

Test #2:

score: -100
Runtime Error

input:

500
19 6
285203460 203149294 175739375 211384407 323087820 336418462 114884618 61054702 243946442 19599175 51974474 285317523 222489944 26675167 300331960 1412281 324105264 33722550 169011266
1111111110110100011
18
3 127056246
5 100630226
14 301161052
2 331781882
5 218792226
2 190274295
12 49227476
...

output:


result: