| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
8个小时,修修改改,终于AC~~纪念一下#include<iostream>
#include<queue>
#include<cmath>
#include<algorithm>
#include<string.h>
using namespace std;
#define maxn 1005
#define INF 0xfffffff
int dir[9][2] = {
{-1,-1},{-1, 0},{-1, 1},
{ 0,-1},{ 0, 0},{ 0, 1},
{ 1,-1},{ 1, 0},{ 1, 1}
};
struct Set
{
int L, R;
int vl, cnt;
}a[maxn];
struct node
{
int vl, cnt;
};
struct SQLine
{
int Up, Down;
};
int FindSet(int L, int R, int e); //查找e在第几个区间
int MaxAbs(int k, int wide, int Len, int n); //与四周相比最大的绝对值
int FindLocation(int L, int R, int wide, int l, int r); //查找与e相等的最右边的位置
node Fill(int k, int wide, int cnt, int Len, int n); //填充
int OK(int x, int y, int wide, int Len); //判断xy坐标是否合法
int main()
{
int wide;
while(cin >> wide)
{
int n=1;
node s;
queue<node> Q;
if(wide == 0)
{
cout << "0" <<endl;
continue;
}
a[0].L = -INF, a[0].R = -1;
while(cin >> a[n].vl >> a[n].cnt, a[n].vl+a[n].cnt)
{
a[n].L = a[n-1].R+1;
a[n].R = a[n-1].R+a[n].cnt;
n++;
}
a[n].L = a[n-1].R+1, a[n].R=INF;
int k=0, End = a[n-1].R;
while(k <= End)
{
int indexK = FindSet(0, n, k);
int Len = FindLocation(k, a[indexK].R, wide, 0, n);
Q.push(Fill(k++, wide, 1, End/wide+1, n));
if(Len - k == 0)
Q.push(Fill(k++, wide, 1, End/wide+1, n));
else if(Len - k > 0)
{
Q.push(Fill(k, wide, Len-k, End/wide+1, n));
Q.push(Fill(Len, wide, 1, End/wide+1, n));
k = Len+1;
}
}
s.cnt = s.vl = 0;
Q.push(s);
s = Q.front();
s.cnt = 0;
cout << wide <<endl;
while(Q.size())
{
node q = Q.front();Q.pop();
if(s.vl == q.vl)
s.cnt += q.cnt;
if(s.vl != q.vl || Q.size() == 0)
{
cout<< s.vl << ' ' << s.cnt <<endl;
s = q;
}
if(Q.size() == 0)
cout << "0 0" <<endl;
}
}
return 0;
}
int FindSet(int L, int R, int e) //查找e在第几个区间
{
while(L<=R)
{
int Mid = (L+R) / 2;
if(e >= a[Mid].L && e <= a[Mid].R)
return Mid;
else if(e < a[Mid].L)
R = Mid-1;
else
L = Mid+1;
}
return 0;
}
int MaxAbs(int k, int wide, int Len, int n) //与四周相比最大的绝对值
{
int i, x = k/wide, y=k%wide;
int MaxNum=0;
int t = FindSet(0, n, k);
for(i=0; i<9; i++)
{
int nx = x+dir[i][0];
int ny = y+dir[i][1];
if(OK(nx, ny, wide, Len))
{
int j = nx * wide + ny;
j = FindSet(0, n, j);
MaxNum = max(MaxNum, abs(a[t].vl - a[j].vl));
}
}
return MaxNum;
}
int OK(int x, int y, int wide, int Len) //判断xy坐标是否合法
{
if(x>=0&&x<Len && y>=0&&y<wide)
return 1;
return 0;
}
int FindLocation(int L, int R, int wide, int l, int r) //查找与e相等的最右边的位置
{
int Mid, up=FindSet(l, r, L-wide), down=FindSet(l, r, L+wide);
int ans = L;
while(L <= R)
{
Mid = (L+R) / 2;
int i=FindSet(l, r, Mid-wide), j=FindSet(l, r, Mid+wide);
if(up == i && down == j)
L = Mid+1, ans=Mid;
else
R = Mid-1;
}
return ans;
}
node Fill(int k, int wide, int cnt, int Len, int n) //填充
{
node s;
s.vl = MaxAbs(k, wide, Len, n);
s.cnt = cnt;
return s;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator