编号 - NYOJ
/*结构体数组,属性包括顺序,城市,年份,后六位,输入时存下顺序,
然后结构体多关键字排序,
遍历结构体数组,前后年份一致则后六位= 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; }