首页 > 其他分享 >【NOIP2017提高A组集训10.28】三元组

【NOIP2017提高A组集训10.28】三元组

时间:2022-12-26 18:32:56浏览次数:45  
标签:NOIP2017 mxx 10.28 mi 三元组 ++ include fo


Description

有X+Y+Z个三元组(x[i],y[i],z[i]),请你从每个三元组中挑数,并满足以下条件:
1、每个三元组中可以且仅可以选择一个数(即x[i],y[i],z[i]中的一个)
2、选择x[i]的三元组个数恰好为X
3、选择y[i]的三元组个数恰好为Y
4、选择z[i]的三元组个数恰好为Z问选出的数的和最大是多少
问选出的数的和最大是多少

Solution

在X=0的时候有一个很显然的做法就是把y-z排个序,然后前面Y个给Y,后面的给Z,这样可以让在Y贡献大的到Y去,在Z贡献大的到Z去。
然后我们来考虑一下X不为0的情况。
我们可以考虑把它转化为第一种情况,我们对于每个y和z都减去x,那么前面的x位就变成0了,那么就变成选y,选z和不选(选x)的情况了,最后把x都加上就好了。
那么这样很显然也是把y-z排个序,但是在前面有不选的情况,所以我们就肯定是选前面Y个y值最大的更优,其他的都留给x,Z的处理也同理,然后这个东西我们可以打个桶来维护。

Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int maxn=5e5+7,mxx=5e5;
int i,j,k,l,t,n,m,X,Y,Z,mi,c[maxn*2];
ll ans,he,f[maxn],g[maxn];
struct node{
int x,y,z;
}a[maxn];
bool cmp(node x,node y){return x.y-x.z>y.y-y.z;}
int main(){
freopen("triple.in","r",stdin);
freopen("triple.out","w",stdout);
scanf("%d%d%d",&X,&Y,&Z);n=X+Y+Z;
fo(i,1,n)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z),he+=a[i].x,a[i].y-=a[i].x,a[i].z-=a[i].x;
sort(a+1,a+1+n,cmp);
mi=0x7fffffff;fo(i,1,Y)mi=min(mi,a[i].y),f[Y]+=a[i].y,c[a[i].y+mxx]++;
fo(i,Y+1,n){
if(mi>=a[i].y)f[i]=f[i-1];
else{
c[a[i].y+mxx]++;f[i]=f[i-1]+a[i].y-mi;
c[mi+mxx]--;while(!c[mi+mxx])mi++;
}
}
memset(c,0,sizeof(c));
mi=0x7fffffff;fo(i,n-Z+1,n)mi=min(mi,a[i].z),g[n-Z+1]+=a[i].z,c[a[i].z+mxx]++;
fod(i,n-Z,1){
if(mi>=a[i].z)g[i]=g[i+1];
else{
c[a[i].z+mxx]++;g[i]=g[i+1]+a[i].z-mi;
c[mi+mxx]--;while(!c[mi+mxx])mi++;
}
}
fo(i,Y,n-Z+1)ans=max(ans,f[i]+g[i+1]+he);
printf("%lld\n",ans);
}


标签:NOIP2017,mxx,10.28,mi,三元组,++,include,fo
From: https://blog.51cto.com/u_15923198/5970022

相关文章

  • 【NOIP2017提高A组集训10.28】图
    Description有一个n个点A+B条边的无向连通图,有一变量x,每条边的权值都是一个关于x的简单多项式,其中有A条边的权值是k+x,另外B条边的权值是k-x,如果只保留权值形如k+x的边,那么这......
  • 2022.10.28 模拟赛小结
    2022.10.28模拟赛小结目录2022.10.28模拟赛小结更好的阅读体验戳此进入赛时思路T1CodeT2T3T4正解T1CodeT2T3T4UPD最惨的一场,基本所有题都挂了,最终得分$20\texttt{pts......
  • 第三章第2节: 2021.10.28 MySQL设计
            定长存储用char例如身份证号    第二点就是业务用到的库就用业务名                 ......
  • NOIP2017Day2T3-列队
    3、列队TimeLimit:2SecMemoryLimit:512MBDescriptionSylvia是一个热爱学习的女♂孩子。前段时间,Sylvia参加了学校的军训。众所周知,军训的时候需要站方......
  • NOIP2017Day2T1-奶酪
    题目描述现有一块大奶酪,它的高度为  ,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶......
  • 320 场周赛 数组中不等三元组的数目
    320场周赛数组中不等三元组的数目给你一个下标从0开始的正整数数组nums。请你找出并统计满足下述条件的三元组(i,j,k)的数目:0<=i<j<k<nums.lengthnums......
  • P8196 [传智杯 #4 决赛] 三元组 ----- 数组与vector
    题目描述给定一个长度为 nn 的数列 aa,对于一个有序整数三元组 (i,j,k)(i,j,k),若其满足 1\leqi\leqj\leqk\leqn1≤i≤j≤k≤n 并且 a_i+a_j=a_kai​+......
  • [NOIP2017 提高组] 列队
    我有病吧我挑这个题做。题意:$n,m,q\le3e5$解题思路:一眼看上去相当没有头绪。但如果仔细观察的话会发现这种操作本质上是改变某一个编号的位置,将其放在序列最后并......
  • 洛谷 P3951 [NOIP2017 提高组] 小凯的疑惑 题解
    LuoguP3951[NOIP2017提高组]小凯的疑惑题解注:设\(A,B\)是两个集合,则\(A\timesB\)表示\(A\)与\(B\)的笛卡儿积(直积)。笛卡儿积的定义为\(S\timesM:=\{(s......
  • NOIP2017 逛公园 记忆化搜索|dp(已过hack数据)
    30pts可以发现,\(k=0\)的情况下,问题转化为最短路计数,即从起点\(s\)到每个点有多少最短路。跑最短路的时候顺便维护\(ans[u]\),表示从\(s\)到\(u\)的最短路方案,讨论如下:①......