题目大意:

给定一堆带颜色和高度的魔方

用两种颜色的魔方,一种颜色接一种颜色向上拼接搭建成一个高塔,求高塔的最长高度,以及将拼接的过程中对应的编号顺序输出

多种情况成立输出任意一种即可

这里首先要对颜色(c值)进行离散化,这样每种颜色都对应有一个编号

用一个响亮vec[i]来保存 编号 i 的颜色的高度值以及对应要输出时的序号 , 高度值由大到小保存,这个可以在一开始的魔方排序给c离散化的时候做到

拼接可以是两种颜色各有 len 个 , 或者一种为len , 一种为len+1

那么利用一个数组max_val [len] , sec_val[len]保存有len个颜色相同的魔方所能构建的最大和次大值

那么同时也要建立max_id[len] , sec_id[len]表示len个颜色相同的魔方所能构建的最大和次大值时对应的 颜色离散化后的标号

每次不断往向量中加入一个魔方的情况,加的同时就可以对上述的4个数组进行更新,因为 s 由大到小排列,那么加的时候始终得到的是当前颜色这个长度所能达到的最大

这样就可以max_val [len] , sec_val[len]来求最大值,中间找到最大值时,记录一些相关数据以便最后的输出

每次找的时候要写一个判断保证这个条件下所得到的两种魔方不为一个颜色

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <vector>
  6. #include <algorithm>
  7. using namespace std;
  8. const int N = ;
  9.  
  10. int a[N] , max_id[N] , sec_id[N]; //a[]保存离散化后的c
  11.  
  12. struct Node{
  13. int v , num;
  14. };
  15.  
  16. vector<Node> vec[N];
  17. #define ll long long
  18. ll max_val[N] , sec_val[N] , sum[N];
  19.  
  20. struct Cube{
  21. int c , s , num;
  22. bool operator<(const Cube &m)const{
  23. if(c == m.c) return s > m.s;
  24. return c < m.c;
  25. }
  26. }cu[N];
  27.  
  28. int bin_search(int x , int k)
  29. {
  30. int l= , r = k-;
  31. while(l<=r){
  32. int m=(l+r)>>;
  33. if(a[m] == x) return m;
  34. else if(a[m]>x) r = m-;
  35. else l = m+;
  36. }
  37. }
  38.  
  39. int main()
  40. {
  41. // freopen("a.in" , "r" , stdin);
  42. int n;
  43. while(scanf("%d" , &n ) == )
  44. {
  45. for(int i= ; i<=n ; i++) vec[i].clear();
  46.  
  47. for(int i = ;i<n ; i++)
  48. {
  49. scanf("%d%d" , &cu[i].c , &cu[i].s);
  50. cu[i].num = i+;
  51. }
  52.  
  53. sort(cu , cu+n);
  54. int k = ;
  55. a[k++] = cu[].c;
  56. for(int i= ; i<n ; i++){
  57. if(cu[i].c != cu[i-].c) a[k++] = cu[i].c;
  58. }
  59.  
  60. memset(sum , , sizeof(sum));
  61. memset(max_val , , sizeof(max_val));
  62. memset(sec_val , , sizeof(sec_val));
  63. for(int i= ; i<n ; i++){
  64. int index = bin_search(cu[i].c , k);
  65. Node node;
  66. node.num = cu[i].num , node.v = cu[i].s;
  67. vec[index].push_back(node);
  68. sum[index] = sum[index] + cu[i].s;
  69. int len = vec[index].size();
  70. if(max_val[len] < sum[index]){
  71. sec_val[len] = max_val[len];
  72. sec_id[len] = max_id[len];
  73.  
  74. max_val[len] = sum[index];
  75. max_id[len] = index;
  76. }
  77. else if(sec_val[len] < sum[index]){
  78. sec_val[len] = sum[index];
  79. sec_id[len] = index;
  80. }
  81. }
  82. // cout<<"test: "<<max_val[1]<<" index: "<<max_id[1]<<" "<<sec_id[1]<<endl;
  83. int col1 , col2 , len1 , len2;
  84. ll ans = ;
  85. for(int len= ; len<=n ; len++){
  86. if(max_val[len] && sec_val[len]){
  87. if(max_id[len] != sec_id[len]){
  88. if(ans < max_val[len]+sec_val[len]){
  89. ans = max_val[len]+sec_val[len];
  90. col1 = max_id[len];
  91. col2 = sec_id[len];
  92. len1 = len , len2 = len;
  93. }
  94. }
  95. }
  96. //长度不等的时候排除所有两种颜色一样的情况
  97. if(max_val[len] && max_val[len+]){
  98. if(max_id[len] != max_id[len+]){
  99. if(ans < max_val[len]+max_val[len+]){
  100. ans = max_val[len]+max_val[len+];
  101. col1 = max_id[len];
  102. col2 = max_id[len+];
  103. len1 = len , len2 = len+;
  104. }
  105. }
  106. }
  107. if(sec_val[len] && max_val[len+]){
  108. if(sec_id[len] != max_id[len+]){
  109. if(ans < sec_val[len]+max_val[len+]){
  110. ans = sec_val[len]+max_val[len+];
  111. col1 = sec_id[len];
  112. col2 = max_id[len+];
  113. len1 = len , len2 = len+;
  114. }
  115. }
  116. }
  117. if(max_val[len] && sec_val[len+]){
  118. if(max_id[len] != sec_id[len+]){
  119. if(ans < max_val[len]+sec_val[len+]){
  120. ans = max_val[len]+sec_val[len+];
  121. col1 = max_id[len];
  122. col2 = sec_id[len+];
  123. len1 = len , len2 = len+;
  124. }
  125. }
  126. }
  127. }
  128.  
  129. printf("%I64d\n%d\n" , ans , len1+len2);
  130. printf("%d" , vec[col2][].num);
  131. for(int i= ; i<len1 ; i++){
  132. printf(" %d" , vec[col1][i].num);
  133. if(i+<len2) printf(" %d" , vec[col2][i+].num);
  134. }
  135. puts("");
  136. }
  137. return ;
  138. }

CodeForces 159E的更多相关文章

  1. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  4. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  5. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  6. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  7. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  8. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

  9. CodeForces - 148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

随机推荐

  1. taskkill帮助信息

    taskkill帮助信息: C:\Users\xusweeter>taskkill /? TASKKILL [/S system [/U username [/P [password]]]] { ...

  2. APP多渠道打包

    多渠道打包的概念: 打包是指使用证书文件对app签名生成一个apk文件. 多渠道打包指的就是我们的app在开发完成之后需要投放到不同的市场,比如说Google市场.百度市场等,为了统计应用在各个市场的 ...

  3. Ubuntu卸载软件包

    sudo apt-get autoremove --purge mysql-server-5.0 ,purge连同配置文件一起删除,autoremove自动卸载依赖包sudo apt-get remo ...

  4. (五)SpringIoc之Bean的作用域

    此文转自 https://blog.csdn.net/icarus_wang/article/details/51586776# 有状态bean和无状态bean请看 https://blog.csdn ...

  5. mysql解压缩方式安装和彻底删除

    一.安装mysql (1)将下载下来的mysql压缩文件解压缩到需要安装mysql的目录中 (2)打开解压后的文件夹,复制default.ini文件并重命名为my.ini,此文件的相关配置为: (3) ...

  6. javascript之input获取的时间减1秒&&t时间恢复

    将输入得到的时间减少1秒:20:00:00  ———  19:59:59    方法一:普通时间转换 endDateMap(date){ var h = new Date(date).getHours ...

  7. 短视频SDK简单易用——来自RDSDK.COM

    锐动天地为开发者提供短视频编辑.视频直播.特效.录屏.编解码.视频转换,等多种解决方案,涵盖PC.iOS.Android多平台.以市场为导向,不断打磨并创新技术,在稳定性,兼容性,硬件设备效率优化上千 ...

  8. javscript 导出html中的table到excel

    <script language="JavaScript" type="text/javascript"> /* * 默认转换实现函数,如果需要其他 ...

  9. 重构30-Return ASAP(尽快返回)

    该话题实际上是诞生于移除箭头反模式重构之中.在移除箭头时,它被认为是重构产生的副作用.为了消除箭头,你需要尽快地return. ) { orderTotal = sum(products)) { or ...

  10. webpack3.0版本的一些改动

    npm install --save / npm install -S 项目发布上线之后还会依赖用到的插件,没有这些插件,项目不能运行 npm install --save-dev / npm ins ...