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 |
TLE的普通算法,写这个都够费力的,先写出来理清思路,再考虑speed up#include<stdio.h> #include<iostream.h> #define N 32768 int value[2][N]; int edge[2][N]; int le,lc; //准备输出的边缘值RLE pair。 int i; inline swap(int &a,int &b){ int c=a; a=b; b=c; } inline update(int i1,int j1,int i2,int j2){//更新相领的两个象素边缘强度值 int e=value[i1][j1]-value[i2][j2]; if (e<0) e=-e; if (e>edge[i1][j1]) edge[i1][j1]=e; if (e>edge[i2][j2]) edge[i2][j2]=e; } inline output(int w,int r){ for (i=0;i<w;i++){ while(i<w && edge[r][i]==le) {i++;lc++;} if (i<w){ //不是行尾剩下的就输出 if (lc>0) cout<<le<<" "<<lc<<endl; le = edge[r][i]; lc = 1; } } } inline ACM(int w){ int v; //当然读入的颜色 int l; //当然读入的游长 int row,col;//当前行号列号(从0开始) int r0,r1;//当前行pairs数量 int srow; cin>>v>>l; row=0;col=0; r0=1;//上一行 r1=0;//当前一行,这两行替换使用 le=-1; lc=0; while(l!=0){ //read a pair RLE srow=0; while (l>0){ int n=l; if (col+n>w) n= w-col; if (l>w && srow>3){ //特殊加速:超长RLE pair,不要这段也可运行,时间超长 if (le!=0){ cout<<le<<" "<<lc<<endl; le=0;lc=0; } col=l%w; //余下n个不处理,只处理整行0 if (col==0) lc+=l-w; else lc+=l-w-col; l=col+w; for (i=0;i<w;i++) edge[r1][i]=edge[r0][i]=0; continue; //置最上一行 //有l/w个edge值全0行 } if (row==0) //第0行 for (i=col;i<col+n;i++){ value[r1][i]=v; edge[r1][i]=0; if (i>0) update(r1,i,r1,i-1); } else{ //非第0行 for (i=col;i<col+n;i++){ value[r1][i]=v; edge[r1][i]=0; update(r1,i,r0,i); if (i>0) {update(r1,i,r0,i-1);update(r1,i,r1,i-1);} if (i<w-1) update(r1,i,r0,i+1); } } if (i==w){ //满一行 col =0; //换行到下一行开头 row++; srow++; l -= n; if (row>1) output(w,r0); swap(r0,r1); } else{ col+=l; //前进l长度 l = 0; } } cin>>v>>l; } output(w,r0); cout<<le<<" "<<lc<<endl; } //数据结构:定义两行,每行足够长 //算法:循环读入和填入,并计算和输出edge值 int main() { int w; //宽度 cin>>w;//图像宽度 while(w!=0){ cout<<w<<endl; ACM(w); cout<<"0 0"<<endl; cin>>w; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator