Source Code
Problem: 1009 | User: cug_fish2008 | |
Memory: 288K | Time: 16MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <iostream> #include <list> #include <vector> #include <math.h> using namespace std; int width; int current,cnum,n; struct Image{int pixel,num;}; struct wp{int end,pixel;}; Image ig[1009]; int u; list<vector<wp>> ls; vector<wp> row,row1,row2,row3; void pushrow(); void cmprow(); int main() { scanf("%d",&width); while(width!=0){ n=-1; int pixel,num; scanf("%d%d",&pixel,&num); while(pixel!=0 || num!=0){ ig[++n].pixel=pixel; ig[n].num=num; scanf("%d%d",&pixel,&num); } cout<<width<<endl; current=-1;u=0; ls.clear();row.clear(); row1.clear();row2.clear();row3.clear(); bool bg=true; while(bg){ if(ig[u].num/width<3){ if(ls.empty()){ pushrow(); ls.push_back(row); ls.push_back(row); row.clear(); } if(ig[n].num<=0){ list<vector<wp>>::iterator i= ls.begin(); i++; ls.push_back(*i); bg=false; } else { pushrow(); ls.push_back(row); row.clear(); } list<vector<wp>>::iterator i=ls.begin(); row1=*i;i++; row2=*i;i++; row3=*i; cmprow(); ls.pop_front(); } else { if(ls.empty()){ if(current+1==0){current=0;cnum=0;} cnum+=(ig[u].num/width-1)*width; ig[u].num=width+ig[u].num%width; } else { pushrow(); list<vector<wp>>::iterator i= ls.begin(); row1=*i;i++; row2=*i; row3=row; row.clear(); ls.clear(); cmprow(); if(current!=0){ cout<<current<<" " <<cnum<<endl; current=0;cnum=0; } cnum+=(ig[u].num/width)*width; ig[u].num=width+ig[u].num%width; } } } cout<<current<<" "<<cnum<<endl; cout<<"0 0"<<endl; scanf("%d",&width); } cout<<"0"; return 0; } void pushrow() { int i=0; wp p; while(1){ if(ig[u].num<=0)u++; if(ig[u].num>=width-i){ p.end=width; p.pixel=ig[u].pixel; ig[u].num-=(width-i); row.push_back(p); break; } p.end=i+ig[u].num; p.pixel=ig[u].pixel; i=p.end; row.push_back(p); ig[u].num=0; } } int fb(int x,int y){return int(fabs(float(x-y)));} void output(int sub) { if(sub!=current){ if(current+1!=0) cout<<current<<" "<<cnum<<endl; current=sub;cnum=0; } } void cmprow() { vector<wp>::iterator wp1=row1.begin(); vector<wp>::iterator wp2=row2.begin(); vector<wp>::iterator wp3=row3.begin(); int a1,a2,a3,b1,b2,b3; int currentsub,c,ssub,fsub,s,f; s=1;a1=(*wp1).pixel;a2=(*wp2).pixel;a3=(*wp3).pixel; while(1){ if(s>width)break; c=(*wp2).pixel; currentsub=max(fb(c,(*wp1).pixel),fb(c,(*wp3).pixel)); ssub=max(currentsub,max(fb(c,a1),max(fb(c,a2),fb(c,a3)))); f=width+1; if((*wp1).end<f)f=(*wp1).end; if((*wp2).end<f)f=(*wp2).end; if((*wp3).end<f)f=(*wp3).end; a1=b1=(*wp1).pixel;a2=b2=(*wp2).pixel;a3=b3=(*wp3).pixel; if(f<width){ if(f+1>(*wp1).end){wp1++;b1=(*wp1).pixel;} if(f+1>(*wp2).end){wp2++;b2=(*wp2).pixel;} if(f+1>(*wp3).end){wp3++;b3=(*wp3).pixel;} } fsub=max(currentsub,max(fb(c,b1),max(fb(c,b2),fb(c,b3)))); if(f==s){ output(max(ssub,fsub)); cnum++;} else{ output(ssub); cnum++; int t=f-s-1; if(t!=0){ output(currentsub); cnum+=(f-s-1);} output(fsub); cnum++; } s=f+1; } }