/*结构体数组,属性包括顺序,城市,年份,后六位,输入时存下顺序,
然后结构体多关键字排序,
遍历结构体数组,前后年份一致则后六位= cnt++;
不一致则cnt= 1,后六位 = cnt ++;
最后按照输入顺序排序,再遍历输出
以上为蒟蒻(我的)做法
***********************
进阶流程如下
结构体数组a[N]按照年份从小到大排序
遍历结构体数组,哈希思想:后六位 = hash[a[N].year]++;
简单,细节少
最后同样的输出手法
**********************
套路及使用场景
1、输入顺序储存
const int N = 1e6;
struct city{
int <数据>,No;
}a[N];
bool cmp(city x,city b){
return x.No < y.No;
}
for(int i = 1;i <= n;i++){
cin >> a[i].<数据>
a[i].No = i;
}
…………
sort(a+1,a + 1 + n,cmp);
for(int i = 1;i <= n;i++){
cout << a[i].<……>;
}
return 0;
场景是输入的数据明显需要排序求解,但输出要按原顺序
2、哈希表
for(int i = 1;i <= n;i++){
a[i].<1> = hash[a[i].<2>]++;
}
关于这个哈希的套路,暂时归结不出什么前提条件,留待与其他哈希题比较
*/
完整ac代码
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 1e6;
struct M{
int Year,City,No,yz;
}a[N];
bool cmp01(M x,M y){
return x.Year < y.Year;
}
bool cmp02(M x,M y){
return x.No < y.No;
}
int cnt[N];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++){
scanf("%d%d",&a[i].City,&a[i].Year);
a[i].No = i;
}
sort(a+1,a+m+1,cmp01);
for(int i = 1;i <= m;i++){
a[i].yz = ++cnt[a[i].City];
}
sort(a+1,a+m+1,cmp02);
for(int i = 1;i <= m;i++){
printf("%06d%06d\n",a[i].City,a[i].yz);
}
return 0;
}