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”三种中任意一种就输 ...
随机推荐
- esxi上引起vm绑定浮动IP无法和外面通信
在vmware esxi环境通过创建VM安装完成openstack之后,发现创建Instance后网络不通,经过多方面排查,最后确定是vmware esxi标准交换机拒绝“混杂模式”所致,故打开“混杂 ...
- hdu 1069 动规 Monkey and Banana
Monkey and Banana Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- Hibernate 使用MyEclipse简化开发
在平时开发中写配置文件比较繁琐,在这里写一下如何使用myEclipse简化开发. 1.打开MyEclipse,创建数据库连接 单机测试连接按钮,如果出现成功建立连接,则连接成功. 然后Finish 2 ...
- 前缀和:CodeForces 932B Recursive Queries
Description Let us define two functions f and g on positive integer numbers. You need to process Q q ...
- POJ3687 Katu Puzzle
好好写2-sat 如果a1-->b1矛盾则连边a1-->b2和b1-->a2 我定了一个ccnt和cnt变量,结果少打一个c,wa了好多次(lll¬ω¬) By:大奕哥 #inclu ...
- 二维数组sort排序
和副本任务完全无关的奇怪感慨: 完全搞不懂我为什么会在搞图论的时候学这种奇怪东西,需要的时候不会,不需要的时候又莫名增加了奇怪的技能点. 之前的假期规划在十多天的放飞自我中彻底泡汤,简单的图论都一点不 ...
- 【最小割】BZOJ3894-文理分科
[题目大意] 给定一个m*n的矩阵,每个格子的人可以学文或者学理,学文和学理各有一个满意度,如果以某人为中心的十字内所有人都学文或者学理还会得到一个额外满意度,求最大满意度之和. [思路] 发现这道题 ...
- Arab Collegiate Programming Contest 2012 J- Math Homework
思路:由于只有1-6这几个数,而这几个数的最小公倍数是60,所以只需要求出60以内有多少满足条件的数即可. 再就是求出对于给定的n,求出60的倍数.然后就是怎样求的问题了. 首先可以写成如下形式: ...
- 零配置文件搭建SpringMvc
零配置文件搭建SpringMvc SpringMvc 流程原理 (1)用户发送请求至前端控制器DispatcherServlet:(2) DispatcherServlet收到请求后,调用Handle ...
- 在活动之间切换(显式Intent)
实验名称:在活动之间切换 实验现象:通过点击主活动的按钮进入下一个界面 使用技术:显式Intent 步骤: 1.创建一个项目,加载布局.添加一个button 2.新建一个活动. 3.修改按钮的点击事件 ...