E. Nanosoft

原题地址




代码:
题目大意:定义一个logo为四个小正方形按(R,G,B,Y)颜色顺序拼成一个大正方形,有q次询问,每次询问输入一个范围,求图中这个范围内的面积最大商标
由于q的范围是1e5,可以想到应该采用O(1)或O(log n)的查询方法,自然想到了二维ST表。在预处理时,先将每个红点与周围点(即判断它右边是否为绿点,下方是否为黄点,右下是否为蓝点)的最大log处理出来。查询时二分答案,即可获得结果。
详细讲解
代码借鉴qsc的视频讲解

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
#define maxn 505
#define ma 11
int n,m,q,R[4][maxn][maxn],val[maxn][maxn],f[ma][ma][maxn][maxn],lg[maxn];
char s[maxn][maxn];
void build(int n,int m)//二维ST表
{int i,j,k1,k2;for(i=0;i<n;i++){for(j=0;j<m;j++){f[0][0][i+1][j+1]=val[i][j];}}for(i=2;i<maxn;i++)lg[i]=1+lg[i>>1];for(i=1;i<=n;i++)for(k2=1;(1<<k2)<=m;k2++)for(j=1;j<=m;j++)f[0][k2][i][j]=max(f[0][k2-1][i][j],f[0][k2-1][i][j+(1<<(k2-1))]);//先处理列for(k1=1;(1<<k1)<=n;k1++)for(i=1;i<=n-(1<<k1)+1;i++)for(k2=0;(1<<k2)<=m;k2++)for(j=1;j<=m-(1<<k2)+1;j++)f[k1][k2][i][j]=max(f[k1-1][k2][i][j],f[k1-1][k2][i+(1<<(k1-1))][j]);//再处理行
}
void color(char c,int fx,int fy,int k)
/*寻找颜色为R/G/Y/B的,以(i,j)为右下/左下/右上/左上角的最大正方形
*/
{int stx=0,sty=0;if(fx==-1) stx=n-1;if(fy==-1) sty=m-1;while(stx<n&&stx>=0){while(sty<m&&sty>=0){if(s[stx][sty]==c){R[k][stx][sty]=1;if(stx-fx>=0&&stx-fx<n&&sty-fy>=0&&sty-fy<m){if(s[stx-fx][sty]==c&&s[stx][sty-fy]==c&&s[stx-fx][sty-fy]==c){R[k][stx][sty]=min(R[k][stx-fx][sty],min(R[k][stx][sty-fy],R[k][stx-fx][sty-fy]))+1;//寻找最大正方形模板}}}sty+=fy;}sty=0;if(fy==-1) sty=m-1;stx+=fx;}
}
int query(int x1,int y1,int x2,int y2)//ST表查询
{int k1=lg[x2-x1+1],k2=lg[y2-y1+1];x2=x2-(1<<k1)+1;y2=y2-(1<<k2)+1;return max(max(f[k1][k2][x1][y1],f[k1][k2][x1][y2]),max(f[k1][k2][x2][y1],f[k1][k2][x2][y2]));
}
bool check(int r1,int c1,int r2,int c2,int mid)//非常有意思的check函数
{r1=r1+mid+-1;c1=c1+mid-1;r2=r2-mid;c2=c2-mid;if(r1>r2||c1>c2) return false;return query(r1,c1,r2,c2)>=mid;
}
int main()
{    ios::sync_with_stdio(false);cin>>n>>m>>q;for(int i=0;i<n;i++){cin>>s[i];}color('R',1,1,0);//预处理color('Y',-1,1,1);color('G',1,-1,2);color('B',-1,-1,3);for(int i=0;i<n-1;i++){for(int j=0;j<m-1;j++){if(s[i][j]=='R'&&s[i+1][j]=='Y'&&s[i][j+1]=='G'&&s[i+1][j+1]=='B'){val[i][j]=min(R[0][i][j],min(R[1][i+1][j],min(R[2][i][j+1],R[3][i+1][j+1])));}}}build(n,m);while(q--)//q次询问{int r1,c1,r2,c2,mid;scanf("%d%d%d%d",&r1,&c1,&r2,&c2);int lc=0,rc=min(r2-r1,c2-c1),ans=0;while(lc<=rc)//二分答案{mid=(lc+rc)/2;if(check(r1,c1,r2,c2,mid)){lc=mid+1;ans=mid;}else rc=mid-1;}printf("%d\n",ans*ans*4);}return 0;
}

F. Super Jaber

原题地址



代码:
题目大意:在一张图中,规定一步可以向相邻的格子移动一步,或跳转到相同颜色的格子,有q次询问,问从(r1,c1)到(r2,c2)最少要几步。
显然又是一道疯狂预处理的题目,bfs处理每个点到不同颜色的最短距离
详细讲解
代码借鉴qsc的视频

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
#define maxn 1010
#define mkp make_pair
int n,m,q,k,a[maxn][maxn],dis[44][maxn][maxn],vis[maxn][maxn],viscol[44];
vector<pair<int,int> >col[44];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};
void bfs(int x)
{for(int i=0;i<n;i++)for(int j=0;j<m;j++)vis[i][j]=0;for(int i=1;i<=k;i++) viscol[i]=0;viscol[x]=1;queue<pair<int,int> >Q;for(int i=0;i<col[x].size();i++){Q.push(col[x][i]);dis[x][col[x][i].first][col[x][i].second]=0;vis[col[x][i].first][col[x][i].second]=1;}while(!Q.empty()){int nowx=Q.front().first;int nowy=Q.front().second;Q.pop();if(!viscol[a[nowx][nowy]]){for(int i=0;i<col[a[nowx][nowy]].size();i++){int nx=col[a[nowx][nowy]][i].first;int ny=col[a[nowx][nowy]][i].second;if(!vis[nx][ny]){dis[x][nx][ny]=1+dis[x][nowx][nowy];vis[nx][ny]=1;Q.push(mkp(nx,ny));}}viscol[a[nowx][nowy]]=1;}for(int i=0;i<4;i++){int nx=nowx+dx[i];int ny=nowy+dy[i];if(nx<0||nx>=n||ny<0||ny>=m) continue;if(!vis[nx][ny]){dis[x][nx][ny]=1+dis[x][nowx][nowy];vis[nx][ny]=1;Q.push(mkp(nx,ny));}}}
}
int main()
{    ios::sync_with_stdio(false);cin>>n>>m>>k;for(int i=0;i<n;i++)for(int j=0;j<m;j++){scanf("%d",&a[i][j]);col[a[i][j]].push_back(mkp(i,j));}for(int i=1;i<=k;i++)bfs(i);cin>>q;while(q--){int r1,c1,r2,c2;scanf("%d%d%d%d",&r1,&c1,&r2,&c2);r1--;c1--;r2--;c2--;int ans=abs(r2-r1)+abs(c1-c2);for(int j=1;j<=k;j++)//通过k颜色将两点相连ans=min(ans,dis[j][r1][c1]+dis[j][r2][c2]+1);printf("%d\n",ans);}return 0;
}

B站带我打codeforces(三)相关推荐

  1. 字字带泪——写在三十岁到来这一天

    美女CEO王潇,刚刚写了一篇三十感言.句句名言,虽然是写给女生的,但是,男生也更应该看看. <字字带泪--写在三十岁到来这一天> By 王潇 2008年11月3日 谨以此文献给我的众姐妹, ...

  2. 帝国CMS7.5全新后台 仿搜外问答模板 整站带演示数据源码

    [免费]帝国CMS7.5全新后台 仿搜外问答模板 整站带演示数据源码 本套源码为免费源码,无演示地址! 该源码仿制程度 70%,但够小白学习搭建网站发布信息使用. 免费下载:帝国CMS 仿搜外问答系统 ...

  3. 帝国CMS仿《3641图库》模板/图片网站源码/带WAP手机站带数据

    帝国CMS仿<3641图库>模板,美女图片网站源码,带WAP手机站带数据.数据大小:7G左右 请准备10G空间,无采集. 3641图库网为您提供美女图片.好看的图片大全.高清图片.可爱图片 ...

  4. 完美天空下载站php程序,织梦CMS高仿天空软件站|软件下载站源码整站带数据

    织梦CMS高仿天空软件站|软件下载站源码整站带数据是一款基于DEDECMS5.5开发制作的仿天空软件站的源码,适用于软件下载.资源下载等网站使用. 安装方法: 1.首先打开你的网址 然后就会出现ded ...

  5. 20KW三相三电平光伏逆变器资料(AD格式) 带程序 20KW三相三电平光伏逆变器资料(AD格式) 带程序

    20KW三相三电平光伏逆变器资料(AD格式) 带程序 20KW三相三电平光伏逆变器资料(AD格式) 带程序

  6. 官微名片!配置全员智能名片,是使用LTD独立站营销SaaS系统第三步

    在过去的传统商业模式中,"交换名片"是商业交流中必不可少的一环,通过交换名片来了解对方的信息,获得联系方式. 但在现在的数字化商业模式下,线上交流成为达成生意的重要方式,而传统名片 ...

  7. 搜狐html源码,仿搜狐视频分享源码,红色大气模板,整站带数据

    仿搜狐视频分享源码测试过,完整无错,可以伪静态,功能非常不错. 程序是二次开发于大型系统,性能超稳定,缓存机制强大. 可以添加本地视频,也可以转发去广告的优酷视频 支持批量采集优酷视频,单条采集优酷视 ...

  8. 帝国CMS7.5情书模板/精美情书大全站/同步生成带手机站带采集

    帝国CMS7.5模板,精美情书大全站源码,同步生成带手机站带采集.非常漂亮的帝国CMS模板,适合改改做文学类的网站. 此模板适合做精美情书网站,功能比较齐全,后台操作方便,简单易上手,并拥有多款插件. ...

  9. 最好的中文字体下载站(带预览),1500个流行字体!

    最好的中文字体下载站(带预览),1500个流行字体! http://www.xfbbs.com/Font/

最新文章

  1. 机器学习中四种调参方法总结
  2. 基于cropper和sweetalert的简单图片/头像裁剪上传
  3. 验证E-mail是否正确
  4. solaris 10 安装oracle 10g
  5. 二维数组中的查找---剑指Offer
  6. leetcode1219. 黄金矿工(回溯)
  7. asterisk 扩展应用(3)——IVR 实现
  8. 历史上的今天:游戏机之父诞辰;搜索技术之父出生;MIT 公开演示旋风计算机...
  9. 百万年薪挖了个P7程序员,难道是“水货”?
  10. 重磅!阿里推出国产开源的JDK!这是要干掉oracle??
  11. word论文公式编号排版
  12. 用户自定义标识符php,三分钟了解C语言中自定义的标识符及规则
  13. 程序员年龄变大后的职业出路是什么?
  14. VIOS挂载ISO文件
  15. SVG (SVG的概念 、SVG 实例 、SVG 在HTML中 、SVG 矩形 、SVG 圆形 、SVG 椭圆 、SVG 直线 、SVG 多边形、svg验证码 )
  16. 高通WLAN框架学习(27)-- Types of regulatory 和WCNSS_qcom_cfg.ini配置参数
  17. 二层交换机,三层交换机,四层交换机的区别
  18. 快速查找参考文献影响因子——ScholarScope
  19. EventBus原理源码分析和使用
  20. 软件工程概论-- 详细设计,过程设计的6大工具:程序流程图,判定表,N-S图和判定树之间的区别, PAD图的优点?

热门文章

  1. 第2章 荣格——分析心理学
  2. 为什么要学python?学习python有哪些好处?
  3. Uber H3简单介绍
  4. 自己动手写一个印钞机 第一章
  5. 作为测试负责人接手一个新业务,怎么干?
  6. Python + Django4 搭建个人博客(十五):注册功能页面实现
  7. Virtuoso仿真错误 ---- input.scs
  8. 延长计算机屏幕显示时间,Win10如何延长锁屏的显示时间?
  9. 子集构造法和含有空串的子集构造法
  10. Linux深度学习资料汇总