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”三种中任意一种就输 ...
随机推荐
- hiho1291(逆序思维,并查集)
题目链接:[https://hihocoder.com/problemset/problem/1291] 题意:在<我的世界>游戏中放置沙盒,沙盒为体积为1的正方体,按顺序给你一些坐标,然 ...
- SpringBoot 整合 WebSocket
SpringBoot 整合 WebSocket(topic广播) 1.什么是WebSocket WebSocket为游览器和服务器提供了双工异步通信的功能,即游览器可以向服务器发送消息,服务器也可以向 ...
- GIT 提交步骤
1.提交 git add .
- win2003服务器装spl2008,打安全补丁后无法进入SQL Server Management Studio
解决方法就是:卸载垃圾的360安全卫士,用windows自带的更新工具更新系统补丁,就好了
- JS返回数组种类和个数(面试常问)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Assignment (HDU 2853 最大权匹配KM)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【spring】在spring cloud项目中使用@ControllerAdvice做自定义异常拦截,无效 解决原因
之前在spring boot服务中使用@ControllerAdvice做自定义异常拦截,完全没有问题!!! GitHub源码地址: 但是现在在spring cloud中使用@ControllerAd ...
- FIS3配置fis-conf.js
设置规则的配置接口: fis.match(selector, props); 1.添加md5戳:对 js.css.png 图片引用 URL 添加 md5 戳: fis.match('*.{js,css ...
- 美国保健品品牌介绍之Now Foods
Now Foods是美国著名的美国保健品品牌,定位于大众品牌. 美国Now Foods公司位于美国伊利诺州,台湾中文名叫健而婷,成立于1968年,是美国保健品市场上名列三甲的国际知名的天然保健品牌,其 ...
- RESTful概念理解
基础 REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态. 如果考虑使用它的 Web 服务的数 ...