首页 > 代码库 > 2014-7-19
2014-7-19
昨天做了两道题,感觉挺水的,就没写题解。但是今天感觉还是纪念一下我的努力吧。
第一道是POJ 3630 Phone List
一道基础的Trie树,但是因为采用了动态建树,刚开始就TLE了。最后用了静态储存的方法就过了。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 100010;struct N{ int next[11]; bool sign;}node[maxn];string s;int sum;bool add(){ int len = s.length(); int root = 0; for(int i = 0; i < len; i++) { int tmp = s[i] - ‘0‘; if(node[root].next[tmp]) { root = node[root].next[tmp]; if(i == len - 1) return 1; if(node[root].sign) return 1; } else { node[root].next[tmp] = sum; root = sum++; } if(i == len - 1) node[root].sign = 1; } return 0;}int main(){ int t; cin >> t; while(t--) { sum = 1; bool flag = 1; memset(node, 0, sizeof(node)); int n; cin >> n; for(int i = 0; i < n; i++) { cin >> s; if(flag) if(add()) flag = 0; } if(flag) cout << "YES" << endl; else cout << "NO" << endl; }}
第二道是POJ 3067 Japan
是一道树状数组的题。也很简单,但是我也是因为犯了很低级的错误导致WA和TLE了几发。
最后调试的时候发现 树状数组的更新,如果传进去的参数为负数就会死循环,一下恍然大悟,负数加起来最后会是0,之后就死了。
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int maxn = 1010;struct N{ int f, l;} node[maxn * maxn];int sum[maxn];int n, m, k;vector<int> p;bool cmp(N a, N b){ return a.f > b.f;}void insert(int t){ while(t <= m) { sum[t] += 1; t += t & (-t); }}int findsum(int t){ t--; int ret = 0; while(t > 0) { ret += sum[t]; t -= t & (-t); } return ret;}void print(){ for(int i = 1; i <= m; i++) cout << i << " " << sum[i] << endl;}int main(){ int t; cin >> t; for(int T = 0; T < t; T++) { memset(sum, 0, sizeof(sum)); cin >> n >> m >> k; for(int i = 0; i < k; i++) scanf("%d%d", &node[i].f, &node[i].l); sort(node, node + k, cmp); int tt = 0; while(node[tt].f == node[0].f) { insert(node[tt].l); tt++; } long long ans = 0; for(int i = tt; i < k; i++) { if(node[i].f == node[i - 1].f) { ans += findsum(node[i].l); p.push_back(node[i].l); } else { for(int j