题意:

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

思路:

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

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

multiset

/* **********************************************
Author : kuangbin
Created Time: 2013/8/13 18:25:38
File Name : F:\2013ACM练习\2013多校7\1001.cpp
*********************************************** */
//4640MS    14972K
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
int a[60010][10];
multiset<int>mst[1<<5]; int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int q,k;
while(scanf("%d%d",&q,&k)==2)
{
for(int i = 0;i < (1<<k);i++)
mst[i].clear();
int od,x;
for(int i = 1;i <= q;i++)
{
scanf("%d",&od);
if(od == 0)
{
for(int j = 0;j < k;j++)
scanf("%d",&a[i][j]);
for(int j = 0; j < (1<<k); j++)
{//计算当前点在每种情况下的"疑似绝对值"
int s = 0;
for(int t = 0; t < k;t++)
if(j & (1<<t))
s += a[i][t];
else s -= a[i][t];
mst[j].insert(s);//插入到该种情况下
}
}
else
{
scanf("%d",&x);
for(int j = 0; j < (1<<k); j++)
{//一次操作,插入或删除一个点,都是将这个点对应的所有状态插入每种状态中
int s = 0;//因此,要清除一次操作,就要删除所有状态中的那一个
for(int t = 0; t < k;t++)
if(j & (1<<t))
s += a[x][t];
else s -= a[x][t];
multiset<int>::iterator it = mst[j].find(s);
mst[j].erase(it);
}
}
int ans = 0;
for(int j = 0; j < (1<<k);j++)
{
multiset<int>::iterator it = mst[j].end();
it--;
int t1 = (*it);
it = mst[j].begin();
int t2 = (*it);//用于作差
ans = max(ans,t1-t2);//保留最大值
}
printf("%d\n",ans);
}
}
return 0;
}

map

//8359MS	37928K慢死了

#include <cstdio>
#include <algorithm>
#include <map>
using namespace std; int a[60010][6];
map<int, int> mp[1<<5]; int main()
{
int q,k;
while(scanf("%d %d",&q,&k)==2)
{
for(int i=0;i<1<<k;i++)
mp[i].clear();
int od, x;
for(int i=1;i<=q;i++)
{
scanf("%d",&od);
if(!od)
{
for(int j=0;j<k;j++)
scanf("%d",a[i]+j);
for(int s=0;s<1<<k;s++)
{
int t = 0;
for(int j=0;j<k;j++)
{
if(s & (1<<j)) t += a[i][j];
else t -= a[i][j];
}
mp[s][t]++;
// printf("map[s][t] = %d\n",mp[s][t]);
}
}
else
{
scanf("%d",&x);
for(int s=0;s<1<<k;s++)
{
int t = 0;
for(int j=0;j<k;j++)
{
if(s & (1<<j)) t += a[x][j];
else t -= a[x][j];
}
map<int, int>::iterator it = mp[s].find(t);
mp[s][t]--;
}
}
int ans = 0;
for(int s=0;s<(1<<k);s++)
{
map<int, int>::iterator it = mp[s].end();
it--;
while(it->second==0) it--;
int mx = it->first;///first~~~
it = mp[s].begin();
while(it->second==0) it++;
int mi = it->first;
ans = max(ans, mx - mi);
// printf("mx = %d, mi = %d\n",mx,mi);
}
printf("%d\n",ans);
}
}
}

priority_queue

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

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

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

//2218MS	36748K
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std; int a[6];
bool vis[60005];
typedef struct ascending_node
{
int id,t;
bool operator<(const ascending_node& a) const
{
return t > a.t;
}
}anode;
typedef struct descending_node
{
int id,t;
bool operator<(const descending_node& a) const
{
return t < a.t;
}
}dnode;
/* 2812MS 30224K
priority_queue<anode> apq[1<<5];
priority_queue<dnode> dpq[1<<5];
int main()
{
int q,k;
while(scanf("%d %d",&q,&k)==2)
{
for(int i=0;i<1<<k;i++)
{
while(!apq[i].empty()) apq[i].pop();
while(!dpq[i].empty()) dpq[i].pop();
}*/
/**/
int main()
{
int q,k;
while(scanf("%d %d",&q,&k)==2)
{
priority_queue<anode> apq[1<<5];
priority_queue<dnode> dpq[1<<5];/**/
anode t1;
dnode t2;
memset(vis,false,sizeof(vis));
int od, x;
for(int i=1;i<=q;i++)
{
scanf("%d",&od);
if(!od)
{
for(int j=0;j<k;j++)
scanf("%d",a+j);
for(int s=0;s<1<<k;s++)
{
int t = 0;
for(int j=0;j<k;j++)
{
if(s & (1<<j)) t += a[j];
else t -= a[j];
}
t1.t = t2.t = t;
t1.id = t2.id = i;
apq[s].push(t1);
dpq[s].push(t2);
// printf("map[s][t] = %d\n",mp[s][t]);
}
}
else
{
scanf("%d",&x);
vis[x] = true;
}
int ans = 0;
for(int s=0;s<(1<<k);s++)
{
while(1)
{
t1 = apq[s].top();
if(!vis[t1.id]) break;
apq[s].pop();
}
while(1)
{
t2 = dpq[s].top();
if(!vis[t2.id]) break;
dpq[s].pop();
}
ans = max(ans, t2.t-t1.t);
}
printf("%d\n",ans);
}
}
}

[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. VS2013 快捷键 VS RESHARPER 设置

    一直用Resharper插件,最近发现Ctrl+E,C快捷见被Resharper的快捷功能吞掉了,折腾了几小时终于找到解决方法了,特记分享之. 采用如下步骤可以让快捷键回到vs2012的默认方式,同时 ...

  2. 有关std::map和std::vector的使用

    先说map吧. 最需要注意的就是:用下标访问map中的元素时,与使用下标访问vector的行为截然不同! 用下标访问不存在的元素时,将导致在map容器中添加一个新的元素,它的键即为该下标! 然而很多时 ...

  3. 解决open-vm-tools安装时Failed to get unit file state for run-vmblockx2dfuse.mount

    不知道什么原因,在kali rolling安装open-vm-tools时报以下错误: Failed to get unit file state for run-vmblockx2dfuse.mou ...

  4. 工作日志2014-06-10(实现C语言解析XML获得查询关键字)

    #include "GetInfo.h" ]; int GetInfoToWrite(char* path, char* domain,Write_t* pwrite); int ...

  5. SVN权限配置

    初始化SVN仓库后,里面有以下文件. 其中conf是对授权.认证进行管理的,conf目录里的内容有: passwd设立账户密码: authz权限管理: 假设pwd里有user1,user2两个账户 @ ...

  6. 一些特殊css

    属性 描述            outline  (轮廓)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用. outline:#00FF00 dotted thick; 可以按顺序 ...

  7. SSD的来由与优势

           SSD,对于很多人来说,它现在已不再是个很陌生的名词,有些网友谐趣的把它称作“湿湿的”,这里既有谐音的意味,也有称赞SSD意思.虽然大家对SSD已不算陌生,但恐怕对SSD的历史也所知不多 ...

  8. delphi datasnap 心跳包

    为了能让我们的服务程序更加稳定,有些细节问题必须解决.就如上一讲中提到的客户端拔掉网线,造成服务器上TCP变成死连接,如果死连接数量过多,对服务器能长期稳定运行是一个巨大的威胁.另外,经过测试,如果服 ...

  9. rsyslogd: error during parsing file /etc/rsyslog.conf, on or before line 55: warnings occured in fil

    zjtest7-frontend:/root# rsyslogd -n rsyslogd: error during parsing file /etc/rsyslog.conf, on or bef ...

  10. chrome extensions

        chrome web store   AppsGamesExtensionsThemes   CATEGORIES   All FEATURESClear   Runs Offline By ...