http://poj.org/problem?id=1009
一晚上的美好时光就做这个题了。。
#include<iostream>
#include<stdio.h>
#define Debug 0
using namespace std;
struct Node{
int num;
int x;
};
int a,b;
int rp=0;
int sp=0;
Node s[1010];
Node re[10000];
int Num(int x,int y){
int sign=0;
int w=x*b+y;
int r=0,t;
for(int i=0;i<sp-1;i++){
r=s[i+1].x;
if(r>w){
sign=1;
t=s[i].num;
break;
}
}
if(sign==0){
t=s[sp-1].num;
}
return t;
}
int GetNum(int x,int y){
int t=Num(x,y);
int r=0;
int guo;
for(int i=x-1;i<=x+1;i++){
for(int j=y-1;j<=y+1;j++){
if(i==x && j==y) continue;
if(i>=a || i<0 || j>=b || j<0) continue;
int g=Num(i,j);
if(t>g) guo=t-g;
else guo=g-t;
if(guo>r) r=guo;
}
}
return r;
}
void Insert(int wei,int number){
int sign=0;
for(int i=rp-1;i>=0;i--){
if(re[i].x==wei) return;
if(re[i].x<wei){
rp++;
for(int j=rp-1;j>i+1;j--){
re[j].num=re[j-1].num;
re[j].x=re[j-1].x;
}
re[i+1].num=number;
re[i+1].x=wei;
sign=1;
break;
}
}
if(sign==0){
rp++;
for(int j=rp-1;j>0;j--){
re[j].num=re[j-1].num;
re[j].x=re[j-1].x;
}
re[0].num=number;
re[0].x=wei;
}
}
void Pushre(int i){
int weizhi=s[i].x;
int aa=weizhi/b;
int bb=weizhi%b;
for(int j=aa-1;j<=aa+1;j++){
for(int k=bb-1;k<=bb+1;k++){
if(j>=a || j<0 || k>=b || k<0) continue;
int abc=GetNum(j,k);
Insert(j*b+k,abc);
}
}
}
void Print(){
cout<<b<<endl;
int num=re[0].num;
int sum=1;
for(int i=1;i<rp;i++){
if(re[i].num==num){
sum+=re[i].x-re[i-1].x;
}
else{
sum+=re[i].x-re[i-1].x-1;
cout<<num<<' '<<sum<<endl;
sum=1;
num=re[i].num;
}
}
sum+=a*b-re[rp-1].x-1;
cout<<num<<' '<<sum<<endl;
cout<<"0 0"<<endl;
}
int main()
{
while(cin>>b){
sp=0;
rp=0;
if(b==0) break;
int x,y,sum=0;
int ii=0;
while(cin>>x>>y){
if(x==0 && y==0) break;
s[ii].num=x;
s[ii].x=sum;
ii++;
sum+=y;
sp++;
}
a=sum/b;
s[ii].num=s[ii-1].num;
s[ii].x=a*b-1;
ii++;
sp++;
for(int i=0;i<sp;i++){
int xa=s[i].x/b;
if(xa+1<a)
Insert((xa+1)*b,GetNum(xa+1,0));
if(xa+2<a)
Insert((xa+2)*b,GetNum(xa+2,0));
}
for(int i=0;i<ii;i++){
Pushre(i);
}
if(Debug){
for(int i=0;i<sp;i++){
cout<<s[i].x<<' '<<s[i].num<<endl;
cout<<endl;
}
for(int i=0;i<rp;i++){
cout<<re[i].x<<' '<<re[i].num<<endl;
}
}
Print();
for(int i=0;i<sp;i++){
s[i].num=0;
s[i].x=0;
}
for(int i=0;i<rp;i++){
re[i].num=0;
re[i].x=0;
}
}
cout<<'0'<<endl;
return 0;
}