Codeforces Round #208 E. Dima and Kicks
standard input
standard output
Dima is a good person. In fact, he's great. But all good things come to an end...
Seryozha is going to kick Dima just few times.. For this reason he divides the room into unit squares. Now the room is a rectanglen × m consisting of unit squares.
For the beginning, Seryozha put Dima in a center of some square. Then he started to kick Dima (it is known, that he kicks Dima at least once). Each time when Dima is kicked he flyes up and moves into one of four directions (up, left, right, down). On each move Dima passes k(k > 1) unit of the length in the corresponding direction. Seryozha is really kind, so he kicks Dima in such way that Dima never meets the walls (in other words, Dima never leave the room's space). Seryozha is also dynamic character so Dima never flies above the same segment, connecting a pair of adjacent squares, twice.
Seryozha kicks Dima for a long time, but Dima is not vindictive — Dima writes. Dima marked all squares in which he was staying or above which he was flying. Thanks to kicks, Dima does not remember thek value, so he asks you to find all possible values which matches to the Dima's records.
The first line contains n andm (1 ≤ n, m ≤ 103) — size of the room.
Next n lines goes, each containsm numbers aij — Dima's notes:aij = 1, if Dima was staying in the square(i, j) or was flying above it. Otherwiseaij = 0.
At least one aij equals1.
In a single line in accending order print all k (k > 1), which matches the Dima's notes. If there are no suchk and Dima invented this story with kicks, print -1.
看了别人的代码,思路至今仍未捋清。
在2和Min(n,m)之间枚举k值,遍历矩阵,多条件检测k值。(以后再详解。。。)
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <map>
#include <vector>
#include <queue>
#include <set>
#include <string>
#include <math.h>
#define N 1010
using namespace std;
int n,m,tot;
int a[N][N];
int s0[N][N],s1[N][N],d[N][N];
int readInt(){ //输入挂
char c;
int n=0;
c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9'){
n=n*10+c-'0';
c=getchar();
}
return n;
}
int fa[N*N];
int sx,sy; //默认初始化为0
int ok(int x,int y){
return x>=1&&x<=n&&y>=1&&y<=m ;
}
int find(int i) //并查集
{
if(fa[i]==i) return i;
else return find(fa[i]);
}
int can(int k){
int i,j,x,y,mx,my,tmp;
int dd=0,fmx;
fmx=(sx-1)/k,mx=(n-sx)/k,my=(m-sy)/k,dd=0; //mx,my记录距离下墙、右墙的kick数
for(i=-fmx;i<=mx;i++)
for(j=0;j<=my;j++){
d[i+fmx][j]=0;
int num=(i+fmx)*(my+1)+j;
fa[num]=num;
}
for(i=-fmx;i<=mx;i++){
for(j=0;j<=my;j++){
x=sx+i*k; //所能到达的位置
y=sy+j*k;
if(!a[x][y]) continue;
dd++;
if(ok(x+k,y)&&a[x+k][y]){ //向下走
tmp=s0[x+k-1][y]-s0[x][y];
if(tmp==k-1){
d[i+fmx][j]++;
d[i+1+fmx][j]++;
dd+=k-1;
fa[find((i+fmx)*(my+1)+j)]=fa[find((i+1+fmx)*(my+1)+j)];
}
else if(tmp>0) return 0;
}
if(ok(x,y+k)&&a[x][y+k]){ //向右走
tmp=s1[x][y+k-1]-s1[x][y];
if(tmp==k-1){
d[i+fmx][j]++;
d[i+fmx][j+1]++;
dd+=k-1;
fa[find((i+fmx)*(my+1)+j)]=fa[find((i+fmx)*(my+1)+j+1)];
}
else if(tmp>0) return 0;
}
}
}
if(dd!=tot) return 0; //所经过的单元总数
int cnt=0,thef=find((0+fmx)*(my+1)+0);
for(i=-fmx;i<=mx;i++)
for(j=0;j<=my;j++){
cnt+=d[i+fmx][j]&1;
}
for(i=-fmx;i<=mx;i++)
for(j=0;j<=my;j++){
x=sx+i*k;
y=sy+j*k;
if(!a[x][y]) continue;
if(find((i+fmx)*(my+1)+j)!=thef) return 0;
}
return cnt<=2;
}
int main()
{
int i,j,k;
while(scanf("%d %d",&n,&m)!=EOF){
tot=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
//scanf("%d",&a[i][j]);
a[i][j]=readInt();
tot+=a[i][j]; //通过的总单元数
}
if((n<3&&m<3)|| tot==1){
printf("-1\n");
}
else{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
s0[i][j]=s0[i-1][j]+a[i][j];
s1[i][j]=s1[i][j-1]+a[i][j];
}
sx=sy=0;
for(j=1;j<=m;j++){ //纵向搜索第一个不为0的单元位置
for(i=1;i<=n;i++){
if(a[i][j]){
sx=i;sy=j; break;
}
}
if(sx) break;
}
int flag=1;
for(k=2;k<=min(n,m);k++){
//printf("can(%d)=%d\n",k,can(k));
if(can(k)){
if(flag) flag=0;
else printf(" ");
printf("%d",k);
}
}
if(flag) printf("-1\n");
else printf("\n");
}
}
return 0;
}
Codeforces Round #208 E. Dima and Kicks的更多相关文章
- Codeforces Round #208 (Div. 2) 358D Dima and Hares
题目链接:http://codeforces.com/problemset/problem/358/D 开始题意理解错,整个就跪了= = 题目大意:从1到n的位置取数,取数的得到值与周围的数有没有取过 ...
- Codeforces Round #208 (Div. 2) A.Dima and Continuous Line
#include <iostream> #include <algorithm> #include <vector> using namespace std; in ...
- Codeforces Round #208 (Div. 2) B Dima and Text Messages
#include <iostream> #include <algorithm> #include <string> using namespace std; in ...
- Codeforces Round #208 (Div. 2)
A - Dima and Continuous Line 水题:直接模拟: #include<cstdio> #define maxn 1005 using namespace std; ...
- Codeforces Round #553 B. Dima and a Bad XOR
题面: 传送门 题目描述: 题意很简单:在一个N*M的矩阵中(N行M列),问是否可以:每行选一个整数,使他们的异或和大于0.如果不可以,输出"NIE":如果可以,输出"T ...
- Codeforces Round #223 (Div. 2) A
A. Sereja and Dima time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
随机推荐
- Unity Shader 之 渲染流水线
Unity Shader 之渲染流水线 什么是渲染流水线 一个渲染流程分成3个步骤: 应用阶段(Application stage) 几何阶段(Geometry stage) 光栅化阶段(Raster ...
- [SimpleOJ238]宝藏探寻
题目大意: 给你一棵带点权的n个结点的树,有m次询问,每次从树上删掉一条路径(u,v),问删掉每条路径后各个连通块权值和的平方之和. 每次询问是独立的. 思路: 首先对树遍历一遍求出每棵子树的权值和. ...
- [转]Intent和PendingIntent的区别
intent英文意思是意图,pending表示即将发生或来临的事情. PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转. Int ...
- [转]android中OnTouch和OnClick、 imagebutton的src和background有什么区别
1.OnTouch和OnClick有何区别? 专业回答 1.onClick就传入一个View对象,而 onTouch要传入一个View 对象和 MotionEvent的对象2.onTouch对控件 ...
- JavaScript Diagramming
JavaScript Diagramming Optensity
- CC1101是一种低成本真正单片的UHF收发器
CC1101是一种低成本真正单片的UHF收发器,为低功耗无线应用而设计.电路主要设定为在315.433.868和915MHz的ISM(工业,科学和医学)和SRD(短距离设备)频率波段,也可以容易地设置 ...
- servlet匹配路径时/和/*的区别(转)
本文转自https://blog.csdn.net/rongxiang111/article/details/53008829 一.<url-pattern>/</url-patte ...
- 【Unicode编码表】UniCode编码表+转化器
UniCode编码表[转载:https://www.cnblogs.com/csguo/p/7401874.html] Unicode编码则是采用双字节16位来进行编号,可编65536字符,基本上包含 ...
- WebKit 在 Windows 平台下编译小结
虽然WebKit 已经越来越多的被广大程序员接受,但其编译过程却非常之痛苦.下面将我编译WebKit 代码的经验与大家分享. 1) 获取WebKit 源代码 WebKit 源代码是使用Subversi ...
- 无线AP和无线路由器区别wifi热点
转自:http://network.51cto.com/art/201310/413327.htm 就像很多用户很容易混淆无线上网卡和无线网卡一样,很多用户也分不清无线AP和无线路由,小峰便是其中的一 ...