• #13:人十我一Orz——6


    水题放送,写得依旧丑:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <vector>
     6 using namespace std;
     7 
     8 const int INF = 2e9 + 2333;
     9 typedef long long ll;
    10 typedef pair<int, int> P;
    11 int H, G;
    12 ll f[1005][1005][2];
    13 int dishg[1005][1005];
    14 int dish[1005], disg[1005];
    15 vector<P> hh, gg;
    16 
    17 int sqr(int x) {
    18     return x * x;
    19 }
    20 
    21 int dis(vector<P> v1, int i, vector<P> v2, int j) {
    22     return sqr(v1[i].first - v2[j].first) + sqr(v1[i].second - v2[j].second);
    23 }
    24 
    25 void init() {
    26     for (int i = 1; i <= H; i++)
    27         for (int j = 1; j <= G; j++)
    28             dishg[i][j] = dis(hh, i, gg, j);
    29     f[1][0][1] = INF;
    30     for (int i = 2; i <= H; i++) {
    31         dish[i] = dis(hh, i-1, hh, i);
    32         f[i][0][0] = f[i-1][0][0] + dish[i];
    33         f[i][0][1] = INF;
    34     }
    35     for (int j = 1; j <= G; j++) {
    36         disg[j] = dis(gg, j-1, gg, j);
    37         f[0][j][1] = INF;
    38         f[0][j][0] = INF;
    39     }
    40 }
    41 
    42 ll dp() {
    43     for (int i = 1; i <= H; i++) {
    44         for (int j = 1; j <= G; j++) {
    45             ll a = min(f[i-1][j][0] + dish[i], f[i-1][j][1] + dishg[i][j]);
    46             ll b = min(f[i][j-1][0] + dishg[i][j], f[i][j-1][1] + disg[j]);
    47             f[i][j][0] = a;
    48             f[i][j][1] = b;
    49         }
    50     }
    51     return f[H][G][0];
    52 }
    53 
    54 int main() {
    55     scanf("%d%d", &H, &G);
    56     hh.push_back(P(0, 0));
    57     gg.push_back(P(0, 0));
    58     for (int i = 1; i <= H; i++) {
    59         int x, y;
    60         scanf("%d%d", &x, &y);
    61         hh.push_back(P(x, y));
    62     }
    63     for (int i = 1; i <= G; i++) {
    64         int x, y;
    65         scanf("%d%d", &x, &y);
    66         gg.push_back(P(x, y));
    67     }
    68     init();
    69     printf("%lld
    ", dp());
    70     return 0;
    71 }
    BZOJ4745
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <vector>
     6 using namespace std;
     7 
     8 const int INF = 2e9 + 2333;
     9 typedef long long ll;
    10 typedef pair<int, int> P;
    11 int N, H, Delta;
    12 int f[2005][2005], eat[2005][2005];
    13 int pos1[2005];
    14 
    15 int dp() {
    16     for (int i = 1; i <= H; i++) {
    17         int maxx = 0;
    18         for (int j = 1; j <= N; j++) {
    19             f[i][j] = f[i-1][j];
    20             if (i > Delta) {
    21                 int t = i - Delta;
    22                 f[i][j] = max(f[i][j], f[t][pos1[t]]);
    23             }
    24             f[i][j] += eat[j][i];
    25             if (f[i][j] > maxx) {
    26                 maxx = f[i][j];
    27                 pos1[i] = j;
    28             }
    29         }
    30     }
    31     int ans = 0;
    32     for (int i = 1; i <= N; i++)
    33         ans = max(ans, f[H][i]);
    34     return ans;
    35 }
    36 
    37 int main() {
    38     scanf("%d%d%d", &N, &H, &Delta);
    39     for (int i = 1; i <= N; i++) {
    40         int ni, pos;
    41         for (scanf("%d", &ni); ni; ni--) {
    42             scanf("%d", &pos);
    43             eat[i][pos]++;
    44         }
    45     }
    46     printf("%d
    ", dp());
    47     return 0;
    48 }
    BZOJ1270
     1 #include <bits/stdc++.h>
     2 #define ri readint()
     3 #define gc getchar()
     4 #define ls p << 1
     5 #define rs p << 1 | 1
     6 using namespace std;
     7 
     8 typedef long long ll;
     9 const int maxn = 100005;
    10 int n, m;
    11 struct Seg {
    12     int l, r;
    13     bool fixed;
    14     ll sum;
    15 }t[maxn << 2];
    16 
    17 inline int readint() {
    18     int x = 0, s = 1, c = gc;
    19     while (c <= 32)    c = gc;
    20     if (c == '-')    s = -1, c = gc;
    21     for (; isdigit(c); c = gc)
    22         x = x * 10 + c - 48;
    23     return x * s;
    24 }
    25 
    26 void build(int l, int r, int p) {
    27     t[p].l = l, t[p].r = r;
    28     if (l == r) {
    29         t[p].sum = ri;
    30         t[p].fixed = t[p].sum <= 1ll;
    31         return;
    32     }
    33     int mid = (l + r) >> 1;
    34     build(l, mid, ls);
    35     build(mid+1, r, rs);
    36     t[p].sum = t[ls].sum + t[rs].sum;
    37     t[p].fixed = t[ls].fixed && t[rs].fixed;
    38 }
    39 
    40 void Update(int l, int r, int p) {
    41     if (t[p].fixed)    return;
    42     if (t[p].l == t[p].r) {
    43         t[p].sum = sqrt(t[p].sum);
    44         t[p].fixed = t[p].sum <= 1ll;
    45         return;
    46     }
    47     int mid = (t[p].l + t[p].r) >> 1;
    48     if (l <= mid)    Update(l, r, ls);
    49     if (mid < r)    Update(l ,r, rs);
    50     t[p].sum = t[ls].sum + t[rs].sum;
    51     t[p].fixed = t[ls].fixed && t[rs].fixed;
    52 }
    53 
    54 ll Query(int l, int r, int p) {
    55     if (l <= t[p].l && t[p].r <= r)
    56         return t[p].sum;
    57     int mid = (t[p].l + t[p].r) >> 1;
    58     ll res = 0ll;
    59     if (l <= mid)    res += Query(l, r, ls);
    60     if (mid < r)    res += Query(l, r, rs);
    61     return res;
    62 }
    63 
    64 int main() {
    65     n = ri;
    66     build(1, n, 1);
    67     for (m = ri; m; m--) {
    68         int x = ri, l = ri, r = ri;
    69         if (x == 1) {
    70             printf("%lld
    ", Query(l, r, 1));
    71         } else {
    72             Update(l, r, 1);
    73         }
    74     }
    75     return 0;
    76 }
    BZOJ3211

    cf818E,计数不一定非要乘法原理,枚举标杆累加。此题性质符合尺取,l和r可不断后移。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn = 1e5 + 5;
     5 int n, k, a[maxn];
     6 int pri[55], cnt[55], t;
     7 int b[maxn][55];
     8 
     9 void div(int k) {
    10     for (int i = 2; i * i <= k; i++) {
    11         if (k % i == 0) {
    12             pri[++t] = i;
    13             while (k % i == 0) {
    14                 k /= i;
    15                 cnt[t]++;
    16             }
    17         }
    18     }
    19     if (k > 1) {
    20         pri[++t] = k;
    21         cnt[t] = 1;
    22     }
    23 }
    24 
    25 long long two_point() {
    26     int l = 1, r = 0;
    27     long long ans = 0;
    28     while (l <= n) {
    29         bool valid = false;
    30         while (r < n && !valid) {
    31             r++;
    32             valid = true;
    33             for (int j = 1; j <= t; j++)
    34                 valid &= (b[r][j] - b[l-1][j]) >= cnt[j];
    35         }
    36         if (!valid)    break;
    37         while (l <= r && valid) {
    38             ans += n - r + 1;
    39             l++;
    40             for (int j = 1; j <= t; j++)
    41                 valid &= (b[r][j] - b[l-1][j]) >= cnt[j];
    42         }
    43     }
    44     return ans;
    45 }
    46 
    47 int main() {
    48     scanf("%d%d", &n, &k);
    49     div(k);
    50     for (int i = 1; i <= n; i++) {
    51         scanf("%d", &a[i]);
    52         for (int j = 1; j <= t; j++) {
    53             while (a[i] % pri[j] == 0) {
    54                 a[i] /= pri[j];
    55                 b[i][j]++;
    56             }
    57             b[i][j] += b[i-1][j];
    58         }
    59     }
    60     cout << two_point() << endl;
    61     return 0;
    62 }
    View Code

    cf818F,我强猜一下结论的原因:难道是因为完全图边多、链桥多,所以边多桥多就凑一起?

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long ll;
     5 int q;
     6 ll n;
     7 
     8 ll judge(ll k) {
     9     return n - k + min(n - k, (k*k - k) / 2);
    10 }
    11 
    12 int main() {
    13     ios_base::sync_with_stdio(false);
    14     cin.tie(0);
    15     for (cin >> q; q; q--) {
    16         cin >> n;
    17         ll l = 1, r = n;
    18         while (l < r-2) {
    19             ll lmid = (l + r) >> 1;
    20             ll rmid = (lmid + r) >> 1;
    21             if (judge(lmid) < judge(rmid))
    22                 l = lmid;
    23             else    r = rmid;
    24         }
    25         cout << max(judge(r), judge((l + r) >> 1)) << "
    ";
    26     }
    27     return 0;
    28 }
    View Code

    cf822D,遍历素因子的技巧值得学习。以及貌似第一发猜的结论好像是对的但是我写挂了……but还是正解优雅。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long ll;
     5 const int maxn = 5e6 + 5;
     6 const int mod = 1e9 + 7;
     7 const ll INF = 1e18;
     8 int t, l, r;
     9 ll f[maxn];
    10 int primes[maxn];
    11 
    12 void init() {
    13     for (int i = 2; i <= r; i++) {
    14         primes[i] = i;
    15         f[i] = INF;
    16     }
    17     for (int i = 2; i * i <= r; i++) {//不采集素数时不需遍历maxn
    18         if (primes[i] == i) {
    19             for (int j = i * i; j <= r; j += i)
    20                 primes[j] = min(primes[j], i);
    21         }
    22     }
    23     for (int i = 2; i <= r; i++) {
    24         for (int j = i; j != 1; j /= primes[j]) {//遍历素因子
    25             f[i] = min(f[i], f[i / primes[j]] + 1LL * i * (primes[j] - 1) / 2LL);
    26         }
    27     }
    28 }
    29 
    30 int main() {
    31     scanf("%d%d%d", &t, &l, &r);
    32     init();
    33     ll ans = 0, tt = 1;
    34     for (int i = l; i <= r; i++) {
    35         f[i] %= mod;
    36         ans = (ans + tt * f[i]) % mod;
    37         tt = tt * t % mod;
    38     }
    39     cout << ans << endl;
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    统计知识选讲(二)——主成分分析(PCA)的推导和应用
    统计知识选讲(一)——主成分分析(PCA)的思想
    数模学习笔记(八)——遗传算法
    数模学习笔记(六)——灰色系统
    数模学习笔记(五)——BP神经网络
    数模学习笔记(四)——AHP
    数模学习笔记(三)
    数模学习笔记(二)
    推荐决策 对比user-based 和item-based推荐算法
    Mysql事件学习
  • 原文地址:https://www.cnblogs.com/AlphaWA/p/10372482.html
Copyright © 2020-2023  润新知