| 提出番号 | 1311 |
|---|---|
| 提出者 | nii_nii |
| 言語 | C++ |
| 提出日時 | 2018-06-21 08:53:53 |
| 問題名 | (62)SuperCon2018(独自テスト) |
| 結果 | AC |
| 点数 | 617000 |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 1 | AC | 100000 | 107ms | 17392KB |
| 2 | AC | 100000 | 105ms | 17040KB |
| 3 | AC | 80000 | 93ms | 17088KB |
| 4 | AC | 100000 | 108ms | 17040KB |
| 5 | AC | 100000 | 104ms | 17152KB |
| 6 | AC | 80000 | 90ms | 16368KB |
| 7 | AC | 80000 | 84ms | 15936KB |
| 8 | AC | 90000 | 97ms | 17408KB |
| 9 | AC | 100000 | 106ms | 17392KB |
| 10 | AC | 90000 | 100ms | 16976KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 11 | AC | 60000 | 71ms | 14896KB |
| 12 | AC | 90000 | 96ms | 17168KB |
| 13 | AC | 50000 | 55ms | 13936KB |
| 14 | AC | 80000 | 85ms | 15920KB |
| 15 | AC | 90000 | 102ms | 17008KB |
| 16 | AC | 100000 | 105ms | 17120KB |
| 17 | AC | 60000 | 74ms | 15648KB |
| 18 | AC | 90000 | 97ms | 17392KB |
| 19 | AC | 90000 | 105ms | 17312KB |
| 20 | AC | 70000 | 76ms | 15376KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 21 | AC | 90000 | 95ms | 16272KB |
| 22 | AC | 70000 | 81ms | 15648KB |
| 23 | AC | 20000 | 34ms | 11872KB |
| 24 | AC | 60000 | 74ms | 14960KB |
| 25 | AC | 80000 | 91ms | 16176KB |
| 26 | AC | 80000 | 85ms | 15552KB |
| 27 | AC | 90000 | 103ms | 16864KB |
| 28 | AC | 70000 | 76ms | 15328KB |
| 29 | AC | 60000 | 70ms | 14512KB |
| 30 | AC | 100000 | 105ms | 17088KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 31 | AC | 30000 | 39ms | 11760KB |
| 32 | AC | 80000 | 89ms | 16288KB |
| 33 | AC | 80000 | 92ms | 15552KB |
| 34 | AC | 40000 | 53ms | 13248KB |
| 35 | AC | 60000 | 68ms | 14480KB |
| 36 | AC | 70000 | 79ms | 15760KB |
| 37 | AC | 70000 | 76ms | 15872KB |
| 38 | AC | 80000 | 83ms | 15536KB |
| 39 | AC | 70000 | 76ms | 15648KB |
| 40 | AC | 80000 | 91ms | 16896KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 41 | AC | 90000 | 102ms | 16784KB |
| 42 | AC | 50000 | 56ms | 13264KB |
| 43 | AC | 60000 | 67ms | 14544KB |
| 44 | AC | 60000 | 65ms | 14048KB |
| 45 | AC | 50000 | 59ms | 14160KB |
| 46 | AC | 40000 | 48ms | 12832KB |
| 47 | AC | 70000 | 82ms | 15408KB |
| 48 | AC | 60000 | 67ms | 14272KB |
| 49 | AC | 50000 | 55ms | 13440KB |
| 50 | AC | 30000 | 35ms | 11616KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 51 | AC | 20000 | 27ms | 10432KB |
| 52 | AC | 80000 | 87ms | 15840KB |
| 53 | AC | 80000 | 85ms | 15696KB |
| 54 | AC | 60000 | 65ms | 14144KB |
| 55 | AC | 60000 | 74ms | 14896KB |
| 56 | AC | 70000 | 75ms | 14832KB |
| 57 | AC | 60000 | 63ms | 14112KB |
| 58 | AC | 50000 | 56ms | 13376KB |
| 59 | AC | 30000 | 40ms | 12336KB |
| 60 | AC | 80000 | 88ms | 16064KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 61 | AC | 40000 | 45ms | 12016KB |
| 62 | AC | 60000 | 72ms | 14864KB |
| 63 | AC | 90000 | 95ms | 16160KB |
| 64 | AC | 40000 | 45ms | 12688KB |
| 65 | AC | 50000 | 54ms | 12976KB |
| 66 | AC | 40000 | 47ms | 13440KB |
| 67 | AC | 50000 | 59ms | 13440KB |
| 68 | AC | 30000 | 40ms | 11664KB |
| 69 | AC | 20000 | 29ms | 11136KB |
| 70 | AC | 70000 | 84ms | 15600KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 71 | AC | 10000 | 16ms | 9120KB |
| 72 | AC | 80000 | 88ms | 15664KB |
| 73 | AC | 90000 | 94ms | 16192KB |
| 74 | AC | 50000 | 65ms | 14624KB |
| 75 | AC | 20000 | 24ms | 10576KB |
| 76 | AC | 20000 | 28ms | 10752KB |
| 77 | AC | 40000 | 54ms | 12864KB |
| 78 | AC | 40000 | 51ms | 13024KB |
| 79 | AC | 40000 | 54ms | 13296KB |
| 80 | AC | 70000 | 78ms | 14880KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 81 | AC | 50000 | 58ms | 12864KB |
| 82 | AC | 40000 | 49ms | 12960KB |
| 83 | AC | 60000 | 63ms | 13856KB |
| 84 | AC | 40000 | 46ms | 12848KB |
| 85 | AC | 50000 | 62ms | 14592KB |
| 86 | AC | 30000 | 43ms | 12656KB |
| 87 | AC | 50000 | 55ms | 12944KB |
| 88 | AC | 60000 | 66ms | 13440KB |
| 89 | AC | 30000 | 37ms | 11824KB |
| 90 | AC | 60000 | 65ms | 13632KB |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 91 | AC | 40000 | 51ms | 13488KB |
| 92 | AC | 50000 | 58ms | 13200KB |
| 93 | AC | 60000 | 74ms | 14272KB |
| 94 | AC | 40000 | 43ms | 12272KB |
| 95 | AC | 20000 | 32ms | 11072KB |
| 96 | AC | 90000 | 101ms | 16496KB |
| 97 | AC | 50000 | 64ms | 13808KB |
| 98 | AC | 10000 | 18ms | 9088KB |
| 99 | AC | 80000 | 84ms | 15296KB |
| 100 | AC | 50000 | 57ms | 13584KB |
#include <stdio.h>
#include <vector>
#include<time.h>
//#include "sc1.h"
using namespace std;
//
//scN:SALの長さN=14,16,18,20
//scM:障害物の数M=1,2,3,4,5,6,7,8,9,10
//scB[2][10]:障害物の位置を表す座標を格納する配列
//scB[0][n]はn+1番目の障害物のx座標
//scB[1][n]はn+1番目の障害物のy座標
//
int scN,scM;
int scB[2][10];
clock_t scStartTime,scEndTime;
void scInput(){
int i;
scanf("%d%d",&scN,&scM);
for(i=0;i<scM;++i){scanf("%d%d",&scB[0][i],&scB[1][i]);}
scStartTime=clock();
}
void scOutput(int s){
scEndTime=clock();
printf("Ans= %d, time=%d\n",s,(int)(scEndTime-scStartTime));
}
int myabs(int n){//abs自作
if(n>=0){
return n;
}else{
return -n;
}
}
//
int cul(int x,int y){//計算用
return (x-(-10))+21*(y-(-10));
}
//
bool obst[441];//障害物ありますか
void read_obstacles(){
obst[cul(0,0)]=1;//原点だめ
for(int i=0;i<scM;i++){
int x=scB[0][i],y=scB[1][i];
if(myabs(x)+myabs(y)>scN/2){//絶対に通らない点は排除
continue;
}else{//通る可能性があったら
obst[cul(x,y)]=1;
}
}
}
//
vector<vector<int> > road_to_vertex[441][4];//各頂点について行き方を格納//(-10,-10)が0番目です
int d[4]={-21,-1,1,21};
bool used[441];
void serch_road_to_vertex(int now,int cnt,vector<int> how_to_go){//DFS
if(cnt==scN/2){
int t=how_to_go[scN/2-1]-how_to_go[scN/2-2];//計算
if(t==-21){//折り返し一歩手前でわけわけして格納
road_to_vertex[now][0].push_back(how_to_go);
}else if(t==-1){
road_to_vertex[now][1].push_back(how_to_go);
}else if(t==1){
road_to_vertex[now][2].push_back(how_to_go);
}else{
road_to_vertex[now][3].push_back(how_to_go);
}
}else{
for(int i=0;i<4;i++){
int nex=now+d[i];
if(used[nex]==1){//既に通ってたらだめ
continue;
}else{//既に通ってないね
if(obst[nex]==1){//障害物あったらだめ
continue;
}else{
how_to_go.push_back(nex);
used[nex]=1;
serch_road_to_vertex(nex,cnt+1,how_to_go);//大丈夫なのでDFS
how_to_go.pop_back();
used[nex]=0;
}
}
}
}
}
//
int count_each_vertex_SAL(){
int ans=0;
for(int i=0;i<441;i++){
int cnt=0;
if(!road_to_vertex[i][0].empty()){
cnt++;
}
if(!road_to_vertex[i][1].empty()){
cnt++;
}
if(!road_to_vertex[i][2].empty()){
cnt++;
}
if(!road_to_vertex[i][3].empty()){
cnt++;
}
if(cnt<=1){//SALできません
continue;
}else{
int bfrl=0,bfrm=0;//前回重なったところの記録(高速化)
for(int j=0;j<4;j++){//折り返し一歩手前が重ならないように全探索
for(int k=j+1;k<4;k++){//同様
for(int l=0;l<(int)road_to_vertex[i][j].size();l++){//全探索
for(int m=0;m<(int)road_to_vertex[i][k].size();m++){//全探索
bool ok=1;
if(road_to_vertex[i][j][l][bfrl]==road_to_vertex[i][k][m][bfrm]){//前記録したとこ
continue;//だめ
}
for(int n=0;n<scN/2-1;n++){//交差判定
for(int o=n%2;o<scN/2-1;o+=2){//交差判定
if(road_to_vertex[i][j][l][n]==road_to_vertex[i][k][m][o]){//交差判定
ok=0;
bfrl=n;bfrm=o;
break;//だめ
}
}
if(!ok){//だめ
break;
}
}
if(ok){//いいよ
ans++;
}
}
}
}
}
}
}
return ans;
}
//
int main(){
scInput();//入力
read_obstacles();//障害物の座標をbool値で管理
vector<int> s;//次の行の関数に代入するためのモブ(特に意味はない)
serch_road_to_vertex(220,0,s);//各頂点への行き方をDFS
int ans=count_each_vertex_SAL()*2;//SALの数を数えよう逆順もあるよ
scOutput(ans);//出力
return 0;
}