[关闭]
@994495jj 2017-07-16T13:21:32.000000Z 字数 1317 阅读 808

2017杭电ACM集训队单人排位赛 - 6 [Problem 1009]

201707 (ACM)思维


题意

题解

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef pair<int, int> pii;
  5. typedef vector<int> vi;
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  11. #define sz(a) (int)a.size()
  12. //---------------
  13. const int N=100005;
  14. struct Node {
  15. int a,b,c,val;
  16. bool operator < (const Node &tmp) const {
  17. return val>tmp.val;
  18. }
  19. }nn[N];
  20. int n,k;
  21. ll sumv[N];
  22. int bin(int x) {
  23. int ans=0,l=1,r=n;
  24. while(l<=r) {
  25. int m=(l+r)>>1;
  26. if(nn[m].val>x) {
  27. ans=m;
  28. l=m+1;
  29. } else {
  30. r=m-1;
  31. }
  32. }
  33. return ans;
  34. }
  35. int main() {
  36. int T;scanf("%d",&T);
  37. while(T--) {
  38. ///
  39. scanf("%d%d",&n,&k);
  40. ///read
  41. ll sumc=0;
  42. rep(i,1,n+1) {
  43. int a,b,c;scanf("%d%d%d",&a,&b,&c);
  44. nn[i]={a,b,c,a+b-c};
  45. sumc=sumc+c;
  46. }
  47. ///get sum
  48. sort(nn+1,nn+n+1);
  49. rep(i,1,n+1) sumv[i]=sumv[i-1]+nn[i].val;
  50. ///solve
  51. ll ans=0;
  52. rep(i,1,n+1) {
  53. int p=bin(nn[i].b);
  54. p=min(p,k);
  55. ll res=0;
  56. if(i<=p) {
  57. res=sumc+sumv[p]+1ll*(k-p)*nn[i].b;
  58. } else {
  59. if(p==k) --p;
  60. res=sumc+sumv[p]+nn[i].val+1ll*(k-p-1)*nn[i].b;
  61. }
  62. ans=max(ans,res);
  63. }
  64. ///print
  65. printf("%lld\n",ans);
  66. }
  67. return 0;
  68. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注