比赛 |
20251001国庆欢乐赛1 |
评测结果 |
AWWWWWWWWW |
题目名称 |
有n种物品 |
最终得分 |
10 |
用户昵称 |
Ruyi |
运行时间 |
0.402 s |
代码语言 |
C++ |
内存使用 |
4.80 MiB |
提交时间 |
2025-10-01 09:25:47 |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[100001],b[100001],v[100001],flag[1000001],ff[100001];
ll ansa,ansb;
struct tree{
int i,max;
}t[1000001];
void build(int l,int r,int k){
if(l==r){
t[k].i=l;
t[k].max=a[l];
v[l]=k;
return ;
}
int mid=(l+r)/2;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
if(t[k*2].max>t[k*2+1].max){
t[k].max=t[k*2].max;
t[k].i=t[k*2].i;
}else if(t[k*2].max==t[k*2+1].max){
if(ff[t[k*2].i]>ff[t[k*2+1].i]){
t[k].max=t[k*2+1].max;
t[k].i=t[k*2+1].i;
}else{
t[k].max=t[k*2].max;
t[k].i=t[k*2].i;
}
}else{
t[k].max=t[k*2+1].max;
t[k].i=t[k*2+1].i;
}
return ;
}
void f(){
int k=v[t[1].i];
if(flag[k]==0){
t[k].max=b[t[1].i];
ff[t[1].i]-=a[t[1].i];
}else if(flag[k]==1){
t[k].max=0;
ff[t[1].i]=0;
}
flag[k]++;
while(k/2>0){
int kk;
if(k%2==0) kk=k+1;
else kk=k-1;
if(t[k].max>t[kk].max){
t[k/2].max=t[k].max;
t[k/2].i=t[k].i;
}else if(t[k].max==t[kk].max){
if(ff[t[k].i]>ff[t[kk].i]){
t[k/2].max=t[kk].max;
t[k/2].i=t[kk].i;
}else{
t[k/2].max=t[k].max;
t[k/2].i=t[k].i;
}
}else{
t[k/2].max=t[kk].max;
t[k/2].i=t[kk].i;
}
k/=2;
}
return ;
}
int main(){
freopen("nit.in","r",stdin);
freopen("nit.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
ff[i]=a[i]+b[i];
}
build(1,n,1);
for(int i=1;i<=n;i++){
ansa+=t[1].max;
//cout<<t[1].max<<endl;
f();
ansb+=t[1].max;
//cout<<t[1].max<<endl;
f();
}
cout<<ansa-ansb<<endl;
return 0;
}