2018-2019 9th BSUIR Open Programming Championship

最后一天集训,大家说开个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\n", depth);
 70         return;
 71     }
 72     dfs(dp[curr].second, depth + 1);
 73     printf("%d %d\n", 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 }
View Code

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 }
View Code

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("\n");
57     }
58 }
View Code

 

posted @ 2020-01-16 19:35  JHSeng  阅读(736)  评论(0编辑  收藏  举报