週間目標 1/21~1/27

進捗

・基礎物理学演習 1.6途中

 絶望的に物理が分からない()

・レポート 途中

 コンデンサー終わらない

 

目標

TOEIC対策

・レポートやる()

 

TOEICが近いので英語する。

物理レポート死ね。

週間目標 1/14~1/20

先週忘れてたし、遊んでたので全然できてない() 

 

進捗

・基礎物理学演習 1.6途中

・英語長文問題精講 やってない

・なっとくする複素関数  やってない

 

目標

・基礎物理学演習 1.6章

・レポートやる()

 

今週はレポートが多いので少なめにしときます

目標 12/31~1/6

まずは今週の進捗

 

進捗

・基礎物理学演習 1.4章~1.5章

 分からなかったところ多々あり

・英語長文問題精講 1~2

 難しいですね

・なっとくする複素関数  1章~2章(途中)

 2章はもっと時間をかけてやります

・ABC 

 さっき出てきた

 

目標

・基礎物理学演習 1.6章

・英語長文問題精講 3

・なっとくする複素関数  2章

・競プロ (Atcoder)

 

とりあえず三日坊主にならなくて済んだ

目標 12/24~12/30

一週間の目標をこれから書いていきます。3日坊主にならないことを祈ります。

目標

・基礎物理学演習Ⅰ 1.4~1.5

・なっとくする複素関数 1章~2章

・英語長文問題精講 1~2

・ABCをやる

 

30日に進捗と次の目標を書きます。

雑な一年間の振り返り

こんにちは、つよっしーといいます。今年も一年の反省をしたいと思います。

 

1月~5月

覚えてない

 

6月

supercon予選があった気がする。gedrinku君が全部やってくれました。

 

7月

合宿たのしかった

 

8月

superconn本選。gedrinku君とひとつ屋根の下で一緒に寝ました。

 

9月

PCK予選、惨敗。普通に精進が足りなかった。gedrinku君に申し訳ない。

 

10月

高専祭にむけてゲーム(Tetris)を作ってた気がする。

 

11月

TOEICを受ける。死ぬ。

 

12月

昨日うぇーぶの展示をしてきました。とても寒かったです。

 

これを書いてて一年間があまりに虚無で絶望している。

来年はコンテストに積極的に参加したいです。

 

 

最後にですが僕も少しアイカツについて書こうと思います

 

アイカツ

見始めたのは、合宿でとなりでmuchoとwing3196がアイカツ上映会をしていたのがきっかけです。最初10話くらいは(もしかしたら20話くらいかもしれない)ネタのつもりで見てました。

どこから純粋に見始めたかは覚えていないけど37話で確実に堕ちました。

アイカツには、いっさい嫌なやつ(相手を嫌う人)は出てきません。全員がたとえ競い合う相手であってもリスペクトしあっています。これが僕にとって、とても新鮮であり面白かったです。

アイカツ、またはソレイユの素晴らしさを伝えるには余白があまりにも小さすぎるのでこの辺で終わりたいと思います。

明日は@terakinngyolaboです。

 

JOI惨敗日誌2

こんにちはつよっしーというものです。約1年ぶりにJOIの記事を書きます。結果は無惨に予選落ちでした。
誤読はするし、緊張で頭は回らず散々でしたね。まぁ、感想はのちほど書きます。

1問目・・・はい
2問目・・・誤読
3問目・・・はい
4問目・・・bitDPと終ってから分かった
5問目・・・座標でDPみたいなことするらしい(???)
6問目・・・拡張ダイクストラ
1~3はあれでしたが、4~6の中で一番解けそうな6が解けずに終わって予選落ちしたのが悲しい(2を誤読して4ケース落としてたのでどっちにしろ予選落ち)
6問目は答えの配列を1次元にしてたのでバグってた(悲しい)。一応予選終わった後に解いた6のコードをあげます。

#include<bits/stdc++.h>
#define int long long
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
static const int INF = 1ll<<60;
static const int dx[] = {0,0,1,-1};
static const int dy[] = {1,-1,0,0};
typedef pair< int,int > PII;
typedef pair< int,pair<int,int> > PPII;
typedef pair< int,pair<int,pair<int, int> > > PPPII;

struct edge{
    int to,cost;
    edge(){}
    edge(int p1,int p2){
        to=p1;
        cost=p2;
    }
};

vector<edge> G[10005];
int dist[10005][205][5];
int A[20005];
int N,M,X;


void dijkstra(int s){
    priority_queue<PPPII,vector<PPPII>,greater<PPPII> > que;
    for(int i=0;i<10005;++i)for(int j=0;j<=200;++j)for(int k=0;k<3;++k)dist[i][j][k]=INF;
    dist[s][0][A[s]]=0;
    que.push(PPPII(0,PPII(s,PII(0,A[s]))));
    while(!que.empty()){
        PPPII p = que.top();
        que.pop();
        int v=p.second.first;
        int time=p.second.second.first;
        int hot=p.second.second.second;
        if(dist[v][time][hot]<p.first)continue;
        for(int i=0;i<G[v].size();i++){
            edge e = G[v][i];
            int ntime,nhot;
            if(A[e.to]==0){
                if(hot==2){
                    if(time+e.cost<X)continue;
                    else {
                        ntime=0;
                        nhot=A[e.to];
                        if(dist[e.to][ntime][nhot]>dist[v][time][hot]+e.cost){
                            dist[e.to][ntime][nhot] = dist[v][time][hot]+e.cost;
                            que.push(PPPII(dist[e.to][ntime][nhot],PPII(e.to,PII(ntime,nhot))));
                        }
                    }
                }
                if(hot==0){
                    ntime=0;
                    nhot=A[e.to];
                    if(dist[e.to][ntime][nhot]>dist[v][time][hot]+e.cost){
                        dist[e.to][ntime][nhot] = dist[v][time][hot]+e.cost;
                        que.push(PPPII(dist[e.to][ntime][nhot],PPII(e.to,PII(ntime,nhot))));
                    }
                }
            }
            else if(A[e.to]==2){
                if(hot==0){
                    if(time+e.cost<X)continue;
                    else {
                        ntime=0;
                        nhot=A[e.to];
                        if(dist[e.to][ntime][nhot]>dist[v][time][hot]+e.cost){
                            dist[e.to][ntime][nhot] = dist[v][time][hot]+e.cost;
                            que.push(PPPII(dist[e.to][ntime][nhot],PPII(e.to,PII(ntime,nhot))));
                        }
                    }
                }
                if(hot==2){
                    ntime=0;
                    nhot=A[e.to];
                    if(dist[e.to][ntime][nhot]>dist[v][time][hot]+e.cost){
                        dist[e.to][ntime][nhot] = dist[v][time][hot]+e.cost;
                        que.push(PPPII(dist[e.to][ntime][nhot],PPII(e.to,PII(ntime,nhot))));
                    }
                }
            }

            else if(A[e.to]==1){
                ntime=time+e.cost;
                nhot=hot;
                if(ntime>=X)ntime=200;
                if(dist[e.to][ntime][nhot]>dist[v][time][hot]+e.cost){
                    dist[e.to][ntime][nhot] = dist[v][time][hot]+e.cost;
                    que.push(PPPII(dist[e.to][ntime][nhot],PPII(e.to,PII(ntime,nhot))));
                }
            }
        }
    }
}

signed main(){
    cin>>N>>M>>X;
    for(int i=0;i<N;++i)cin>>A[i];
    for(int i=0;i<M;++i){
        int a,b,c;
        cin>>a>>b>>c;
        a--;
        b--;
        G[a].PB(edge(b,c));
        G[b].PB(edge(a,c));
    }
    dijkstra(0);
    int ans=INF;
    for(int i=0;i<=200;++i){
        for(int j=0;j<3;++j){
            ans=min(ans,dist[N-1][i][j]);
        }
    }
    cout<<ans<<endl;
    return 0;
}

JOIの感想なんですが実力を十分に発揮できず悔しさが残りました。自分が本番に弱いのとコンテスト慣れしてなかったのが原因ですね。
これからについてなんですが競プロはJOIだけではないのでPCKやICPCに向けてこれまで以上に精進したいと思います。
あと、Imagine Capについてなんですが特に書くことが思いつかなかったので予選が終わったころにでも書きたいと思います。
お通夜みたいな記事になってしまいましたがJOIは@kuro_koji_と@_izrytと@gedorinkuの三人が僕の無念を晴らしてIOI代表になってくれるので応援しています。
次回は@Fukusan64です。

Reindeer with no sense of direction (方向音痴のトナカイ)

JOI難易度8の問題ですね。

Reindeer with no sense of direction | Aizu Online Judge

まあ、1<=N,M<=100なので全探索できそうってなったので全探索をした。
当然めちゃくちゃ遅い。
そこで空き地は移動するのに意味がないので家から家(教会)に飛ぶように変えることで遷移が結構減った。
これで一応、JOI予選だったらそこそこ待てば答えがでる。

#include<bits/stdc++.h>
#define int long long
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
static const int INF = 1ll<<60;
typedef pair<int,int> pii;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};


int N,M;
int feld[11][11];
int cnt;
pii last;
int ans;

void dfs(int x,int y,int sum){
    for(int i=0;i<4;++i){
        int nx=x;
        int ny=y;
        while(1){
            nx+=dx[i];
            ny+=dy[i];
            if(nx<0||nx>=N||ny<0||ny>=M)break;
            if(feld[ny][nx]==-1)break;
            if(feld[ny][nx]==1){
                feld[ny][nx]=-1;
                dfs(nx,ny,sum+1);
                feld[ny][nx]=1;
            }
            else if(feld[ny][nx]==2){
                if(sum==cnt){
                    ans++;
                    return ;
                }
            }
        }
    }
    return ;
}


signed main(){
    while(1){
        cin>>N>>M;
        if(N==0&&M==0)break;
        memset(feld,-1,sizeof(feld));
        for(int i=0;i<M;++i){
            for(int j=0;j<N;++j){
                cin>>feld[i][j];
                if(feld[i][j]==2){
                    last.FI=i;
                    last.SE=j;
                }
                else if(feld[i][j]==1)cnt++;
            }
        }
        dfs(last.SE,last.FI,0);
        cout<<ans<<endl;
        ans=0;
        cnt=0;
    }
}

しかしAOJではTLEなのでダメ。
もう少し考えると、すでに配り終わった状態からプレゼントを回収するというのを思いつく。
プレゼントを回収していないところは上空を飛ぶことができず、降り立ってプレゼントを回収し教会へ戻るというふうにすることで遷移の数が減り計算量もいい感じになった。

#include<bits/stdc++.h>
#define int long long
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
static const int INF = 1ll<<60;
typedef pair<int,int> pii;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};


int N,M;
int feld[11][11];
int cnt;
pii last;
int ans;

void dfs(int x,int y,int sum){
    for(int i=0;i<4;++i){
        int nx=x;
        int ny=y;
        while(1){
            nx+=dx[i];
            ny+=dy[i];
            if(nx<0||nx>=N||ny<0||ny>=M)break;
            if(feld[ny][nx]==1){
                feld[ny][nx]=-1;
                dfs(nx,ny,sum+1);
                feld[ny][nx]=1;
                break;
            }
            else if(feld[ny][nx]==2){
                if(sum==cnt){
                    ans++;
                    return ;
                }
            }
        }
    }
    return ;
}


signed main(){
    while(1){
        cin>>N>>M;
        if(N==0&&M==0)break;
        memset(feld,-1,sizeof(feld));
        for(int i=0;i<M;++i){
            for(int j=0;j<N;++j){
                cin>>feld[i][j];
                if(feld[i][j]==2){
                    last.FI=i;
                    last.SE=j;
                }
                else if(feld[i][j]==1)cnt++;
            }
        }
        dfs(last.SE,last.FI,0);
        cout<<ans<<endl;
        ans=0;
        cnt=0;
    }
}

はい(AC)
かなり時間をかけたのでもっと精進が必要ですね。