hdu 5199 map或二分或哈希

题目描述:给出n棵树的高度,每棵树上都站着一只鸟,枪手Jack站在最左边那棵树的左边对鸟进行射击,当Jack在高度为H的地方向右发射一颗子弹的时候,高度为H的树上的鸟儿就会掉落(注:其他树上的鸟儿不会飞走或掉落,这不是脑经急转弯!)。Jack会射击多次,他想知道每次射击会有多少鸟儿掉落下来。

思路:题意十分清晰,思路也很简单,只要实现这种映射关系就行了,数据量比较大。

方法1:map+IO外挂水之

 1 #include <cstdio>
 2 #include <cctype>
 3 #include <map>
 4 using namespace std;
 5 
 6 map<int, int> mp;
 7 int n, m, tmp;
 8 char buffer[10];
 9 
10 void print_d( int x )
11 {
12     if ( x == 0 )
13     {
14         putchar('0');
15     }
16     else
17     {
18         int p = 0;
19         while ( x )
20         {
21             buffer[p++] = x % 10 + '0';            
22             x = x / 10;
23         }
24         for ( int i = p - 1; i >= 0; i-- )
25         {
26             putchar(buffer[i]);
27         }
28     }
29     putchar('\n');
30 }
31 
32 void scan_d( int & x )
33 {
34     char ch = getchar();
35     while ( !isdigit(ch) ) ch = getchar();
36     x = 0;
37     do
38     {
39         x = x * 10 + ch - '0';
40         ch = getchar();
41     } while ( isdigit(ch) );
42 }
43 
44 int main ()
45 {
46     while ( scanf("%d%d", &n, &m) != EOF )
47     {
48         mp.clear();
49         while ( n-- )
50         {
51             scan_d(tmp);
52             mp[tmp]++;
53         }
54         while ( m-- )
55         {
56             scan_d(tmp);
57             print_d(mp[tmp]);
58             mp[tmp] = 0;            
59         }
60     }
61     return 0;
62 }

这样写完全是对的,不过比csc的代码要慢一点,原因如下:

当调用mp[tmp]的时候,如果tmp在map中不存在,则默认会插入一个tmp到0的映射然后返回,所以这样写会让节点数增多,查询效率变低。

证明代码如下:

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <map>
 4 using namespace std;
 5 
 6 int main ()
 7 {
 8     map<int, int> mp;
 9     cout << "mp is empty: " << mp.size() << endl;
10     cout << mp[111] << endl;
11     cout << "The size is: " << mp.size() << endl;
12     cout << mp[222] << endl;
13     cout << "The size is: " << mp.size() << endl;
14     for ( map<int, int>::iterator it = mp.begin(); it != mp.end(); it++ )
15     {
16         cout << it->first << " maps into " << it->second << endl;
17     }
18     system("pause");
19     return 0;
20 }

运行结果如下:

可见确实是这样,因此可以这样写来加快效率:

 1 #include <cstdio>
 2 #include <map>
 3 using namespace std;
 4 
 5 map<int, int> mp;
 6 int n, m, tmp;
 7 
 8 int main ()
 9 {
10     while ( scanf("%d%d", &n, &m) != EOF )
11     {
12         mp.clear();
13         while ( n-- )
14         {
15             scanf("%d", &tmp);
16             mp[tmp]++;
17         }
18         while ( m-- )
19         {
20             scanf("%d", &tmp);
21             if ( mp.count(tmp) )
22             {
23                 printf("%d\n", mp[tmp]);
24                 mp.erase(tmp);
25             }
26             else
27             {
28                 printf("0\n");
29             }
30         }
31     }
32     return 0;
33 }

不过实测差不多,关键可能还是hdu服务器不稳定吧,不过mp[tmp] = 0; 还是没有 mp.erase(tmp); 好,前者删除节点,后者只是修改映射的值,前者配合mp.count(tmp)理论上更胜一筹。

方法2:二分 略...

方法3:hash

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int N = 5000007;
 6 int hash_table[N];
 7 int cnt[N];
 8 int n, m, tmp;
 9 
10 int hash_key( int key )
11 {
12     return key % N;
13 }
14 
15 int kth( int k )
16 {
17     int r = ( k + 1 ) >> 1;
18     if ( k & 1 ) return r * r;
19     return -r * r;    
20 }
21 
22 void insert( int key )
23 {
24     int t = hash_key(key);
25     for ( int i = 0; ; i++ )
26     {
27         int pos = t + kth(i);
28         if ( pos < 0 ) pos += N;
29         if ( pos >= N ) pos -= N;
30         if ( hash_table[pos] == -1 )
31         {
32             hash_table[pos] = key;
33             cnt[pos]++;
34             return ;
35         }
36         else if ( hash_table[pos] == key )
37         {
38             cnt[pos]++;
39             return ;
40         }
41     }
42 }
43 
44 int find( int key )
45 {
46     int t = hash_key(key);
47     for ( int i = 0; ; i++ )
48     {
49         int pos = t + kth(i);
50         if ( pos < 0 ) pos += N;
51         if ( pos >= N ) pos -= N;
52         if ( hash_table[pos] == key )
53         {
54             int r = cnt[pos];
55             cnt[pos] = 0;
56             return r;
57         }
58         else if ( hash_table[pos] == -1 )
59         {
60             return 0;
61         }
62     }
63 }
64 
65 int main ()
66 {
67     while ( scanf("%d%d", &n, &m) != EOF )
68     {
69         memset( hash_table, -1, sizeof(hash_table) );
70         memset( cnt, 0, sizeof(cnt) );        
71         while ( n-- )
72         {
73             scanf("%d", &tmp);
74             insert(tmp);
75         }
76         while ( m-- )
77         {
78             scanf("%d", &tmp);
79             printf("%d\n", find(tmp));
80         }
81     }
82     return 0;
83 }

 

转载于:https://www.cnblogs.com/huoxiayu/p/4393062.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字电路实验怎么接线视频讲解_家庭影院中音箱、功放、投影机、4K播放机不知道怎么连接?手把手教你...

家庭影院中音箱、功放、投影机、4K播放机不知道怎么连接&#xff1f;手把手教你有不少用户收到从家庭影院器材之后&#xff0c;表示完全不会连接。翻看说明书也觉得头大&#xff0c;知识太多&#xff0c;然而却很难找到要点。今天主要跟大家讲讲如何连接音箱、功放、投影机和影…

.NET开发过程中的全文索引使用技巧之Solr

前言&#xff1a;相信许多人都听说过.net开发过程中基于Lucene.net实现的全文索引&#xff0c;而Solr是一个高性能&#xff0c;基于Lucene的全文搜索服务器。同时对其进行了扩展&#xff0c;提供了比Lucene更为丰富的查询语言&#xff0c;同时实现了可配置、可扩展并对查询性能…

auto.js停止所有线程_Java线程与并发编程实践:深入理解volatile和final变量

同步有两种属性&#xff1a;互斥性和可见性。synchronized关键字与两者都有关系。Java同时也提供了一种更弱的、仅仅包含可见性的同步形式&#xff0c;并且只以volatile关键字关联。假设你自己设计了一个停止线程的机制(因为无法使用Thread不安全的stop()方法))。清单1中Thread…

项目实例改编:利用structs2的action 实时显示图片、pdf和其他内容的框架抽取。(转)...

转自&#xff1a;http://www.verydemo.com/demo_c167_i1382.html 针对&#xff1a;预览文件&#xff08;图片&#xff0c;PDF&#xff09;文件来源为action中的inputStream 重点&#xff1a; structs2的action的配置 action的写法和结果类型 resulttype的写法 网页上实…

开始Go开发之旅-Golang架构师之路系列实战

2019独角兽企业重金招聘Python工程师标准>>> 作者: gomaster.me(冯琪超) 系列:Golang架构师之路 巧妇难做无米之炊&#xff0c;golang sdk就是gopher的大米 下载golang 点击 官网下载golang sdk 根据不同系统&#xff0c;官网下载链接会选择相应的平台进行链接跳转&…

安卓9.0官方系统升级包_华为、荣耀公布可升级安卓10.0机型,你的手机在名单之内吗?...

在近两个月以前&#xff0c;美方将华为关进了小黑屋&#xff0c;随后谷歌也将华为旗下的机型移出了安卓10.0升级名单&#xff0c;这一波操作之后&#xff0c;引起了不小的“恐慌”&#xff0c;许多华为用户也在担心是否还能正常使用安卓系统服务&#xff0c;不过&#xff0c;让…

2. Mysql数据库的入门知识

2. Mysql数据库的入门知识 &#xff08;1&#xff09;打开Windows系统提供的服务查看相应的服务。 &#xff08;2&#xff09;在Windows任务管理器的进程中查看 &#xff08;3&#xff09;使用命令行管理windows的Mysql数据库服务。 Net start 服务名 Net stop 服务名 mysql -h…

nginx php-fpm 输出php错误日志(转)

nginx是一个web服务器&#xff0c;因此nginx的access日志只有对访问页面的记录&#xff0c;不会有php 的 error log信息。 nginx把对php的请求发给php-fpm fastcgi进程来处理&#xff0c;默认的php-fpm只会输出php-fpm的错误信息&#xff0c;在php-fpm的errors log里也看不到ph…

win7优化设置_win7蓝牙怎么打开?

当电脑需要连接蓝牙设备的时候&#xff0c;就需要打开蓝牙设置才行。鉴于一些win7的用户还不知道蓝牙功能在哪&#xff0c;win7蓝牙怎么打开&#xff0c;故系统圣地分享本篇教程。1、win7蓝牙怎么打开?首先要你的电脑支持蓝牙功能。如果你的电脑有蓝牙功能的话那么在电脑的右下…

Doxygen从零学起———安装和配置

Doxygen可以为多种语言生成说明文档&#xff08;从程序的源代码中提取其中按照约定格式写的注释中提取信息&#xff09; 例如C, Objective-C, C#, C, PHP, Python, IDL (Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL, Tcl, D ,从这期开始&#xff0c;我将系…

Java中的ClassLoader

Java中类的加载过程&#xff08;如Dog类&#xff09;&#xff1a; 通过类型信息定位Dog.class文件。载入Dog.class文件&#xff0c;创建相应的Class对象。执行父类的静态字段定义时初始化语句和父类的静态初始化块。执行子类的静态字段定义时初始化语句和子类的静态初始化块。当…

excel删除无尽空白行_excel如何批量删除空白行 巧用 ctrl+G 只需1秒 最常用的技巧...

工作中我们使用excel通常都会遇到这种情况&#xff0c;就是表格中有很多多余的空行。我们需要把多余的空行删除。 如果空行只有一两行的话&#xff0c;可以把鼠标放在空白行上&#xff0c;然后点击鼠标右键&#xff0c;在弹出的菜单中选择删除菜单。 在弹出的删除确定窗口中&am…

DevOps的前世今生

2019独角兽企业重金招聘Python工程师标准>>> 目前在国外&#xff0c;互联网巨头如Google、Facebook、Amazon、LinkedIn、Netflix、Airbnb&#xff0c;传统软件公司如Adobe、IBM、Microsoft、SAP等&#xff0c;亦或是网络业务非核心企业如苹果、沃尔玛、索尼影视娱乐…

【转】最牛B的编码套路

最近&#xff0c;我大量阅读了Steve Yegge的文章。其中有一篇叫“Practicing Programming”&#xff08;练习编程&#xff09;&#xff0c;写成于2005年&#xff0c;读后令我惊讶不已&#xff1a; 与你所相信的恰恰相反&#xff0c;单纯地每天埋头于工作并不能算是真正意义上的…

ecshop 广告设置

最近公司准备做个商城&#xff0c;让我从JAVA转过去&#xff0c;好吧&#xff0c;先看下吧&#xff0c;反正也得做。接到手里的是一套已经成型的模板&#xff0c;但是二次开发必须得了解下机制、文件、响应、设置什么的&#xff0c;也是个新手&#xff0c;写点东西给后面更新的…

linux 信号_Linux信号机制

信号就是一条消息&#xff0c;通知进程系统中发生了什么事&#xff0c;每种信号都对应着某种系统事件。一般的底层硬件异常是由内核的异常处理程序处理的&#xff0c;它对用户进程来说是透明的。而信号机制&#xff0c;提供了一种方法通知用户进程发生了这些异常。例如&#xf…

DOxygen for C++使用说明——添加数学公式

公式 Doxygen允许你把 公式显示在最终的输出中&#xff08;这个功能仅限于HTML和输出&#xff09;.为了可以在HTML documentation显示公式&#xff08;转化为图片&#xff09;&#xff0c;你必须安装以下软件&#xff1a; latex: 编译器, 被用来解析公式, 首先提取公式写到一…

Tomcat 的 DefaultServlet

问题描述&#xff1a; 群里有人测试 Spring MVC&#xff0c;没有配置任何Controller&#xff0c;只配置了一个view resolver&#xff0c;指定了前缀后缀。 然后&#xff0c;他问的是 当访问 localhost:8080/test 的时候&#xff0c;为什么会被重定向到 localhost:8080/test/ &a…

spss练习数据_SPSS篇——如何在成千上百万个数据中标识重复个案

本文就带大家来学习一个小技巧&#xff0c;如何运用SPSS标识重复个案。我们都知道在Excel中&#xff0c;通常会用到“筛选”功能来选出指定条件相同的单元格。那么在SPSS中&#xff0c;如何在成千上百万个数据中筛选出重复的个案呢&#xff1f; 小编就是要告诉你&#xff0c;几…

DOxygen for C++使用说明——Markdown支持

自Doxygen 版本1.8.0&#xff0c;Markdown被引进。 接下来&#xff0c;我们将先简单介绍标准的Markdown语法&#xff0c;读者可以进入Markdown官网查询更详细的细节。然后讨论一下Doxygen支持的Markdown扩展&#xff0c;最后讨论一下Doxygen对Markdown标准的实现细节。 Stand…