• 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
    ", 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 }
    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("
    ");
    57     }
    58 }
    View Code
  • 相关阅读:
    适配器模式(2)
    设计模式之6大设计原则(1)
    Mybatis框架基础支持层——反射工具箱之MetaClass(7)
    Mybatis框架基础支持层——反射工具箱之实体属性Property工具集(6)
    Mybatis框架基础支持层——反射工具箱之对象工厂ObjectFactory&DefaultObjectFactory(5)
    Mybatis框架基础支持层——反射工具箱之泛型解析工具TypeParameterResolver(4)
    Guava动态调用方法
    数据库的数据同步
    springboot(二十二)-sharding-jdbc-读写分离
    springboot(二十一)-集成memcached
  • 原文地址:https://www.cnblogs.com/JHSeng/p/12202904.html
Copyright © 2020-2023  润新知