几个易错点
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 }
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 }
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 }