topcoder 849-SRM 562 DIV1
花了一分钟构思出按照这种操作是符合等比数列的,结果到最后都没有调试出来,对这个界面不熟悉是一个很大的原因。(当时由于笔记本上没有编译器,下了个c-free结果现在都还在用。。囧)。前面400暴力模拟,当T>400时按等比数列构造。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class PastingPaintingDivOne { public: vector<int64> countColors(vector <string> c, int t) { int64 i,j,k,maze[MM][MM],n,m; int64 a[1010][1010]; n=c.size(), m=c[0].size(); memset(maze,0,sizeof(maze)); for(i=0;i<n;i++){ for(j=0;j<m;j++) { if(c[i][j]=='R') maze[i][j]=1; else if(c[i][j]=='G') maze[i][j]=2; else if(c[i][j]=='B')maze[i][j]=3; } } int64 count[4],limit=400,p[4]; memset(a,0,sizeof(a)); memset(count,0,sizeof(count)); for(i=1;i<=t && i<=limit;i++) { p[1]=count[1], p[2]=count[2], p[3]=count[3]; for(j=i;j<i+n;j++) { for(k=i;k<i+m;k++) { if(maze[j-i][k-i]) { if(a[j][k]) count[a[j][k]]--; a[j][k]=maze[j-i][k-i]; count[a[j][k]]++; } } } } if(i>limit) { count[1]+=(t-limit)*(count[1]-p[1]); count[2]+=(t-limit)*(count[2]-p[2]); count[3]+=(t-limit)*(count[3]-p[3]); } VI res; res.push_back(count[1]); res.push_back(count[2]); res.push_back(count[3]); return res; } };