UVA - 11991Easy Problem from Rujia Liu?(map+vector)

Easy Problem from Rujia Liu?

Though Rujia Liu usually sets hard problems for contests (for example, regional contests like
Xi’an 2006, Beijing 2007 and Wuhan 2009, or UVa OJ contests like Rujia Liu’s Presents 1
and 2), he occasionally sets easy problem (for example, ‘the Coco-Cola Store’ in UVa OJ),
to encourage more people to solve his problems ?

Given an array, your task is to find the k-th occurrence (from left to right) of an integer v. To make the problem more difficult (and interesting!), you’ll have to answer m such queries.
Input There are several test cases. The first line of each test case contains two integers n, m (1 ≤ n,m ≤ 100,000), the number of elements in the array, and the number of queries. The next line contains n positive integers not larger than 1,000,000. Each of the following m lines contains two integer k and v (1 ≤ k ≤ n, 1 ≤ v ≤ 1,000,000). The input is terminated by end-of-file (EOF).

Output
For each query, print the 1-based location of the occurrence. If there is no such element, output ‘0’ instead.

Sample Input
8 4 1 3 2 2 4 3 2 1 1 3 2 4 3 2 4 2
Sample Output
2 0 7 0

这个题一看起来感觉很简单写个数组一下子就写完了。
代码:

#include<iostream>
#define MAXSIZE 1000000
using namespace std;
typedef long long ll;
ll a[MAXSIZE];
int main()
{
	int n,m;
	while(cin>>n>>m)
	{
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		for(int i=0;i<m;i++){
			bool flag=true;
			int x,y;
			int num=1;
			cin>>x>>y;
			for(int i=1;i<=n;i++){//时间复杂度O(n)
				if(y==a[i]){
					if(num==x){
						cout<<i<<endl;
						flag=false;
						break;
					}
					num++;
				}
			}
			if(flag==true){
				cout<<"O"<<endl;
			}
		}
	}
} 

但是提交后tle了,然后看了刘汝佳大佬的思路,不经感概到大佬的脑回路就是牛皮,上面代码主要的原因就是时间复杂度O(n)太高了,而n还是指数级别的,不tle才怪了,然后更新后的代码是这样的:

#include<iostream>
#include<map>
#include<vector>
using namespace std;
map<int,vector<int> >t;
int main()
{
	int n,m,x,y;
	while(cin>>n>>m)
	{
		t.clear();
		for(int i=1;i<=n;i++){
			cin>>x;
			if(!t.count(x))t[x]=vector<int>();
			t[x].push_back(i);
		}
		for(int i=0;i<m;i++){
			cin>>x>>y;
			if(t[y].size()>=x){
				cout<<t[y][x-1]<<endl;
			}else{
				cout<<"0"<<endl;
			}
		}
	}
}

太强了,短短26行将map和vector的作用用的淋漓尽致,将查找元素的时间复杂度减少到O(logn)总时间复杂度O(nlogn),而且由于map的键值是数组方式的,取元素的时间复杂度是O(1),太强了比我之前的代码不知道强到哪里去了,思路也很清晰,考虑问题还是要把复杂度考虑上来,程序才能高效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值