题意:

许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果.

思路:

用"疑似绝对值"的思想, 维护每种状态下各点的计算值, 插入或删除一个点就更新一次每种状态(用 multiset 或 map 或 priority_queue 实现), 每次求ans时扫一遍最大差值即可.

为了练习STL, 每一个都实现一次.

multiset

  1. /* **********************************************
  2. Author : kuangbin
  3. Created Time: 2013/8/13 18:25:38
  4. File Name : F:\2013ACM练习\2013多校7\1001.cpp
  5. *********************************************** */
  6. //4640MS    14972K
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <set>
  10. using namespace std;
  11. int a[60010][10];
  12. multiset<int>mst[1<<5];
  13.  
  14. int main()
  15. {
  16. //freopen("in.txt","r",stdin);
  17. //freopen("out.txt","w",stdout);
  18. int q,k;
  19. while(scanf("%d%d",&q,&k)==2)
  20. {
  21. for(int i = 0;i < (1<<k);i++)
  22. mst[i].clear();
  23. int od,x;
  24. for(int i = 1;i <= q;i++)
  25. {
  26. scanf("%d",&od);
  27. if(od == 0)
  28. {
  29. for(int j = 0;j < k;j++)
  30. scanf("%d",&a[i][j]);
  31. for(int j = 0; j < (1<<k); j++)
  32. {//计算当前点在每种情况下的"疑似绝对值"
  33. int s = 0;
  34. for(int t = 0; t < k;t++)
  35. if(j & (1<<t))
  36. s += a[i][t];
  37. else s -= a[i][t];
  38. mst[j].insert(s);//插入到该种情况下
  39. }
  40. }
  41. else
  42. {
  43. scanf("%d",&x);
  44. for(int j = 0; j < (1<<k); j++)
  45. {//一次操作,插入或删除一个点,都是将这个点对应的所有状态插入每种状态中
  46. int s = 0;//因此,要清除一次操作,就要删除所有状态中的那一个
  47. for(int t = 0; t < k;t++)
  48. if(j & (1<<t))
  49. s += a[x][t];
  50. else s -= a[x][t];
  51. multiset<int>::iterator it = mst[j].find(s);
  52. mst[j].erase(it);
  53. }
  54. }
  55. int ans = 0;
  56. for(int j = 0; j < (1<<k);j++)
  57. {
  58. multiset<int>::iterator it = mst[j].end();
  59. it--;
  60. int t1 = (*it);
  61. it = mst[j].begin();
  62. int t2 = (*it);//用于作差
  63. ans = max(ans,t1-t2);//保留最大值
  64. }
  65. printf("%d\n",ans);
  66. }
  67. }
  68. return 0;
  69. }

map

  1. //8359MS 37928K慢死了
  2.  
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <map>
  6. using namespace std;
  7.  
  8. int a[60010][6];
  9. map<int, int> mp[1<<5];
  10.  
  11. int main()
  12. {
  13. int q,k;
  14. while(scanf("%d %d",&q,&k)==2)
  15. {
  16. for(int i=0;i<1<<k;i++)
  17. mp[i].clear();
  18. int od, x;
  19. for(int i=1;i<=q;i++)
  20. {
  21. scanf("%d",&od);
  22. if(!od)
  23. {
  24. for(int j=0;j<k;j++)
  25. scanf("%d",a[i]+j);
  26. for(int s=0;s<1<<k;s++)
  27. {
  28. int t = 0;
  29. for(int j=0;j<k;j++)
  30. {
  31. if(s & (1<<j)) t += a[i][j];
  32. else t -= a[i][j];
  33. }
  34. mp[s][t]++;
  35. // printf("map[s][t] = %d\n",mp[s][t]);
  36. }
  37. }
  38. else
  39. {
  40. scanf("%d",&x);
  41. for(int s=0;s<1<<k;s++)
  42. {
  43. int t = 0;
  44. for(int j=0;j<k;j++)
  45. {
  46. if(s & (1<<j)) t += a[x][j];
  47. else t -= a[x][j];
  48. }
  49. map<int, int>::iterator it = mp[s].find(t);
  50. mp[s][t]--;
  51. }
  52. }
  53. int ans = 0;
  54. for(int s=0;s<(1<<k);s++)
  55. {
  56. map<int, int>::iterator it = mp[s].end();
  57. it--;
  58. while(it->second==0) it--;
  59. int mx = it->first;///first~~~
  60. it = mp[s].begin();
  61. while(it->second==0) it++;
  62. int mi = it->first;
  63. ans = max(ans, mx - mi);
  64. // printf("mx = %d, mi = %d\n",mx,mi);
  65. }
  66. printf("%d\n",ans);
  67. }
  68. }
  69. }

priority_queue

优先队列只能返回队首元素,因此需要两个队列分别求最大最小值.

对于已删除的元素, 无法直接删除, 可以做标记, 碰到已删除的元素时直接pop掉就行了.

因此入队的就不能仅仅是一个值(前两个有find功能, 不需要额外标号), 而应该是一个记录key和value的结构体.

  1. //2218MS 36748K
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7.  
  8. int a[6];
  9. bool vis[60005];
  10. typedef struct ascending_node
  11. {
  12. int id,t;
  13. bool operator<(const ascending_node& a) const
  14. {
  15. return t > a.t;
  16. }
  17. }anode;
  18. typedef struct descending_node
  19. {
  20. int id,t;
  21. bool operator<(const descending_node& a) const
  22. {
  23. return t < a.t;
  24. }
  25. }dnode;
  26. /* 2812MS 30224K
  27. priority_queue<anode> apq[1<<5];
  28. priority_queue<dnode> dpq[1<<5];
  29. int main()
  30. {
  31. int q,k;
  32. while(scanf("%d %d",&q,&k)==2)
  33. {
  34. for(int i=0;i<1<<k;i++)
  35. {
  36. while(!apq[i].empty()) apq[i].pop();
  37. while(!dpq[i].empty()) dpq[i].pop();
  38. }*/
  39. /**/
  40. int main()
  41. {
  42. int q,k;
  43. while(scanf("%d %d",&q,&k)==2)
  44. {
  45. priority_queue<anode> apq[1<<5];
  46. priority_queue<dnode> dpq[1<<5];/**/
  47. anode t1;
  48. dnode t2;
  49. memset(vis,false,sizeof(vis));
  50. int od, x;
  51. for(int i=1;i<=q;i++)
  52. {
  53. scanf("%d",&od);
  54. if(!od)
  55. {
  56. for(int j=0;j<k;j++)
  57. scanf("%d",a+j);
  58. for(int s=0;s<1<<k;s++)
  59. {
  60. int t = 0;
  61. for(int j=0;j<k;j++)
  62. {
  63. if(s & (1<<j)) t += a[j];
  64. else t -= a[j];
  65. }
  66. t1.t = t2.t = t;
  67. t1.id = t2.id = i;
  68. apq[s].push(t1);
  69. dpq[s].push(t2);
  70. // printf("map[s][t] = %d\n",mp[s][t]);
  71. }
  72. }
  73. else
  74. {
  75. scanf("%d",&x);
  76. vis[x] = true;
  77. }
  78. int ans = 0;
  79. for(int s=0;s<(1<<k);s++)
  80. {
  81. while(1)
  82. {
  83. t1 = apq[s].top();
  84. if(!vis[t1.id]) break;
  85. apq[s].pop();
  86. }
  87. while(1)
  88. {
  89. t2 = dpq[s].top();
  90. if(!vis[t2.id]) break;
  91. dpq[s].pop();
  92. }
  93. ans = max(ans, t2.t-t1.t);
  94. }
  95. printf("%d\n",ans);
  96. }
  97. }
  98. }

[HDU 4666]Hyperspace[最远曼哈顿距离][STL]的更多相关文章

  1. hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  2. HDU 4666 最远曼哈顿距离

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4666 关于最远曼哈顿距离的介绍: http://blog.csdn.net/taozifish/ar ...

  3. poj 2926:Requirements(最远曼哈顿距离,入门题)

    Requirements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3908   Accepted: 1318 Desc ...

  4. HDU 4666 Hyperspace (最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  5. HDU 4666 Hyperspace (2013多校7 1001题 最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  6. 多校联赛7 1001 hdu 4666(最远哈曼顿距离+优先队列)

    吐个糟,尼玛今天被虐成狗了,一题都没搞出来,这题搞了N久居然还是搞不出来,一直TLE,最后还是参考别人代码才领悟的,思路就这么简单, 就是不会转弯,看着模板却不会改,艹,真怀疑自己是不是个笨蛋题意:求 ...

  7. 2018 Multi-University Training Contest 10 CSGO(HDU - 6435)(最远曼哈顿距离)

    有 n 种主武器,m 种副武器.每种武器有一个基础分数k种属性值 X[i] . 选出一种主武器 mw 和一种副武器 sw,使得两种武器的分数和 + 每个属性的差值尽量大.(参考下面的式子) 多维的最远 ...

  8. POJ-2926 Requirements 最远曼哈顿距离

    题目链接:http://poj.org/problem?id=2926 题意:求5维空间的点集中的最远曼哈顿距离.. 降维处理,推荐2009武森<浅谈信息学竞赛中的“0”和“1”>以及&l ...

  9. Codeforces 491B. New York Hotel 最远曼哈顿距离

    最远曼哈顿距离有两个性质: 1: 对每一个点(x,y)  分别计算  +x+y , -x+y , x-y , -x-y 然后统计每种组合的最大值就能够了, 不会对结果产生影响 2: 去掉绝对值 , 设 ...

随机推荐

  1. 利用CSS3特性巧妙实现漂亮的DIV箭头

    DIV箭头用于表现DIV内容的指向,是使用非常普遍的一种表现形式,例如新浪微博的消息转发: 还有傲游网站的导航条: 像傲游账户上方这种箭头更需要多幅图片以表现箭头和hover的效果. 传统的实现方式都 ...

  2. IIS发布问题-用户 'IIS APPPOOL\DefaultAppPool' 登录失败

    今天新建了一个ASP.NET(Language=C#)网站,配置好数据库后编写了几行代码测试数据库的是否能正常使用. 当运行程序时,第一个页面都没有打开就出现了错误(因为我首页就访问数据库,填充一些D ...

  3. powerdesigner反向MySQL5.1数据库 生成ER图

    我用的powerdesigner是15.1版本,数据库是MySQL5.1.57 (1)首先新建一个“PhysicalDataModel”类型的文件,然后点击“Database”->"C ...

  4. html5 meta标签

     <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-sca ...

  5. 小技巧-Try Catch

    与多线程,业务逻辑等比较复杂的功能打交道时,免不了对部分有可能产生不可预期的代码进行异常捕获. 这种异常可能不处理,比如: try { } catch {} 但是如果一旦发生异常,在程序调试的时候,发 ...

  6. ROS开发文档

    http://docs.ros.org/indigo/api/roscpp/html/classros_1_1NodeHandle.html#af0bf7baa0ab2385275bb657cc358 ...

  7. Cglib学习站点(转)

    1.CGlib简单介绍,访问地址:http://www.blogjava.net/stone2083/archive/2008/03/16 /186615.html,从简单的示例到不同业务场景的变化, ...

  8. 关于Scrapy框架的安装

    Scrapy介绍与环境安装 Scrapy介绍与环境安装 What is scrapy? An open source and collaborative framework for extractin ...

  9. Delphi 2010下载+完美破解

    点击链接进入http://altd.embarcadero.com/download/RADStudio2010/delphicbuilder_2010_3615_win.isoRAD Studio/ ...

  10. ViewPager不能高度自适应?height=wrap_content 无效解决办法

    ViewPager用的很多,主要用啦展示广告条.可是高度却不能自适应内容,总是会占满全屏,即使设置android:height="wrap_content"也是没有用的.. 解决办 ...