JOI練習だよ。多分
今日予選の賞状もらた
0527
ネットでは個数をまとめて持っておく的なことが書いてあったけど、自分は区間っぽくやりました。。。
ちょっと無駄だったかも?w
最初は偶数個目で色を変えるときに、その前の集合とまとめわすれてWA。
#include <cstdio> #include <map> #include <stack> #define f first #define s second using namespace std; typedef pair<int, int> p; typedef pair<int, p> pp; // 0=white, 1=black int main() { int n; while (scanf("%d",&n)) { if (!n) break; stack<pp> list; int in; scanf("%d", &in); list.push(make_pair(in, make_pair(0, 1))); for (int i=1; i<n; i++) { scanf("%d",&in); if (i%2!=0) { pp bef=list.top(); list.pop(); // printf("%d %d %d\n", bef.f, bef.s.f, bef.s.s); if (bef.f==in) { bef.s.s++; list.push(bef); } else { if (list.empty()) { bef.f=in; bef.s.s++; list.push(bef); } else { pp bef2=list.top(); list.pop(); bef2.s.s=bef.s.s+1; list.push(bef2); } } } else { pp bef=list.top(); // printf("%d %d %d\n", bef.f, bef.s.f, bef.s.s); if (bef.f==in) { list.pop(); bef.s.s++; list.push(bef); } else { list.push(make_pair(in, make_pair(i, i+1))); } } } int res=0; while (!list.empty()) { pp x=list.top(); list.pop(); // printf("%d %d %d\n",x.f,x.s.f,x.s.s); if (!x.f) res+=x.s.s-x.s.f; } printf("%d\n",res); } }
0549
Webチラ見するまで二点間の距離をはかる基本的なアイデアを思いつけなかった・・・
これも経験なのだろうか(汗)
#include <cstdio> #include <algorithm> #define MOD 100000 using namespace std; int main() { int n, m; scanf("%d%d",&n,&m); int yado[n]; yado[0]=0; scanf("%d",&yado[1]); for (int i=2; i<n; i++) { scanf("%d",&yado[i]); yado[i]+=yado[i-1]; } int npos=0, in, res=0; for (int i=0; i<m; i++) { scanf("%d",&in); int s=npos, e=npos+in; npos=e; if (s>e) swap(s, e); // printf("%d %d\n",s,e); res += yado[e]-yado[s]; res %= MOD; } printf("%d\n",res); }
本選1番 in AOJコンプ