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 |
Re:8个小时,修修改改,终于AC~~纪念一下In Reply To:8个小时,修修改改,终于AC~~纪念一下 Posted by:134115080060 at 2015-01-16 17:23:08 > #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