QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#696773 | #9528. New Energy Vehicle | SocialPanda | WA | 1ms | 3956kb | C++23 | 2.7kb | 2024-11-01 01:17:08 | 2024-11-01 01:17:09 |
Judging History
answer
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
//#define int long long
//#define LL long long
#define double long double
//#define lf Lf
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define endl "\n"
#define PII pair<int,int>
#define Gheap priority_queue<int,vector<int>,greater<int>>
#define Lheap priority_queue<int>
#define MAXN 0x3f3f3f3f
#define MINN -0x3f3f3f3f
using namespace std;
const int N=1e5+100,M=2*N;
//int e[N],w[M],h[M],ne[M],idx;
int tree[N];
int nnn;
int lowbit(int num)
{
return num&-num;
}
void add(int psi,int ice)
{
for(int i=psi;i<=nnn;i+=lowbit(i)) tree[i]+=ice;
}
int sum(int psi)
{
int res=0;
for(int i=psi;i;i-=lowbit(i)) res+=tree[i];
return res;
}
int getval(int psi)
{
return sum(psi)-sum(psi-1);
}
void solve()
{
int n,m;
cin>>n>>m;
nnn=n;
memset(tree,0,sizeof tree);
int a[n+10];
int v[n+10];
PII c[m+10];
for(int i=1;i<=n;i++)
{
cin>>a[i];
v[i]=a[i];
add(i,a[i]);
}
for(int i=1;i<=m;i++) cin>>c[i].fi>>c[i].se;
unordered_map<int,int> mp;
vector<int> q(m+10);
int ll=0,rr=-1;
for(int i=1;i<=m;i++)
{
mp[c[i].se]++;
}
int cur = 0;
int hou = 0;
for(int i=1;i<=n;i++)
{
if(mp[i]==0)
{
hou+=a[i];
a[i]=0;
}
}
for(int i=1;i<=m;i++)
{
int psi = c[i].fi;
int sn = c[i].se;
int need_go = psi - cur;
int _need_go = need_go;
int L=i,R=m;
while(L<R)
{
int mid = L+R>>1;
int can_go = sum(mid)-sum(cur);
if(can_go > need_go) L=mid+1;
else R=mid;
}
need_go -= (sum(L-1)-sum(cur));
for(int j=i;j<=L-1;j++)
{
add(c[j].se,0-getval(j));
a[c[j].se]=0;
}
int len = min(need_go,getval(L));
need_go-=len;
a[c[L].se]-=len;
add(c[L].se,a[c[L].se]-getval(L));
//cout<<"debug:"<<getval(L)<<endl;
if(need_go>0)
{
int can_go = min(need_go,hou);
hou-=can_go;
need_go-=can_go;
}
if(need_go>0)
{//中途走不动了
cout<<cur+(_need_go - need_go)<<endl;
return;
}
mp[sn]--;
if(mp[sn]==0)
{
hou+=v[sn];
int diff = v[sn]-getval(sn);
add(sn,diff);
a[sn]=0;
}
else
{
int diff = v[sn]-getval(sn);
add(sn,diff);
a[sn]=v[sn];
}
cur = psi;
}
int ans = c[m].fi;
for(int i=1;i<=n;i++) ans+=a[i];
cout<<ans+hou<<endl;
}
/*
1 2 3
3 3 3
0 1 2 3 4 5 6 7 8 9 10 11 12
1 1 1
1 2
5 2
0 1 2 3 4 5 6 7 8 9
2 1
*/
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int tt=1;
cin >> tt;
while(tt--) solve();
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3956kb
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: 3944kb
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:
9 5 2 5 999999999 2000000000
result:
wrong answer 2nd lines differ - expected: '11', found: '5'