昨天做了两道题,感觉挺水的,就没写题解。但是今天感觉还是纪念一下我的努力吧。
第一道是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 = 0; j < p.size(); j++) insert(p[j]); p.clear(); ans += findsum(node[i].l); p.push_back(node[i].l); } } p.clear(); printf("Test case %d: %lld ", T + 1, ans); } }