Entries

スポンサーサイト (この記事を編集する[管理者用])

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント

[C74] Problem C

I use DP
attention to this:
The agent can use more than one type of potion at once.
But the (3^12) transfer will lead to TLE
could you explain your code?

[C76]

DP can solve with O(1000 * 12 * 2^12).
Think that you can use potions one by one. (not simultaneously)
Let p be the number of potions.

for(i=0; i<(1<<p); i++) for(j=0; j<p; j++) if(potion j is not used){
update dp[i|(1<<j)] by using dp[i];
}

If you want to use potion 0 and 2, update dp[0] -> dp[1], then update dp[1] -> dp[5].
So, run above pseudo code before each movement.
  • 2011-01-31 21:13
  • rsujskf
  • URL
  • 編集

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1751-204763ba
この記事にトラックバックする(FC2ブログユーザー)

模擬ICPCアジア地区予選2010 関西オンサイト (この記事を編集する[管理者用])

2010年12月04日11時から5時間,10問.(大阪大学豊中キャンパス)
[ LINK ]

ICPCの参加権がないのに,何故かチーム「京大4」としてソロチームで参加.
まぁ,オンサイトで人に合う機会が基本的にないので,とにかく,楽しかったです.
8問解いた.以下本番での行動順.

入力がファイルからということでfreopenを書く.
 引数の順番がわからない
 全探索してコンパイラに怒られないのを探そう….
  "A.txt"と"r"って逆でもコンパイラ怒ってくれなくないか?
  ちゃんと試そう.
  うまくいかない….
  …
  fopenしてfscanfで読み込むよ!
A問題をのんびり読む.
 読んでる間にもう解いてるチームは解いてるなぁ…,すげー.
 ふむふむ.やるだけ.O(NQ)でクエリごとに入力全部なぞればいいよね.
 まぁ,書くかな.
 書いた.サンプル合った.提出しない.
B問題をのんびり読む.
 さっそくのDP臭.
 同じ場所を2度連続で踏んではいけないのか,ふんふん.(読み間違え)
 右足と左足の位置でvalidかどうかの配列を最初につくって適当にDPすればいいや.
 100000*9*9*9?
 あれ?間に合わなくないか?
 違うや,次に置く場所は与えられるんだから100000*9*9か,右足と左足で2倍だけど,まぁ誤差.
 微妙だけど時間制限20秒とか書いてるし間に合うだろう.
 書く.
 サンプル1個だけ合わない.
 えー.
 あ,同じ場所を連続して同じ足で踏むのはありなのか.
 あれ,じゃ,9×9の状態とか要らなくないか?まぁいいや.
 サンプル通る.提出しない.
C問題をのんびり読む.
 どこからどこへ行くとかじゃなくて,ルートが与えられてるのか.
 態々ダンジョンマップで与えられるとか誰得….
 まぁ,やるだけか.
 使ったポーションの組と,今何歩あるいたか,残りHP,を状態にしてその状態に辿りつけるかどうかBFS….
 いや,状態数多いし.
 残りHPって,今まで受けたダメージと使ったポーションの組から回復量分かるし,状態に含めなくてよろしい.
  嘘!
  オーバー回復すると計算が合わない.
 うーん.
 あれ,単純に,使ったポーションの組と,何歩歩いたかを状態にして,残りHPの最大値を記録しておけばいいだけでは.
 良い.
 書く.
 サンプル合った.提出しない.
D問題をのんびり読む.
 めんどそう.
 取り敢えず次の問題を読もうか.
E問題を読む.
 図と雰囲気から無理ゲーの香り.逃げよう.
H問題を読む.
 問題タイトルと,入出力形式から,これは解けそうな気もする,と思ったから.
 単に,最短路に含まれうる枝を求めて,各ノードに入っていく枝で最もコストの小さいのを使うだけ.
 簡単.書く.
 ダイクストラなので,ライブラリ使えないし,しょうがないけどC++で書く.priority_queue便利だね.
 サンプル通る.なんとなく送ってみる.通った.
自分の席の前の方で,C問題の入力間違えてる疑惑などが囁かれている.
 じゃあ,C問題送ってみましょうか?
  送る.通る.
I問題を読む.
 えっと,オペレーターの最小値.
 オペレーターは最適な対応をする.(と読み間違えた)
 ふむふむ.
 DAGのパス被覆みたいな感じで最大流か何かに落ちる…?
 わからん.
J問題を読む.
 どうみてもDAGのパス被覆.
 じゃあI問題は全く違う方法で解くのかー.
 最大流書くのめんどい.
 しかし,Jが一番楽だよなぁ….
 書く.サンプル通る.サブミットしない.
F問題を読む.
 幾何.だがシミュレーションするだけで難しくないのでは.
 どうやって転がる? 円運動かな? そうっぽい.
 まぁ,適当に書く.
 めんどい.普段はライブラリに頼ってるからなぁ.ライブラリは偉大.
 うーん,流石に,2次元の点の構造体ぐらいは作ったほうが楽っぽいなぁ,書き書き.
 答えが合わない.
 あ,ここ,符号逆っぽい? 逆にする.サンプル合った.
 提出.コンパイルエラー.えー.
 cosとかsin使ってるので怒られてるっぽい?
 前回も同じ怒られ方して,clar投げて,-lm付けてもらったはずなのに….
 ヘルプを頼む.
 C++で提出してくださいとか言われたー.えーw
 C++で提出.WA.
 うーん,合ってそうなんだけどなぁ.
 あ,半径が0の時,回転角が0/0でNaNになってるのか.
 修正.通った.
D問題を書くかー.面倒だけど.
 うーん,どうせ答えって,たかだか4か5ぐらいだよね.
 適当にIterative deepeningでいいや.
 書く.回転の対応をハードコーディング.がりがり.
 書いた.実行.止まらない.
 間違ってた.サンプル通った.サブミット.WA.
 添字違った.サブミット.WA.
 まだ違った.サブミット.通った.
残り問題は無理ゲーに見える.
 E問題とG問題は実装ゲー.書ける気がしない.
 I問題は方針がわからない.
 残り1時間.
 貯めてた問題をそろそろサブミット.
 A問題・C問題・J問題を提出.通った×3.
I問題でも考えようか.
 ん,あれ.
 あ,電話かけてる人の中で一番IDが若い人から処理するのか.
 じゃ,シミュレーションするだけでね?
 2分探索して,O(N^2 log N)ぐらい.
 本当に2分探索して大丈夫? 計算量的にこうだろ.
 書く.
 サンプル合わない.
 2分探索したらダメらしい.
 えー.
 O(N^3)は無理っぽ.
 でも提出.TLE.
 ちょっとコード整理して枝刈りして提出.WA.え?
 書け直すタイミングが1間隔の時,処理ができてなかった.通った.ええええ.
終了.

ソースコード 問題A (C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

int main(){
  int i,j,k,l,m,n,q;
  char name[2000][20];
  int go[2000], st[2000];

  FILE *fp = fopen("A.txt","r");

  for(;;){
    fscanf(fp,"%d%d",&n,&q); if(!n) break;
    rep(i,n) fscanf(fp,"%s%d%d",name[i],go+i,st+i);
    while(q--){
      fscanf(fp,"%d",&m);
      rep(i,n) if(st[i]-go[i]+1<=m && m<=st[i]){
        printf("%s %d\n",name[i],go[i]-st[i]+m);
        break;
      }
      if(i==n) puts("Unknown");
    }
  }

  return 0;
}
ソースコード 問題B (C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define INF 1000000000

int main(){
  int i,j,k,l,m,n,c,add;
  int valid[9][9];
  int dp[2][9][9], next[2][9][9];
  char in[110000];

  FILE *fp = fopen("B.txt","r");

  rep(i,9) rep(j,9){
    valid[i][j] = 0;
    if(i==4 || j==4) continue;
    if(i%3 > j%3) continue;
    valid[i][j] = 1;
  }

  for(;;){
    fscanf(fp,"%s",in); if(in[0]=='#') break;
    rep(k,2) rep(i,9) rep(j,9) dp[k][i][j] = 0;
    for(m=0;;m++){
      if(in[m]<' ') break;
      c = in[m] - '1';
      rep(k,2) rep(i,9) rep(j,9) next[k][i][j] = INF;
      
      rep(k,2) rep(i,9) rep(j,9) if(dp[k][i][j]<INF){
        if(!valid[c][j]) continue;
        add = 0; if(k==0) add = 1;
        if(next[0][c][j] > dp[k][i][j]+add) next[0][c][j] = dp[k][i][j]+add;
      }
      rep(k,2) rep(i,9) rep(j,9) if(dp[k][i][j]<INF){
        if(!valid[i][c]) continue;
        add = 0; if(k==1) add = 1;
        if(next[1][i][c] > dp[k][i][j]+add) next[1][i][c] = dp[k][i][j]+add;
      }
      
      rep(k,2) rep(i,9) rep(j,9) dp[k][i][j] = next[k][i][j];
    }
    m=INF;
    rep(k,2) rep(i,9) rep(j,9) if(m > dp[k][i][j]) m = dp[k][i][j];
    printf("%d\n",m);
  }

  return 0;
}
ソースコード 問題C (C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define INF 1000000000

int hp_max;
int dp[5010];
int dmg[1010], rec[22], rs;

int main(){
  int i,j,k,l,m,n,go;
  int x, y, sx, sy;
  char mp[120][120];
  int ddd[120]; char tmp[120];
  int hp_init;

  FILE *fp = fopen("C.txt","r");

  for(;;){
    fscanf(fp,"%d%d",&hp_init,&hp_max); if(!hp_init) break;
    fscanf(fp,"%d%d",&x,&y);
    rep(i,x) fscanf(fp,"%s",mp[i]);

    rep(i,26) ddd[i]=0;

    fscanf(fp,"%d",&m);
    while(m--){
      fscanf(fp,"%s%d",tmp,&k);
      ddd[tmp[0]-'A'] = k;
    }

    n=0; sx=sy=0;
    fscanf(fp,"%d",&m);
    while(m--){
      fscanf(fp,"%s%d",tmp,&k);
      while(k--){
        if(tmp[0]=='U') sx--;
        if(tmp[0]=='D') sx++;
        if(tmp[0]=='L') sy--;
        if(tmp[0]=='R') sy++;
        dmg[n++] = ddd[mp[sx][sy]-'A'];
      }
    }

    fscanf(fp,"%d",&rs);
    rep(i,rs) fscanf(fp,"%d",rec+i);

    dp[0]=hp_init; REP(i,1,1<<rs) dp[i]=-INF;

    rep(k,n){
      rep(i,1<<rs) if(dp[i]>0) rep(j,rs) if(!(i&1<<j)){
        go = dp[i] + rec[j];
        if(go > hp_max) go = hp_max;
        if(dp[i^(1<<j)] < go) dp[i^(1<<j)] = go;
      }
      rep(i,1<<rs){
        dp[i] -= dmg[k];
        if(dp[i]<=0) dp[i] = -INF;
      }
    }

    k=0;
    rep(i,1<<rs) if(dp[i]>0) k++;
    if(k) puts("YES"); else puts("NO");
  }

  return 0;
}
ソースコード 問題D (C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

int lim;
char a[6][3][6], b[6][3][6];

void rot(int g){
  int i,j,k;

  if(g==0){
    rep(i,3) rep(j,3) b[0][i][j] = a[4][i][j];
    rep(i,3) rep(j,3) b[1][i][j] = a[1][j][2-i];
    rep(i,3) rep(j,3) b[2][i][j] = a[5][2-i][2-j];
    rep(i,3) rep(j,3) b[3][i][j] = a[3][2-j][i];
    rep(i,3) rep(j,3) b[4][i][j] = a[2][2-i][2-j];
    rep(i,3) rep(j,3) b[5][i][j] = a[0][i][j];
  }
  if(g==1){
    rep(i,3) rep(j,3) b[0][i][j] = a[0][2-j][i];
    rep(i,3) rep(j,3) b[1][i][j] = a[4][2-j][i];
    rep(i,3) rep(j,3) b[2][i][j] = a[2][j][2-i];
    rep(i,3) rep(j,3) b[3][i][j] = a[5][2-j][i];
    rep(i,3) rep(j,3) b[4][i][j] = a[3][2-j][i];
    rep(i,3) rep(j,3) b[5][i][j] = a[1][2-j][i];
  }
  rep(i,6) rep(j,3) rep(k,3) a[i][j][k]=b[i][j][k];
}

int solve(int depth){
  int i,j,k;

  rep(i,3) if(a[0][2][i]=='*') break;
  rep(j,3) if(a[2][2][j]=='*') break;
  if(i<3 && j<3) return 1;

/*  printf("\n%d\n",depth); rep(i,6) {rep(j,3) puts(a[i][j]); puts("");}*/
  
  if(depth == lim) return 0;
  
  rep(i,2){ rot(i); k=solve(depth+1); rot(i); rot(i); rot(i); if(k) return 1;}
  rep(i,2){ rot(i); rot(i); rot(i); k=solve(depth+1); rot(i); if(k) return 1;}
  return 0;
}

int main(){
  int i,j,k,l,m,n;

  FILE *fp = fopen("D.txt","r");

  for(;;){
    rep(i,6) rep(j,3) fscanf(fp,"%s",a[i][j]);
    if(a[0][0][0]=='#') break;

    for(lim=0;;lim++) if(solve(0)) break;
    printf("%d\n",lim);
  }

  return 0;
}
ソースコード 問題F (C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define EPS 1e-9
typedef struct oifha{double x, y;} pnt;

double ab(double x){if(x<0) return -x; return x;}
int sign(double x){if(x<-EPS) return -1; if(x>EPS) return 1; return 0;}
double dist(pnt p){return sqrt(p.x*p.x+p.y*p.y);}

pnt pplus(pnt a,pnt b){pnt r; r.x=a.x+b.x; r.y=a.y+b.y; return r;}
pnt pminus(pnt a,pnt b){pnt r; r.x=a.x-b.x; r.y=a.y-b.y; return r;}
pnt pmulti(pnt a,pnt b){pnt c; c.x=a.x*b.x-a.y*b.y; c.y=a.x*b.y+a.y*b.x; return c;}

pnt polar(double r,double t){pnt a; a.x=r*cos(t); a.y=r*sin(t); return a;}

pnt rotation(pnt a,pnt o,double t){
  return pplus(pmulti(pminus(a,o),polar(1.0,t)),o);
}


int main(){
  int i,j,k,m,n;
  pnt r,l,go,dd,cen,o;
  double tm;
  double dx, dy, a, g, th;
  double D;
  double pi = acos(0)*2;

  FILE *fp = fopen("F.txt","r");

  o.x=o.y=0;
  
  for(;;){
    fscanf(fp,"%d%lf",&n,&D); if(!n)break;
    r.y = l.y = 0; r.x=D; l.x=-D;
    while(n--){
      fscanf(fp,"%lf%lf%lf",&go.x,&go.y,&tm);
      go.x *= tm; go.y *= tm;
      go.x *= pi/180;
      go.y *= pi/180;

      if(sign(go.x-go.y)==0){
        dd = pminus(l,r);
        a = dist(dd);
        dd.x *= go.x/a; dd.y *= go.y/a;
        dd = rotation(dd,o,-pi/2);
        r = pplus(r,dd); l = pplus(l,dd);
        continue;
      }

      g = -2*D*go.y / (go.y-go.x);

      dd = pminus(l,r);
      a = dist(dd); dd.x/=a; dd.y/=a;
      dd.x *= g; dd.y *= g;
      cen = pminus(r,dd);

      if(ab(go.y) > ab(go.x)) th = -go.y / g;
      else                    th = -go.x / (2*D+g);
      r = rotation(r,cen,th);
      l = rotation(l,cen,th);
    }
    dd = pminus(l,r); a=dist(dd);
    r = pplus(r,l);
    r.x /= 2; r.y /= 2;
    printf("%.5lf\n%.5lf\n",r.x+EPS,r.y+EPS);
  }

  return 0;
}
ソースコード 問題H (C++言語)
#include<cstdio>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<string>
#include<utility>
using namespace std;

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define INF 1000000000

int main(){
  int i,j,k,l,m,n,now,cc;
  vector<int> edge[11111], dist[11111];
  int a[22222], b[22222], c[22222], d[22222];
  vector<int> res[11111];

  int alld[11111];
  priority_queue< pair<int,int> > q;
  
  FILE *fp = fopen("H.txt","r");

  for(;;){
    fscanf(fp,"%d%d",&n,&m); if(!n)break;
    rep(i,m) fscanf(fp,"%d%d%d%d",a+i,b+i,d+i,c+i), a[i]--, b[i]--;
    rep(i,n) edge[i].clear(), dist[i].clear();
    rep(i,m){
      edge[a[i]].push_back(b[i]); dist[a[i]].push_back(d[i]);
      edge[b[i]].push_back(a[i]); dist[b[i]].push_back(d[i]);
    }

    while(q.size()) q.pop();
    q.push( make_pair(0,0) );
    rep(i,n) alld[i]=INF; alld[0]=0;
    while(q.size()){
      k = q.top().second;
      now = -q.top().first;
      q.pop();
      if(alld[k] < now) continue;

      rep(j,edge[k].size()){
        i = edge[k][j];
        cc = now + dist[k][j];
        if(alld[i] > cc){
          alld[i] = cc;
          q.push( make_pair(-cc,i) );
        }
      }
    }

    rep(i,n) res[i].clear();
    rep(i,m){
      if(alld[a[i]] > alld[b[i]]) k=a[i], a[i]=b[i], b[i]=k;
      if(alld[b[i]] == alld[a[i]]+d[i]) res[b[i]].push_back(c[i]);
    }

    k=0;
    REP(i,1,n){
      sort(res[i].begin(), res[i].end());
      k += res[i][0];
    }
    printf("%d\n",k);
  }

  return 0;
}
ソースコード 問題I (C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

int n,T;
int M[1200], L[1200], K[1200], ok[1200];
int next_call[1200], next_wait[1200];
int rec[2200];

int solve(int res){
  int i,j,k,l,m,rest,tm;
  
  rest=res;
  rep(i,n) ok[i]=0;
  rep(i,T+1) rec[i]=0;
  
  rep(i,n) next_call[i] = 0, next_wait[i] = L[i];
  rep(tm,T+1){
    rest += rec[tm];
    
    rep(i,n) if(!ok[i] && next_wait[i] < tm){
      next_call[i] = next_wait[i]+K[i];
      next_wait[i] = next_call[i]+L[i];
      if(next_call[i]+M[i] > T) return 0;
    }

    rep(i,n) if(!ok[i] && rest){
      if(tm+M[i] > T) return 0;
      if(next_call[i] <= tm && tm <= next_wait[i]){
        k = tm + M[i];
        rec[k]++; ok[i]=1; rest--;
      }
    }
  }
  
  k=0; rep(i,n) k += ok[i];
  if(k==n) return 1;
  return 0;
}

int main(){
  int i,j,k,l,m,res;

  FILE *fp = fopen("I.txt","r");

  for(;;){
    fscanf(fp,"%d%d",&n,&T); if(!n)break;
    rep(i,n) fscanf(fp,"%d%d%d",M+i,L+i,K+i);
    for(res=1;;res++){
      if(solve(res)) break;
    }
    printf("%d\n",res);
  }
  
  return 0;
}
ソースコード 問題J (C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define INF 1000000000
#define N 2200
int edge[N][N], flow[N][N], inv[N][N], es[N], level[N], q[N];

void levelize(int n,int st,int ed){
  int i,j,k,t;
  int q_st, q_end;
  rep(i,n) level[i]=-1; level[st]=0; q_st=0; q_end=1; q[0]=st;
  while(q_st!=q_end){
    i=q[q_st++]; t=level[i]+1;
    rep(j,es[i]) if(flow[i][j]){
      k=edge[i][j]; if(level[k]>=0) continue;
      level[k]=t; q[q_end++]=k; if(k==ed) return;
    }
  }
}

int flowflow(int i,int ed,int lim){
  int j,k,res=0,t,s,ji;
  if(i==ed) return lim;
  rep(j,es[i]) if(flow[i][j]){
    k=edge[i][j]; if(level[k]<=level[i]) continue;
    s=lim; if(s>flow[i][j]) s=flow[i][j];
    t=flowflow(k,ed,s); if(!t) continue;
    res+=t; lim-=t; ji=inv[i][j];
    flow[i][j]-=t; flow[k][ji]+=t;
    if(!lim) break;
  }
  if(lim) level[i]=-1;
  return res;
}

int flowgo(int n,int st,int ed){
  int res=0;
  for(;;){
    levelize(n,st,ed); if(level[ed]==-1) break;
    res += flowflow(st,ed,INF);
  }
  return res;
}

void flowinit(int n){
  int i;
  rep(i,n) es[i]=0;
}

void add_edge(int n1,int n2,int f1,int f2){
  int s1=es[n1]++, s2=es[n2]++;
  edge[n1][s1]=n2; edge[n2][s2]=n1;
  flow[n1][s1]=f1; flow[n2][s2]=f2;
  inv[n1][s1]=s2;  inv[n2][s2]=s1;
}

int main(){
  int i,j,k,l,m,n,qs,q[1200],qt[1200];
  int node,st,ed;
  int d[120][120];

  FILE *fp = fopen("J.txt","r");

  for(;;){
    fscanf(fp,"%d%d%d",&n,&m,&qs); if(!n)break;
    rep(i,n) rep(j,n) d[i][j]=INF; rep(i,n) d[i][i]=0;
    while(m--){
      fscanf(fp,"%d%d%d",&i,&j,&k);
      if(d[i][j]>k) d[i][j]=d[j][i]=k;
    }
    rep(i,qs) fscanf(fp,"%d%d",q+i,qt+i);

    rep(k,n) rep(i,n) REP(j,i+1,n) if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[j][i]=d[i][k]+d[k][j];

    node = 2*qs; st=node++; ed=node++;
    flowinit(node);
    rep(i,qs) add_edge(st,i,1,0);
    rep(i,qs) add_edge(qs+i,ed,1,0);
    rep(i,qs) rep(j,qs) if(i!=j) if(qt[i]+d[q[i]][q[j]] <= qt[j]) add_edge(i,qs+j,1,0);

    k=flowgo(node,st,ed);
    printf("%d\n",qs-k);
  }

  return 0;
}

コメント

[C74] Problem C

I use DP
attention to this:
The agent can use more than one type of potion at once.
But the (3^12) transfer will lead to TLE
could you explain your code?

[C76]

DP can solve with O(1000 * 12 * 2^12).
Think that you can use potions one by one. (not simultaneously)
Let p be the number of potions.

for(i=0; i<(1<<p); i++) for(j=0; j<p; j++) if(potion j is not used){
update dp[i|(1<<j)] by using dp[i];
}

If you want to use potion 0 and 2, update dp[0] -> dp[1], then update dp[1] -> dp[5].
So, run above pseudo code before each movement.
  • 2011-01-31 21:13
  • rsujskf
  • URL
  • 編集

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1751-204763ba
この記事にトラックバックする(FC2ブログユーザー)

Appendix

Recent Articles

ブログ内検索

Ads


(プライバシーポリシー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。