2013-08-05
■ SRM514(練習)
これから番号500~550あたりのセット(Div1)をこなしていこうかなあと思っています
正誤表記:
AC:時間内に解けた
o:時間内に解けなかったが独力で解けた
△:解説をみて通した
x:まだできてない
というわけで今日はSRM514を解いてみました
結果:
AC,o,x / 210.43, (192,76), 0.0
210.43pts (当時)127位相当
Easy:
まず
(0,0)->(1,n)->(2,0)という動き方と
(0,0)->(1,n)->(n+1,n-1)->(1,n-2)という動き方ができるので
n%2==0なら(1,n-2)->...(1,0)より
偶数のものが1つあればできる。
奇数の時でも
(even,even),(odd,odd)は作れることがわかる。
で、nがoddだとn≡1なのでx座標,y座標の偶奇は一致する。
よって偶奇が一致しないとだめ。
以上のことをまとめればいい。こういう超弱実装の思考ゲーたのしい。
//E? Nandatte? #include#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef pair<int,int> P; typedef pair<int,P> P1; typedef pair P2; #define pu push #define pb push_back #define mp make_pair #define eps 1e-7 #define INF 2000000000 class MagicalGirlLevelOneDivOne{ public: string isReachable(vector <int> jumpTypes, int x, int y) { bool ok=false; for(int i=0;i
if(jumpTypes[i]%2==0) ok=true; if(ok) return "YES"; if(abs(x-y)%2==1) return "NO"; return "YES"; } };
Medium:
600点問題。
要約:長方形に含まれるどの縦の1*n,横の1*mに含まれている数字の和がoddになる数字の埋め方は?
少し考えると,mod 2で考えたとき
n*mの長方形を繰り返し貼付けたようなものではないといけないと分かる。
よって、n*mの長方形において、0,1を埋めて各々のマスに対して処理をすればいい。
まず0,1の埋め方を考える。
ぱっと見2^100通りの探索が必要に思えるが
あくまでmod2で考えればいいので
dp[i][a]=(1列目からi列目まで埋めて、各列を数字ととらえそのxorをaとする埋め方)とすると
O(10*2^20)で計算でき、求める解はdp[n][(1< 余りは確定したので後は実際に値を埋めていけばよいが、 実は1なら5通り0なら4通りなのでその累乗を適当にかければいい。 本番で40人くらいしか通してない問題なので解けて嬉しい。 あとwriterがwrongさんでした。 P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
#define mod 1000000007
int val[12][12];
int am[12][12]={};
class MagicalGirlLevelTwoDivOne{
public:
int theCount(vector
//E? Nandatte?
#include