CF 復仇者聯盟場。。。c++
水題 A - Hulk(綠巨人)ide
輸出love hate。。。code
#include <bits/stdc++.h> typedef long long ll; const int N = 1e5 + 5; int main() { int n; scanf ("%d", &n); printf ("I hate"); for (int i=1; i<n; ++i) { if (i & 1) printf (" that I love"); else printf (" that I hate"); } puts (" it"); return 0; }
博弈+打表找規律 B - Spider Man(蜘蛛俠)blog
注意到每次多一個圈,以前的仍是初始狀態,各組是獨立的,因此打個表或者分析一下就能找到規律。get
#include <bits/stdc++.h> typedef long long ll; const int N = 1e5 + 5; int a[N]; int sg[105]; int SG(int x) { if (x < 2) return sg[x] = 0; bool vis[105]; memset (vis, false, sizeof (vis)); for (int i=1; i<x; ++i) { vis[SG (i) ^ (SG (x-i))] = true; } int &ret = sg[x] = 0; while (vis[ret]) ret++; return ret; } void test() { memset (sg, -1, sizeof (sg)); for (int i=1; i<=20; ++i) { printf ("sg[%d]=%d\n", i, SG (i)); } } int main() { //test (); int n; scanf ("%d", &n); for (int i=1; i<=n; ++i) scanf ("%d", a+i); int ans = 0; for (int i=1; i<=n; ++i) { int res = a[i] & 1 ? 0 : 1; ans ^= res; printf ("%d\n", ans ? 1 : 2); } return 0; }
構造 C - Thor(雷神)it
題意:一個手機有n個應用,有三種操做:class
1. 第x個應用有一個未讀信息;test
2. 讀完當前第x個應用的全部未讀信息;im
3. 讀完最前面t個信息(信息可能被重讀);di
每次操做後輸出當前未讀信息的條數。
思路:第3個操做「最前面t個」很關鍵,那麼只要進行max(t) 次操做。若是要讀的信息在以後時間點被讀掉(第2種操做)那就不更新,那麼維護下最新的「清空」的應用編號和時間便可。以前有個地方寫了continue,結果答案沒輸出,WA了很久。
#include <bits/stdc++.h> typedef long long ll; const int N = 3e5 + 5; int cnt[N]; int clear_time[N]; std::pair<int, int> que[N]; int main() { int n, q; scanf ("%d%d", &n, &q); int m = 0, ans = 0; int tp, x, t, maxt = 0; for (int i=1; i<=q; ++i) { scanf ("%d", &tp); if (tp == 1 || tp == 2) { scanf ("%d", &x); if (tp == 1) { cnt[x]++; ans++; que[++m] = {x, i}; } else { ans -= cnt[x]; cnt[x] = 0; clear_time[x] = i; } } else { scanf ("%d", &t); if (t > maxt) { for (int j=maxt+1; j<=t; ++j) { int pos = que[j].first, tim = que[j].second; if (clear_time[pos] >= tim) continue; cnt[pos]--; ans--; } maxt = t; } } printf ("%d\n", ans); } return 0; }