最后一天集训,大家说开个5星难度的gym玩玩,没想到爆炸难……3题爬了。
D
O(n^2logn)+强剪枝才过了
solver: czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 1e5 + 10; 21 struct Node { 22 int id, x; 23 Node() {} 24 Node(int _id, int _x): id(_id), x(_x) {} 25 bool operator<(const Node &rhs)const { 26 return x < rhs.x || x == rhs.x && id < rhs.id; 27 } 28 } card[maxn]; 29 pair<int, int> dp[maxn], segT[maxn << 2]; 30 int n, pass, numOfCard = 0, ans = 0, __begin = 0; 31 32 void maintain(int curpos) { 33 segT[curpos] = max(segT[lson], segT[rson]); 34 } 35 36 void build(int curpos, int curl, int curr) { 37 if (curl == curr) { 38 segT[curpos] = mp(0, -1); 39 return; 40 } 41 int mid = curl + curr >> 1; 42 build(lson, curl, mid); build(rson, mid + 1, curr); 43 maintain(curpos); 44 } 45 46 pair<int, int> query(int curpos, int curl, int curr, int ql, int qr) { 47 if (ql > qr) return mp(0, -1); 48 if (ql <= curl && curr <= qr) return segT[curpos]; 49 int mid = curl + curr >> 1; 50 pair<int, int> ans = mp(0, -1); 51 if (ql <= mid) ans = max(ans, query(lson, curl, mid, ql, qr)); 52 if (qr > mid) ans = max(ans, query(rson, mid + 1, curr, ql, qr)); 53 return ans; 54 } 55 56 void update(int curpos, int pos, int curl, int curr, pair<int, int>val) { 57 if (curl == curr) { 58 segT[curpos] = max(segT[curpos], val); 59 return; 60 } 61 int mid = curl + curr >> 1; 62 if (pos <= mid) update(lson, pos, curl, mid, val); 63 else update(rson, pos, mid + 1, curr, val); 64 maintain(curpos); 65 } 66 67 void dfs(int curr, int depth) { 68 if (curr == -1) { 69 printf("%d ", depth); 70 return; 71 } 72 dfs(dp[curr].second, depth + 1); 73 printf("%d %d ", card[curr].id, card[curr].x); 74 } 75 76 int main() { 77 scanf("%d%d", &n, &pass); 78 for (int i = 1; i <= n; i++) { 79 int num; scanf("%d", &num); 80 for (int j = 1; j <= num; j++) { 81 int x; scanf("%d", &x); 82 card[++numOfCard] = Node(i, x); 83 } 84 } 85 build(1, 1, n); 86 sort(card + 1, card + 1 + numOfCard); 87 // O(n^2logn) LIS 88 for (int i = 1; i <= numOfCard;) { 89 for (int j = i; j <= numOfCard; j++) { 90 if (card[i].x != card[j].x) break; 91 int currID = card[j].id, currPos = ((currID - pass - 2) % n + n) % n + 1; 92 if (currPos < currID) dp[j] = query(1, 1, n, currPos, currID - 1); 93 else dp[j] = max(query(1, 1, n, currPos, n), query(1, 1, n, 1, currID - 1)); 94 } 95 int j; 96 for (j = i; j <= numOfCard; j++) { 97 if (card[i].x != card[j].x) break; 98 if (!dp[j].first && card[j].id > pass + 1) continue; 99 dp[j].first++; int pos = card[j].id; 100 update(1, pos, 1, n, mp(dp[j].first, j)); 101 } 102 i = j; 103 } 104 for (int i = 1; i <= numOfCard; i++) 105 if (dp[i].first > ans) { 106 ans = dp[i].first; 107 __begin = i; 108 } 109 if (!__begin) puts("0"); 110 else dfs(__begin, 0); 111 return 0; 112 }
H
白给
solver: czq
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int main() { 21 int t; cin >> t; 22 while (t--) { 23 int a, b; cin >> a >> b; 24 for (int i = 1; i <= 50; i++) { 25 if (i != a + b) { 26 cout << i << endl; 27 break; 28 } 29 } 30 } 31 return 0; 32 }
I
注意记忆化
solver: lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef pair<int, int> pii; 4 typedef long long ll; 5 #define ff first 6 #define ss second 7 #define mp make_pair 8 9 unordered_map<ll, pair<int, vector<ll>>> m; 10 void dfs(ll x, vector<ll> &tmpp) { 11 if (!x) 12 return; 13 if (m[x].ff) { 14 tmpp = m[x].ss; 15 return; 16 } 17 18 ll tmp = 10, res = x; 19 vector<ll> minn = vector<ll>(1, x); 20 21 while (x / tmp) { 22 ll tmp1 = x / tmp, tmp2 = x % tmp; 23 tmpp = vector<ll>(1, x); 24 dfs(abs(tmp1 - tmp2), tmpp); 25 if (tmpp.back() < res) { 26 res = tmpp.back(); 27 minn = tmpp; 28 } 29 tmp *= 10; 30 } 31 if (res != x) 32 tmpp = vector<ll>(1, x); 33 else 34 tmpp.clear(); 35 for (auto i : minn) 36 tmpp.push_back(i); 37 m[x] = mp(res, tmpp); 38 } 39 40 int main() { 41 for (int i = 1; i <= 9; i++) 42 m[i] = mp(i, vector<ll>(1, i)); 43 int t = 1000; 44 scanf("%d", &t); 45 while (t--) { 46 ll n = t + 1; 47 scanf("%lld", &n); 48 vector<ll> ans; 49 dfs(n, ans); 50 if (!m[n].ff) 51 m[n] = mp(n, vector<ll>(1, n)); 52 ans = m[n].ss; 53 printf("%d ", ans.size()); 54 for (auto i : ans) 55 printf("%lld ", i); 56 printf(" "); 57 } 58 }