PIPI OJ 1334: PIPI计数(unordered_map的应用)
菜鸟生成记(57)
1334: PIPI计数
本以为就是一个简单STL查找的水题,谁曾想被卡卡时间了
cin输入被卡了,map+scanf+printf==AC
map+cin+cout==T;可能数据太大了
map内置数据结构为红黑树查找和储存效率O(logn);
unordered_map内置数据结构为哈希表(散列表);哈希函数选的好的话,散列地址不大量冲突的话,储存效率O(1),也就是常量级;查找应该也是O(1);那这效率就很可观了(这好的数据结构不是蒻羁想到,是我在洛谷上从dalao那问来的)
unordered_map使用是要注意几点(一个不注意程序就崩了)
(1)要加头文件,一种奇怪的写法,暂时不懂
#include <tr1/unordered_map>
using std::tr1::unordered_map;
(2)要写一个哈希函数,用来应对散列地址冲突,哈希函数构造的好,代码效率直接起飞,反之直接蹦;我的函数哈希函数随便写的,居然没蹦?
两个数据结构各有千秋,就这一题而言unordered_map更快
map(AC)
#include<iostream>
#include<algorithm>
#include<map>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int next1[4][2]={1,0,0,1,0,-1,-1,0};
struct st{int x,y;int num;st(){num=0;}
};
class mp{//map排序规则(没这个会报错) public:bool operator()(const st &a,const st &b)const{return (a.x<b.x)||(a.x==b.x&&a.y<b.y)||(false);}
};
/*
4
1 1
0 1
1 0
1 2
*/
int main()
{int n;int x,y;int nx,ny,num=0;st t;st s[N];map<st,int,mp>m;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d",&x,&y);s[i].x=x;s[i].y=y;t.x=x;t.y=y;m.insert(make_pair(t,1));}for(int i=0;i<n;i++){x=s[i].x;y=s[i].y;nx=ny=0;num=0;for(int j=0;j<4;j++){nx=next1[j][0]+x;ny=next1[j][1]+y;t.x=nx;t.y=ny;if(m.find(t)!=m.end()){num++; } }printf("%d\n",num);}return 0;
}
unordered_map(AC)
#include<iostream>
#include<cstdio>
#include<tr1/unordered_map>
using std::tr1::unordered_map;
using namespace std;
const int N=1e+5+10;
int next1[4][2]={1,0,0,1,0,-1,-1,0};
class st{public:int x,y;int num;st(){num=0;}
}s[N];
class hash_v{//哈希函数 public:size_t operator()(const pair<int,int>&p)const{//这是我自己随便写的;//通过函数给key一个值,然后地址储存 return p.first*111+p.second;}
};
struct pair_hash {//哈希函数
//这是百度的,也能用,但是不太理解 template<class t1, class t2>std::size_t operator() (const std::pair<t1, t2>& p) const {return std::tr1::hash<t1>{}(p.first)^std::tr1::hash<t2>{}(p.second);}
};
int read()//输入加速挂
{char ch=' ';int ans=0;while(ch<'0' || ch>'9')ch=getchar();while(ch<='9' && ch>='0'){ans=ans*10+ch-'0';ch=getchar();}return ans;
}
void out(int a)//输出加速挂
{if(a > 9){out(a/10);}putchar(a%10 + '0');
}
/*
4
1 1
0 1
1 0
1 2
*/
int main()
{unordered_map<pair<int,int>,int,hash_v>m;//创建一个对象 int n;int x,y;int nx,ny,num=0;pair<int,int>t;n=read();for(int i=0; i<n; i++) { x=read();y=read();s[i].x=x;s[i].y=y;t.first=x;t.second=y;m.insert(make_pair(t,true));//存入哈希表 }for(int i=0; i<n; i++){x=s[i].x;y=s[i].y;nx=ny=0;num=0;for(int j=0; j<4; j++)//该点的四个方向 {nx=next1[j][0]+x;ny=next1[j][1]+y;t.first=nx;//t为一个点 t.second=ny;if(m.find(t)!=m.end())//散列查找 {num++;}}s[i].num=num;//该点相邻点计数 }for(int i=0; i<n; i++){//输出 //printf输出也行,cout输出会超时 out(s[i].num);printf("\n");}return 0;
}
PIPI OJ 1334: PIPI计数(unordered_map的应用)相关推荐
- PIPI OJ 1118: 继续畅通工程(并查集+最小生成树)
菜鸟生成记(18) 1118: 继续畅通工程 又双叒叕是最短路径的水题;不同的是,在构造最小生成树前,题目中已经规定一些已经建好了(这些边已经在生成树里面了);从未建好的边中选择最优边加入生成树;直到 ...
- [山东科技大学OJ]1334 Problem D: 动态的字符串排序
Time Limit: 5 Sec Memory Limit: 128 MB Submit: 11171 Solved: 3405 [Submit][Status] Description 把字符 ...
- [unknown OJ] ZZH与计数
一.题目 点此看题 二.解法 这题我一开始是想的设 d p [ i ] dp[i] dp[i] 为数 i i i 有多少个的期望,然后跑矩阵乘法可以做到 O ( 2 3 n log m ) O(2 ...
- PIPI的逃跑路线Ⅳ
题目描述 获得阎魔刀的PIPI终于得到了"抛瓦",是时候向POPO决一死战复仇了. 已知PIPI初始为X点HP值,而POPO初始为Y点HP值,双方血条无上限.PIPI决定在n回合内 ...
- Java基础学习总结(10)——static关键字
2019独角兽企业重金招聘Python工程师标准>>> 一.static关键字 原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态 ...
- java基础提升篇:Static关键字
Static变量 static关键字 在类中用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时初始化,对于该类的所有对象来说,static成员变量只有一份. 可以通过引用或 ...
- JAVA API个各种方法
熟练掌握常用类及方法 String str1.startsWith(str2) 判断str1是否以str2开头,返回true或false str1.endsWith(str2) 判断str1是否以st ...
- 【java基础】java关键字总结及详解
Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量.Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能 ...
- vim技巧总结-查找
2019独角兽企业重金招聘Python工程师标准>>> vim技巧总结-查找1.查找命令 1.1 执行一次查找 普通模式下,/会调用查找提示符,如果vim扫描到文档尾部仍没有找到目标 ...
最新文章
- c# ArrayList
- 动态追踪技术思想及应用
- Kaggel实战:识别手写体[knn改进算法]
- iOS手势之pinch
- 不再有神的概念,将所有存在称之为文明,这很有意思
- bzoj1715[Usaco2006 Dec]Wormholes 虫洞
- JAVA-重写equalse规范、技巧
- [leetcode]Pascal#39;s Triangle II
- java登录界面命令_Java命令行界面(第15部分):Jargo
- SpringBoot 使用AOP功能
- android循环请求数据,android – Camera2 ImageReader冻结重复捕获请求
- 使用 ReSharper对.NET解决方案进行全面重构
- 在计算机中 ascii码是几位二进制编码,ASCII码采用多少位二进制编码
- 【html和css入门】实现简单的页首导航
- k2p拆机ttl刷breed_最新k2p 22.10.3.42;22.10.3.38和k2 22.6.532.231拆机ttl刷breed图文教程
- vs2010英文版变中文版
- 用.NET设计一个假装黑客的屏幕保护程序
- 面试一个应届生,从不起眼到令人刮目相看
- 【NLP】⚠️学不会打我! 半小时学会基本操作 8⚠️ 新闻分类
- 什么是大数据?大数据的特点?