結果

提出番号 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;
}