zoukankan      html  css  js  c++  java
  • 最近几道hihocode不会做的题目

    几个易错点

    1.数据范围一定要开大,一般多开10个或者5个。

    2. 从经常写 int a[n], 然后访问a[n], 这显然会下标越界。

    3. 浮点数,无法精确的比较,等于,大于,小于, 都需要使用eps, 这个坑以前不怎么遇到。如果能用int, 就能免除浮点数的精度影响。

    4. unsigned int 和int的比较, 尤其是这样:你用有一个vector的size跟负数进行比较,这样显然会出错, 会把负数当做无符号数字进行转化,然后比较,就会出错。这应该算隐式转换的坑吧。

    1. https://hihocoder.com/problemset/problem/1571?sid=1170501

    每个插槽无关,我以为是背包,但是数据很大,m=1e4, k = 1e5, 结果太大,最后看答案是贪心。每个插槽对于非高级武器,就是从高到低选取相应个数,对于

    高级武器,由于总个数的限制,所以计算对相应槽位的贡献,然后贪心的选取最大的k个。这类题目还是不怎么会做。

     1 #include<bits/stdc++.h>
     2 #define pb push_back
     3 typedef long long ll;
     4 using namespace std;
     5 typedef pair<int, int> pii;
     6 const int maxn = 1e5 + 10;
     7 int n, m, k;
     8 struct node {
     9     int v, p, t;
    10     bool operator<(const node&x) const {
    11         return v > x.v;
    12     }
    13 };
    14 node a[maxn];
    15 vector<int> e[maxn];
    16 int c[maxn];
    17 vector<int> jar;
    18 void solve() {
    19     scanf("%d%d%d", &n, &m, &k);
    20     int x, y, z;
    21     for (int i = 0; i < n; i++) {
    22         scanf("%d%d%d", &x, &y, &z);
    23         a[i] = {x, y, z};
    24     }
    25     sort(a, a + n);
    26     for (int i = 1; i <= m; i++) {
    27         scanf("%d", &c[i]);
    28         e[i].clear();
    29     }
    30     ll res = 0;
    31     for (int i = 0; i < n; i++) {
    32         if(a[i].t) continue;
    33         if(e[a[i].p ].size() < c[a[i].p ]) {
    34             e[a[i].p ].pb(a[i].v);
    35             res += a[i].v;
    36         }
    37     }
    38     jar.clear();
    39     for (int i = 0; i < n; i++) {
    40         if(a[i].t == 0) continue;
    41         if((int)e[a[i].p ].size() < c[a[i].p ]) {
    42             jar.pb(a[i].v);
    43         } else if(c[a[i].p ] > 0){
    44             jar.pb(a[i].v - e[a[i].p ][c[a[i].p ] - 1]);
    45         }
    46         c[a[i].p ]--;
    47     }
    48     sort(jar.begin(), jar.end(), greater<int>());
    49     for (int i = 0; i < k && i < jar.size(); i++) {
    50         if(jar[i] <= 0) break;
    51         res += jar[i];
    52     }
    53     printf("%lld
    ", res);
    54 
    55 }
    56 
    57 int main() {
    58     //freopen("test.in", "r", stdin);
    59     //freopen("test.out", "w", stdout);
    60     int _;
    61     scanf("%d", &_);
    62     while(_--)
    63     solve();
    64     return 0;
    65 }
    View Code

    2. https://hihocoder.com/problemset/problem/1561?sid=1171714

    并查集维护集合,set维护顺序,关键是对边权从小到大遍历进行处理。没有做出来。

     1 #include<bits/stdc++.h>
     2 #define pb push_back
     3 typedef long long ll;
     4 using namespace std;
     5 typedef pair<int, int> pii;
     6 const int maxn = 2e5 + 10;
     7 int f[maxn], sz[maxn];
     8 
     9 int fd(int x) {
    10     if(x == f[x]) return x;
    11     return f[x] = fd(f[x]);
    12 }
    13 void un(int x, int y) {
    14     if(sz[x] <= sz[y]) {
    15         f[x] = y;
    16         sz[y] += sz[x];
    17     } else {
    18         f[y] = x;
    19         sz[x] += sz[y];
    20     }
    21 }
    22 struct node {
    23     int x, y, v, id;
    24     bool operator<(const node&t)const {
    25         return v < t.v;
    26     }
    27 };
    28 node a[maxn];
    29 int n, m;
    30 pii res[maxn];
    31 set<int> se[maxn];
    32 void init(int n) {
    33     for (int i = 0; i <= n; i++) f[i] = i,sz[i] = 1, se[i].insert(i);
    34 }
    35 void solve() {
    36 
    37     scanf("%d%d", &n, &m);
    38     init(n);
    39     int x, y, v;
    40     for (int i = 0; i < m; i++) {
    41         scanf("%d%d%d", &x, &y, &v);
    42         a[i] = {x, y, v, i};
    43     }
    44     sort(a, a + m);
    45     for (int i = 0; i < m; i++) {
    46         x = fd(a[i].x);
    47         y = fd(a[i].y);
    48         //cout << x << " " << y << endl;
    49         if(x != y) {
    50             int t1 = *se[x].rbegin(), t2 = *se[y].rbegin();
    51             if(t1 > t2) {
    52                 res[a[i].id ] = {t2, *se[x].lower_bound(t2)};
    53             } else {
    54                 res[a[i].id ] = {t1, *se[y].lower_bound(t1)};
    55             }
    56             if(sz[x] >= sz[y]) {
    57                 f[y] = x; sz[x] += sz[y];
    58                 se[x].insert(se[y].begin(), se[y].end());
    59             } else {
    60                 f[x] = y; sz[y] += sz[x];
    61                 se[y].insert(se[x].begin(), se[x].end());
    62             }
    63         } else {
    64             res[a[i].id ] = {0,0};
    65         }
    66     }
    67     for (int i = 0; i < m; i++)
    68         printf("%d %d
    ", res[i].first, res[i].second);
    69 }
    70 
    71 int main() {
    72     //freopen("test.in", "r", stdin);
    73     //freopen("test.out", "w", stdout);
    74     solve();
    75     return 0;
    76 }
    View Code

    3. https://hihocoder.com/problemset/problem/1145?sid=1171476

    很早的一个题目,我只会使用树状数组离线查询, 不知道线段树怎么在线查询,这个需要好好学习一下。

     1 #include<bits/stdc++.h>
     2 #define pb push_back
     3 typedef long long ll;
     4 using namespace std;
     5 typedef pair<int, int> pii;
     6 const int maxn = 1e5 + 10;
     7 
     8 int n, m;
     9 vector<int> e[maxn];
    10 int f[maxn];
    11 int lb(int x) {
    12     return x & -x;
    13 }
    14 void up(int x) {
    15     while(x <= n) {
    16         f[x]++;
    17         x += lb(x);
    18     }
    19 }
    20 int ask(int x) {
    21     int r = 0;
    22     while(x > 0) {
    23         r += f[x];
    24         x -= lb(x);
    25     }
    26     return r;
    27 }
    28 vector<pii> a[maxn];
    29 int res[maxn];
    30 void solve() {
    31     scanf("%d%d", &n, &m);
    32     int x, y;
    33     for (int i = 1; i < n; i++) {
    34         scanf("%d%d", &x, &y);
    35         if(x > y) swap(x, y);
    36         e[x].pb(y);
    37     }
    38     for (int i = 1; i <= m; i++) {
    39         scanf("%d%d", &x, &y);
    40         a[x].pb({y, i});
    41     }
    42     for (int i = 100000; i >= 1; i--) {
    43         for (int u : e[i]) {
    44             up(u);
    45         }
    46         for (pii t : a[i]) {
    47             res[t.second] = (t.first - i + 1) - ask(t.first);
    48         }
    49     }
    50     for (int i = 1; i <= m; i++)
    51         printf("%d
    ", res[i]);
    52 }
    53 
    54 int main() {
    55     //freopen("test.in", "r", stdin);
    56     //freopen("test.out", "w", stdout);
    57     solve();
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    eclipse下切换svn用户
    Netty实现服务端客户端长连接通讯及心跳检测
    Spring Batch系列总括(转载)
    SQL中的Null深入研究分析
    MySQL报错“1366
    Memcache学习php完整一例
    Memcache学习笔记
    递归和迭代区别
    解决textarea 输出有空格问题
    解决mysql安装出现error Nr.1045问题
  • 原文地址:https://www.cnblogs.com/y119777/p/7525173.html
Copyright © 2011-2022 走看看