QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#719287#9528. New Energy Vehicle20225954WA 1ms7916kbC++202.7kb2024-11-07 00:01:192024-11-07 00:01:20

Judging History

This is the latest submission verdict.

  • [2024-11-07 00:01:20]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 7916kb
  • [2024-11-07 00:01:19]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
#define db(x) cerr<<#x<<(x)<<"\n"
#define db1(x) cerr<<#x<<(x)<<" "
#define rep(i,a,b) for(auto i=(a);i<=(b);i++)
#define ll long long
const int N = 1e5+10;
int n,m;
ll x[N],id[N],a[N],na[N];
ll ans;
int vis[N];
int num[N];
vector<int> kpos[N];
const ll inf = 1e18;
int tot;
struct st{
    ll idx,pos;
    bool operator<(const st& T)const {
        return pos>T.pos;
    }
};
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];na[i] = a[i];
    }
    x[0]=0;
    for(int i=1;i<=m;i++){
        cin>>x[i]>>id[i];
        int k  = id[i];
        kpos[k].push_back(i);
    }
    x[m+1] = x[m]+10;
    priority_queue<st>q;
    for(int i=1;i<=n;i++){
    	if(kpos[i].size()){
    		q.push({i,x[kpos[i][0]]});++num[i];
    	}else q.push({i,x[m+1]});
    }
    int R =0;
    for(int i=1;i<=m;i++){
        ll dis = x[i]-x[i-1];
        db(dis);
        ll tmp =0,f =0;
        while(q.size()){
            auto [idx,pos] = q.top();q.pop();
            if(tmp+na[idx]<=dis){
            	//tmp代表当前走的距离+优先使用的电池<=dis,那么都将电池用完,丢弃,
            	//只有再次充电时才能用,直接丢弃,以后再加进来
                tmp+=na[idx];
                na[idx] =0;
                if(num[idx]<kpos[idx].size())q.push({idx,x[kpos[idx][num[idx]]]}),num[idx]++;
            //	else q.push({idx,x[m+1]});
            }else if(tmp+na[idx]>dis){
            	//电池暂时不能丢弃,那么该电池为临时电池,na[]值依旧要改变
            	//若为后续充电电池后,na[i]会增加就好
                ll res = dis-tmp;
                tmp=dis;//走到地方了
                na[idx]-=res;
            	if(num[idx]<kpos[idx].size())q.push({idx,x[kpos[idx][num[idx]]]}),num[idx]++;
            	else q.push({idx,x[m+1]});
            }
            if(tmp==dis){
                f =1; //跳出
                break;
            }
        }
        if(f==0){
            R =i-1;
            ans = x[R]+tmp;
        //    db(R);
            break;
        }
       		 R = i;
          	int k = id[i];
          	na[k] = max(na[k],a[k]);
        }
        if(R!=m){
        	cout<<ans<<"\n";
        }else {
        	//db(R);
        	ans = x[R];
        	// while(q.size()){
	        // auto [idx,pos] = q.top();q.pop();
	        // db(idx);
	        // ans+= na[idx];
	        // }
	        for(int i=1;i<=n;i++)ans+=na[i];
	        cout<<ans<<"\n";
        }
	    for(int i=1;i<=n;i++)num[i] =0,kpos[i].clear();
	    ans =0;
    return ;
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int _ ;cin>>_;while(_--)solve();
}

详细

Test #1:

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

input:

2
3 1
3 3 3
8 1
2 2
5 2
1 2
2 1

output:

12
9

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 7716kb

input:

6
3 2
2 2 2
6 1
7 1
2 2
3 3
2 1
6 2
2 3
2 2
5 1
7 2
9 1
2 2
3 3
2 1
6 2
1 1
999999999
1000000000 1
1 1
1000000000
1000000000 1

output:

6
11
4
11
999999999
2000000000

result:

wrong answer 1st lines differ - expected: '9', found: '6'