cf 749D Leaving Auction

野性酷女 2021-11-01 11:20 301阅读 0赞

题意:拍卖一件物品,有n个竞标,一个人可以有多个竞标。给出n个竞标,a[i],b[i].a[i]表示人的序号,b[i]表示竞标价格。

  1. 接下来有q个询问,每次一个k,之后k个数表示该序号的人缺席。问谁最终以多少钱得标。如果没有输出0 0,否则输出序号和价钱。

思路:可以按竞标价格排个序,先将所有人逆序加入set集合中,由于set会自动排序,所以set中存2个元素,

  1. 一个用来防止其加入自动排序,一个存每个人的编号。然后再将未出席的删除,如果最后set中没有人了,
  2. 则输出0 0,如果还剩1个,则输出该人的最小出价,否则的话,输出set中第一个人所有出价中第一次大于
  3. set中第2个人的最大出价的出价,可以用二分查找。 set删除一个数的时间复杂度为O(logn),vectorO(n),
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<string>
  7. #include<cstring>
  8. #include<cstdio>
  9. #include<queue>
  10. #include<map>
  11. #include<vector>
  12. #include<set>
  13. using namespace std;
  14. vector<int>mp[200005];
  15. set<pair<int,int> >aa;
  16. int a[200005],v[200005],b[200005];
  17. int fun(int x,int y)
  18. {
  19. int k=mp[y].size();
  20. int m=mp[y][k-1];
  21. int r=mp[x].size()-1;
  22. int l=0;
  23. while(l<r)
  24. {
  25. int mid=(l+r)/2;
  26. if(mp[x][mid]<=m)
  27. l=mid+1;
  28. else
  29. r=mid;
  30. }
  31. return mp[x][r];
  32. }
  33. int main()
  34. {
  35. int n,s,w;
  36. scanf("%d",&n);
  37. for(int i=1;i<=n;i++)
  38. {
  39. scanf("%d %d",&s,&w);
  40. a[i]=s;
  41. mp[s].push_back(w);
  42. }
  43. for(int i=n;i>=1;i--)
  44. {
  45. if(!v[a[i]])
  46. {
  47. aa.insert(make_pair(-i,a[i]));
  48. v[a[i]]=i;
  49. }
  50. }
  51. set<pair<int,int> >::iterator it;
  52. int t;
  53. scanf("%d",&t);
  54. while(t--)
  55. {
  56. int k;
  57. scanf("%d",&k);
  58. for(int i=1;i<=k;i++)
  59. {
  60. scanf("%d",&w);
  61. b[i]=w;
  62. if(v[w]==0)
  63. continue;
  64. aa.erase(make_pair(-v[w],w));
  65. }
  66. if(aa.size()==0)
  67. printf("0 0\n");
  68. else if(aa.size()==1)
  69. {
  70. int x=aa.begin()->second;
  71. printf("%d %d\n",x,mp[x][0]);
  72. }
  73. else
  74. {
  75. int x=aa.begin()->second;
  76. int y=(++aa.begin())->second;
  77. printf("%d %d\n",x,fun(x,y));
  78. }
  79. for(int i=1;i<=k;i++)
  80. {
  81. if(v[b[i]])
  82. aa.insert(make_pair(-v[b[i]],b[i]));
  83. }
  84. }
  85. return 0;
  86. }

  

所以这题用vector会时间超限。

转载于:https://www.cnblogs.com/zcb123456789/p/11330728.html

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CF1214D

    CF1214D 题意: > 给你一个 $ n \\times m $ 的矩阵,求最少用多少个障碍,将 $ (1,1) $ 到 $ (n,m) $ 的路径堵死...

    相关 CF981D

    CF981D 题意: > 给你n个数,要求你分成k堆。每堆的内部加和,每堆之间是相与。问最大的值。 解法: > 二进制下最大的数的所有位一定是1,所...

    相关 CF427D

    CF427D > SA的奇技淫巧,其实就是板子。 题意: > 给定两个字符串,求最短的满足各只出现一次的连续公共字串 解析: > 一般情况下,SA...

    相关 CF1208D

    CF1208D 题意; > 给你一个数组,要求支持单点修改和单点查询 解法: > 直接线段树搞一搞就没了。 CODE: includ...

    相关 cf 749D Leaving Auction

    题意:拍卖一件物品,有n个竞标,一个人可以有多个竞标。给出n个竞标,a\[i\],b\[i\].a\[i\]表示人的序号,b\[i\]表示竞标价格。            接