洛谷 P1097 统计数字
离散化详解
这个是可以处理重复元素的离散化方式(所以才可以用来解这道题)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxN = 2e5 + 5;
const int maxM = 1e8 + 1;
int a[maxN], t[maxN];
int disc[maxN];
int num[maxN];
int n;
int main()
{
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i ++ )
{
scanf("%d", &a[i]);
t[i] = a[i];
}
sort(t, t + n);
int len = unique(t, t + n) - t;
for(int i = 0; i < n; i ++ )
{
disc[i] = lower_bound(t, t + len, a[i]) - t;//第一个大于或等于
num[disc[i]] ++;
}
for(int i = 0; i < len; i ++ )//其实0-len就是t[i]离散化后的值了
printf("%d %d\n", t[i], num[i]);
}
return 0;
}
最近发现一个别的写法,差也差不多,不过比以前的好看一些(个人觉得)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
#define char char
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxN = 2e5 + 5;
int n;
int a[maxN];
vector<int>vt;
int num[maxN];
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i ++ )
{
scanf("%d", &a[i]);
vt.push_back(a[i]);
}
sort(vt.begin(), vt.end());
vt.erase(unique(vt.begin(), vt.end()), vt.end());
for(int i = 0; i <n; i ++ )
{
a[i] = lower_bound(vt.begin(), vt.end(), a[i]) - vt.begin();//把初始值离散化到0-n-1的范围内
num[a[i]] ++;//离散化后的值对应的数目
}
int len = vt.size();
for(int i = 0; i < len; i ++ )//这里的i就是离散化后的值,肯定是和去重后排好序的vt是一一对应的
{
printf("%d %d\n", vt[i], num[i]);
}
return 0;
}
下面这个是不处理重复元素的离散化方式(不能用于本题)
int n;
struct node{
int val, id;
node(int a = 0, int b = 0) : val(a), id(b) {}
friend bool operator < (node n1, node n2) { return n1.val < n2.val; }
}a[maxN];
int disc[maxN];
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i ++ )
{
scanf("%d", &a[i].val);
a[i].id = i;
}
sort(a, a + n);
for(int i = 0; i < n; i ++ )
disc[a[i].id] = i;
return 0;
}