BC第一题被×,第二题跟着大佬后面混的(大佬详细给讲解的),涨了姿势,学到了用vector+排序进行离散化的方法,感受到了STL的强大。
终测完把A也补掉了。
暴力方法交C++过不掉,交G++可过。
A代码如下
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define LL long long
struct node
{
LL val,num;
} a[30];
bool cmp(node x,node y)
{
return x.val<y.val;
}
LL b[1000005];
int main()
{
LL t,n;
scanf("%I64d",&t);
while(t--)
{
LL sum=0,cnt=0;
scanf("%I64d",&n);
for(LL i=1; i<=n; i++)
{
scanf("%I64d %I64d",&a[i].val,&a[i].num);
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
for(int j=0;j<a[i].num;j++)
{
b[cnt++]=a[i].val;
}
}
LL maxn=0;
for(LL i=0;i<cnt;i++)
{
LL x=1;
sum=0;
for(LL j=i;j<cnt;j++)
{
sum+=b[j]*x;
x++;
}
maxn=max(sum,maxn);
}
printf("%I64d\n",maxn);
}
return 0;
}
B代码如下,这个离散化方法可以当做模板使用
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>>
#include<vector>
using namespace std;
#define LL long long
struct node
{
LL l,r,ai,bi,ci;
}a[200005];
LL tl[200005],tr[200005];
vector<LL>lisanhua;
LL halfsearch(LL n)
{
return lower_bound(lisanhua.begin(), lisanhua.end(),n)-lisanhua.begin()+1;
}
int main()
{
LL t;
scanf("%I64d", &t);
while(t--)
{
lisanhua.clear();
memset(tl,0,sizeof(tl));
memset(tr,0,sizeof(tr));
LL n;
scanf("%I64d",&n);
for(LL i=1;i<=n;i++)
{
scanf("%I64d %I64d %I64d %I64d %I64d",&a[i].l,&a[i].r,&a[i].ai,&a[i].bi,&a[i].ci);
lisanhua.push_back(a[i].l);
lisanhua.push_back(a[i].r);
}
sort(lisanhua.begin(),lisanhua.end());
lisanhua.erase(unique(lisanhua.begin(),lisanhua.end()), lisanhua.end());
for(LL i=1; i<= n;i++)
{
tl[halfsearch(a[i].l)]+=a[i].ai-a[i].ci;
tr[halfsearch(a[i].r)]+=a[i].bi-a[i].ai;
}
LL ans=0,en=lisanhua.size();
for(LL i=1; i<=n;i++)
{
ans+=a[i].ci;
}
LL re=ans;
for(LL i=1;i<=en;i++)
{
ans+=tl[i];
re=max(ans,re);
ans+=tr[i];
re=max(ans,re);
}
printf("%I64d\n",re);
}
return 0;
}