社区讨论
玄关,求条
P14810[CCPC 2024 哈尔滨站] 新能源汽车参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mmbub6v8
- 此快照首次捕获于
- 2026/03/04 17:34 6 天前
- 此快照最后确认于
- 2026/03/07 11:30 3 天前
不知道怎么错了,求大佬救救me,已经两天了
CPP#include<iostream>
#include<map>
#include<vector>
using namespace std;
using ll=long long;
const int N=1e5+5;
int T;
ll a[N];
ll x[N],t[N];
vector<int>battery1;
vector<int>battery2;
map<int,ll>dead;
map<int,int>mp;
int main() {
cin>>T;
while(T--) {
battery1.clear();battery2.clear();
dead.clear();
mp.clear();
int n,m;
cin>>n>>m;
int id=0,id1=0;
for(int i=1; i<=n; i++) {
cin>>a[i];
dead[i]=a[i];
}
for(int i=1; i<=m; i++) {
cin>>x[i]>>t[i];
battery1.push_back(t[i]);
mp[t[i]]++;
}
for(int i=1; i<=n; i++) if(!mp[i]) battery2.push_back(i);
ll candrive=0;
for(int i=1; i<=m; i++) {
ll dist=x[i]-x[i-1];
//cout<<"dist:"<<dist<<endl;
while(id<battery1.size()) {
if(mp[battery1[id]]==0){
id++;continue;
}
//cout<<"电池"<<battery1[id]<<"号"<<endl;
if(dist>=dead[ battery1[ id ] ]) {
candrive+=dead[ battery1[ id ] ];
dist-=dead[ battery1[ id ] ];
dead[ battery1[ id++ ] ]=0;
if(dist==0) break;
} else {
if(mp[battery1[ id ]]==0) battery1.push_back(battery1[ id ]);
dead[ battery1[ id++ ] ]-=dist;
candrive+=dist;
dist=0;
break;
}
}
if(candrive==x[i]) {
dead[t[i]]=a[t[i]];
if(!(--mp[ t[i] ])) battery2.push_back(t[i]);
} else {
while(id1<battery2.size()) {
if(dist>=dead[battery2[id1]]) {
candrive+=dead[battery2[id1]];
dist-=dead[battery2[id1]];
dead[battery2[id1++]]=0;
} else {
dead[battery2[id1]]-=dist;
candrive+=dist;
dist=0;
break;
}
}
if(candrive==x[i]){
dead[t[i]]=a[t[i]];
if(!(--mp[ t[i] ])) battery2.push_back(t[i]);
}
else break;
}
//cout<<"candtive:"<<candrive<<endl;
}
//cout<<candrive<<endl;
while(id<battery1.size()) {
candrive+=dead[battery1[id]];
dead[battery1[id++]]=0;
}
while(id1<battery2.size()) {
candrive+=dead[battery2[id1]];
dead[battery2[id1++]]=0;
}
cout<<candrive<<endl;
}
return 0;
}
思路大体和题解差不多,就是不知道是细节处理有问题,还是哪里写炸了
回复
共 0 条回复,欢迎继续交流。
正在加载回复...