QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#721562 | #9528. New Energy Vehicle | KOH-# | WA | 1ms | 9836kb | C++14 | 2.6kb | 2024-11-07 16:23:42 | 2024-11-07 16:23:43 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
x=0;char ch=getchar();bool f=false;
while(!isdigit(ch)) f|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=f?-x:x;return;
}
template <typename T>
inline void print(T x){
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10^48);return;
}
#define ll long long
const int N=1e5+3,M=1e5+3;
int a[N],n,m,p[N],t[N],rev[N];
vector<int> loc[N];
int sum[N<<2],lazy[N<<2];
#define ls x<<1
#define rs x<<1|1
void Push_up(int x){
sum[x]=sum[ls]+sum[rs];
return;
}
void Change(int x){
lazy[x]=1,sum[x]=0;
return;
}
void Push_down(int x){
if(lazy[x]==1){
Change(ls),Change(rs);
lazy[x]=0;
}
return;
}
void Modify(int x,int l,int r,int go,int d){
if(l==r) return sum[x]=d,void();
Push_down(x);
int mid=(l+r)>>1;
if(mid>=go) Modify(ls,l,mid,go,d);
else Modify(rs,mid+1,r,go,d);
Push_up(x);return;
}
void Add(int x,int l,int r,int go,int d){
if(l==r) return sum[x]+=d,void();
Push_down(x);
int mid=(l+r)>>1;
if(mid>=go) Add(ls,l,mid,go,d);
else Add(rs,mid+1,r,go,d);
Push_up(x);return;
}
void Cover(int x,int l,int r,int L,int R){
if(l>=L&&r<=R) return Change(x),void();
Push_down(x);
int mid=(l+r)>>1;
if(mid>=L) Cover(ls,l,mid,L,R);
if(mid<R) Cover(rs,mid+1,r,L,R);
return;
}
int Query(int x,int l,int r,int L,int R){
if(l>=L&&r<=R) return sum[x];
Push_down(x);int mid=(l+r)>>1,res=0;
if(mid>=L) res+=Query(ls,l,mid,L,R);
if(mid<R) res+=Query(rs,mid+1,r,L,R);
return res;
}
int Search(int x,int l,int r,int s,int lim){
if(l==r) return l;
int mid=(l+r)>>1;
if(s+sum[ls]>=lim) return Search(ls,l,mid,s,lim);
else return Search(rs,mid+1,r,s+sum[ls],lim);
}
int main(){
int T;read(T);
while(T--){
read(n);read(m);
for(int i=1;i<=n;++i) loc[i].clear();
for(int i=1;i<=(n<<2);++i) sum[i]=0,lazy[i]=0;
for(int i=1;i<=m;++i) rev[i]=0;
for(int i=1;i<=n;++i) read(a[i]);
for(int i=1;i<=m;++i){
read(p[i]),read(t[i]);
loc[t[i]].push_back(i);
rev[i]=loc[t[i]].size()-1;
}
for(int i=1;i<=n;++i) loc[i].push_back(m+1);
for(int i=1;i<=n;++i) Add(1,1,m+1,loc[i][0],a[i]);
int ans=0;
for(int i=1;i<=m;++i){
if(p[i]-p[i-1]>sum[1]) break;
ans=i;
int now=Search(1,1,m+1,0,p[i]-p[i-1]);
int s=Query(1,1,m+1,1,now);
int d=s-p[i]-p[i-1];
// cout<<now<<" "<<s<<" "<<d<<"??\n";
if(now-1>=1) Cover(1,1,m+1,1,now-1);
Modify(1,1,m+1,now,d);
Modify(1,1,m+1,i,0);
Add(1,1,m+1,loc[t[i]][rev[i]+1],a[t[i]]);
}
ans=p[ans]+sum[1];
print(ans),putchar('\n');
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 7668kb
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: 9836kb
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 7 4 7 999999999 2000000000
result:
wrong answer 2nd lines differ - expected: '11', found: '7'