HDU 2018CCPC 網路賽 整理
阿新 • • 發佈:2019-02-14
#include<bits/stdc++.h>
using namespace std;
multiset<pair<long long ,int> >s;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
s.clear();
int n;
scanf("%d",&n);
long long ans =0,cnt = 0;
for(int i=1;i<=n;i++)
{
long long x;
scanf("%lld",&x);
if(s.empty()||s.begin()->first>=x)
{
s.insert(make_pair(x,1));
}
else
{
pair<long long ,int>pr = *s.begin();
ans+=x-pr.first;
cnt+=pr.second*2 ;
s.erase(s.begin());
s.insert(make_pair(x,0));
s.insert(make_pair(x,1));
}
}
printf("%lld %lld\n",ans,cnt);
//cout<<ans<<" "<<cnt<<endl;
}
return 0;
}
牛客網 第二場1004弱化版:
題意改為倉庫最多隻能儲存一個貨物、
直接統計上升序列的個數,類似於最大子段和。
#include<bits/stdc++.h>
#define ll long long
#define M 100005
using namespace std;
ll a[M];
int t,n;
int main(){
cin>>t;
while(t--){
cin>>n;
ll A=0,B=0;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n-1;i++){
A+=max((int)(a[i+1]-a[i]),0);
}
int cnt=1;
for(int i=2;i<=n;i++){
if(a[i]>a[i-1])cnt++;
else if(a[i]<a[i-1]){
if(cnt>=2)B+=2;
cnt=1;
}
}
if(cnt>=2)B+=2;
cout<<A<<" "<<B<<endl;
}
}
1011 樹狀陣列|線段樹 二維偏序