Atcoder---ID排序模拟结构体
题目描述
In Republic of Atcoder, there are N prefectures, and a total of M cities that belong to those prefectures.
City i is established in year Yi and belongs to Prefecture Pi.
You can assume that there are no multiple cities that are established in the same year.
It is decided to allocate a 12-digit ID number to each city.
If City i is the x-th established city among the cities that belong to Prefecture i, the first six digits of the ID number of City i is Pi, and the last six digits of the ID number is x.
Here, if Pi or x (or both) has less than six digits, zeros are added to the left until it has six digits.
Find the ID numbers for all the cities.
Note that there can be a prefecture with no cities.
Constraints
·1≤N≤105
·1≤M≤105
·1≤Pi≤N
·1≤Yi≤109
·Yi are all different.
·All values in input are integers.
输入
Input is given from Standard Input in the following format:
N M
P1 Y1
:
PM YM
输出
Print the ID numbers for all the cities, in ascending order of indices (City 1, City 2, …).
样例输入
2 3
1 32
2 63
1 12
样例输出
000001000002
000002000001
000001000001
#pragma GCC optimize (2)
#pragma G++ optimize (2)
#include <bits/stdc++.h>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define wuyt main
typedef long long ll;
#define HEAP(...) priority_queue<__VA_ARGS__ >
#define heap(...) priority_queue<__VA_ARGS__,vector<__VA_ARGS__ >,greater<__VA_ARGS__ > >
template<class T> inline T min(T &x,const T &y){return x>y?y:x;}
template<class T> inline T max(T &x,const T &y){return x<y?y:x;}
//#define getchar()(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
//char buf[(1 << 21) + 1], *p1 = buf, *p2 = buf;
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();
if(c == '-')Nig = -1,c = getchar();
while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();
return Nig*x;}
#define read read()
const ll inf = 1e15;
const int maxn = 2e6 + 7;
const int mod = 1e9 + 7;
int num[maxn],n,m;
int father[maxn];
int ans;
/**struct node{
int a,b;
}cnt[maxn];
bool cmp(node x,node y)
{
return ((x.b>y.b)||(x.b==y.b && x.a>y.a));
}
int findfather(int x){
if(father[x]==x) return x;
else return father[x]=findfather(father[x]);
}**/
struct node{
int p,y,num;
}cnt[maxn];
int pnum[maxn],bnum[maxn];
bool cmp(node a,node b){
if(a.p==b.p) return a.y<b.y;
return a.p<b.p;
}
int main()
{
/**int n=read;
int cnt=0;
for(int i=1;i<=n;i++) num[i]=read;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
if(i<j&&num[i]>num[j])
cnt++;
}
cout<<cnt;
int n=read,m=read;
for(int i=1;i<=m;i++)
{
cnt[i].a=read;
cnt[i].b=read;
}
ll ans=0;
sort(cnt+1,cnt+1+m,cmp);
for(int i=1;i<=m;i++)
{
if(cnt[i].a>n) {
ans+=n*cnt[i].b;
break;
}
ans+=cnt[i].a*cnt[i].b;
n-=cnt[i].a;
}
cout<<ans;
n=read,m=read;
for(int i=1;i<=n;i++) father[i]=i;
for(int i=1;i<=m;i++)
{
int x=read,y=read;
int judge1=findfather(x);
int judge2=findfather(y);
if(judge1!=judge2) father[judge2]=judge1;
}
for(int i=1;i<=n;i++){
num[findfather(i)]++;
}
ans=0;
for(int i=1;i<=n;i++)
{
if(ans<num[i]) ans=num[i];
}
cout<<ans;
n=read,m=read;
for(int i=0;i<m;i++)
{
p[i]=read,y[i]=read;
cnt[p[i]].push_back(y[i]);
}
for(int i=0;i<n;i++) {
sort(cnt[i+1].begin(),cnt[i+1].end());
}
for(int i=0;i<m;i++){
printf("%012lld\n",(ll)(p[i])*100000+(int)(lower_bound(cnt[p[i]].begin(),cnt[p[i]].end(),y[i])-cnt[p[i]].begin())+1);
}**/
n=read,m=read;
for(int i=1;i<=m;i++)
{
cnt[i].p=read,cnt[i].y=read;
cnt[i].num=i;
pnum[i]=cnt[i].p;
}
sort(cnt+1,cnt+1+m,cmp);
int tempx=cnt[1].p,tempcnt=1;
for(int i=1;i<=m;i++)
{
if(tempx!=cnt[i].p){
tempx=cnt[i].p;
tempcnt=1;
}
bnum[cnt[i].num]=tempcnt++;
}
for(int i=1;i<=m;i++)
{
printf("%06d%06d\n",pnum[i],bnum[i]);
}
return 0;
}