题解 【P1097 统计数字】

小卓

2020-08-22 21:46:53

Personal

很简单的一道题:套个快排模板,再做下简单的处理就行了。 看到很多大佬先排序再处理重复的数据,而我的做法是先处理掉重复数据再排序。 ```cpp #include <iostream> #include <map> using namespace std; map<long long,int> stat; long long a[200005]; // 快排模板(不多说) void qsort(long long a[], int left, int right) { if(left < right){ int i = left; int j = right; int x = a[left]; while(i<j) { while(i < j && a[j] > x){ j--; } if(i < j){ a[i++] = a[j]; } while(i < j && a[i] < x){ i++; } if(i < j){ a[j--] = a[i]; } } a[i] = x; qsort(a,left,i - 1); qsort(a,i + 1,right); } } int main(){ int n, rn = 0,df = 0; // rn 用于存放最终被排序的数量 // df 用于存放当前偏差值(循环偏差) cin >> n; for(int i = 1; i <= n; i++){ long long x; cin >> x; // 检查输入的值是否已存在 if(stat[x] == 0){ stat[x] = 1; a[i - df] = x; // 存入数组 // 这里的偏差是我临时想出来的解决方法: // 本循环会读入部分重复的值 // 这些值并不会被存入数组,会导致 a 数组有空间为0 // 增加 diff 后可以规避这种问题 // 出现一次重复就在下一次新存放值时对 i - 1 rn ++; // 统计结果数 }else{ stat[x] ++; // 出现次数 ++ df ++; // 偏差值 ++ } } qsort(a,1,rn); // 调用快排函数 // 输出最终的结果 for(int i = 1; i <= rn; i++){ long long num = a[i]; cout << num << " " << stat[num] << endl; } return 0; } ``` 这种做法可以使重复数据不进入排序程序中,而是直接进行统计