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”三种中任意一种就输 ...
随机推荐
- 管理lvm 卷 system-storage-manager
安装 sudo yum install system-storage-manager [root@si-test-blueking--4 ~]# ssm list 创建物理磁盘到物理卷,<poo ...
- 【BZOJ 3443】 3443: 装备合成 (离线+线段树)
3443: 装备合成 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 63 Solved: 31 Description [背景] lll69 ...
- 素数筛 codevs 1675 大质数 2
1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小明因为没做作业而被数学 ...
- c# -- 介绍File.AppendAllText 方法
下面介绍两个函数: File.AppendAllText (String, String) File.AppendAllText (String, String, String) File.Appen ...
- [转]基础总结篇之一:Activity生命周期
子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思 ...
- [译]Java 程序员应该了解的 10 个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- CentOS 6.9通过RPM安装EPEL源(http://dl.fedoraproject.org)
另类的装法,通过RPM包直接安装 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm & ...
- Django 中文显示
Django中文显示: 1.如要在.py文件中显示中文,在文件首行加上:# -*- coding: utf-8 -*- 2.如要在html文件中显示中文,要将文件保存为UTF-8格式 3.在setti ...
- Druid 常见问题
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
- VC中__int64的用法
VCVC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-922337203685 4775808~922337 ...