HDU-2017 多校训练赛3-1004-Kanade's trio
2017-08-02 23:16
393 查看
ACM模版
![](http://img.blog.csdn.net/20170802230653247?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZl96eWo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20170802230739352?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZl96eWo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
题解不难理解,就是有些出人意料了。看了题解后,我拿着官方题解,参考着写了一份,习惯性的将一些东西改成了自己的习惯……比如说,初始化能用 memset() 的都用 memset(),然后我就超时了……,很纳闷儿,再三斟酌,我尝试将初始化改成了循环初始化,发现一下子竟然 AC 了。这是最让我十分意外的,我一直以来都十分认可 memset(),以为他会快很多,但是,他并没有想象中那么快。之所以会超时是因为循环初始化人家用多少初始化多少,而 memset() 我则是习惯性的将整个数组初始化,导致时间消耗一下子上去了,题中有个很重要的条件,1≤∑n≤5∗105,所以,这里并没有直接给 n 的范围,为了肯定可行,我们都是开了足够大,但是我们绝大多数空间都是用不到的,如果每次都是 memset() 整个数组,自然是浪费太严重,时间消耗太高,TLE 也就正常了。
所以呢,以后一定要注意 memset() 函数的用处,并不能因为他效率高,而一味的简易处理,代码虽然简单了,TLE 也是没商量的事。
描述
题解
这个题思路十分巧妙,没想到竟然可以用字母树解。题解不难理解,就是有些出人意料了。看了题解后,我拿着官方题解,参考着写了一份,习惯性的将一些东西改成了自己的习惯……比如说,初始化能用 memset() 的都用 memset(),然后我就超时了……,很纳闷儿,再三斟酌,我尝试将初始化改成了循环初始化,发现一下子竟然 AC 了。这是最让我十分意外的,我一直以来都十分认可 memset(),以为他会快很多,但是,他并没有想象中那么快。之所以会超时是因为循环初始化人家用多少初始化多少,而 memset() 我则是习惯性的将整个数组初始化,导致时间消耗一下子上去了,题中有个很重要的条件,1≤∑n≤5∗105,所以,这里并没有直接给 n 的范围,为了肯定可行,我们都是开了足够大,但是我们绝大多数空间都是用不到的,如果每次都是 memset() 整个数组,自然是浪费太严重,时间消耗太高,TLE 也就正常了。
所以呢,以后一定要注意 memset() 函数的用处,并不能因为他效率高,而一味的简易处理,代码虽然简单了,TLE 也是没商量的事。
代码
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const int MAXN = 5e5 + 10; const int MAGIC = 30; template <class T> inline void scan_d(T &ret) { char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9') { ret = ret * 10 + (c - '0'), c = getchar(); } } int n, tot; int a[MAXN]; int go[MAXN << 5][2]; int num[MAXN << 5]; int tree[MAXN][MAGIC][2]; ll ss[MAXN << 5]; int main() { int T; scan_d(T); while (T--) { for (int i = 1; i <= tot; i++) { go[i][0] = go[i][1] = 0; ss[i] = num[i] = 0; } for (int i = 1; i <= n; i++) { for (int j = 0; j < MAGIC; j++) { tree[i][j][0] = tree[i][j][1] = 0; } } tot = 1; scan_d(n); for (int i = 1; i <= n; i++) { scan_d(a[i]); } for (int i = 1; i <= n; i++) { for (int j = 0; j < MAGIC; j++) { tree[i][j][0] = tree[i - 1][j][0]; tree[i][j][1] = tree[i - 1][j][1]; } for (int j = 0; j < MAGIC; j++) { int k = (a[i] & (1 << j)) > 0; tree[i][j][k]++; } } ll ans = 0; for (int i = n; i >= 1; i--) { int now = 1; for (int j = MAGIC - 1; j >= 0; j--) { int k = (a[i] & (1 << j)) > 0; if (go[now][k ^ 1]) { ans += ss[go[now][k ^ 1]] - num[go[now][k ^ 1]] * 1ll * tree[i][j][k]; } if (!go[now][k]) { break; } now = go[now][k]; } now = 1; for (int j = MAGIC - 1; j >= 0; j--) { int k = (a[i] & (1 << j)) > 0; if (!go[now][k]) { go[now][k] = ++tot; } now = go[now][k]; ss[now] += tree[i - 1][j][k ^ 1]; num[now]++; } } cout << ans << endl; } return 0; }
相关文章推荐
- HDU 2017 多校联合训练赛3 3003 6058 Kanade's sum 枚举 模拟链表
- HDU-2017 多校训练赛4-1004-Dirt Ratio
- HDU-2017 多校训练赛3-1003-Kanade’s sum
- HDU-2017 多校训练赛8-1002-Battlestation Operational
- HDU 2017 多校联合训练赛6 1010 6105 Gameia
- HDU-2017 多校训练赛7-补题
- HDU-2017 多校训练赛1-1002-Balala Power!
- HDU 6055 (2017 多校训练赛2 1011)Regular polygon
- HDU-2017 多校训练赛6-1008-Kirinriki
- HDU-2017 多校训练赛2-1001-Is Derek lying?
- HDU-2017 多校训练赛9-1008-Numbers
- HDU-2017 多校训练赛3-补题
- 2017 多校训练第三场 HDU 6058 Kanade's sum
- HDU 6059 Kanade's trio(2017 Multi-University Training Contest 3)
- HDU-2017 多校训练赛2-1006-Funny Function
- HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)
- HDU 2017 多校联合训练赛4 4003 6069 Counting Divisors 素数筛和素因数分解
- HDU 6043 (2017 多校训练赛1 1002) Balala Power!
- HDU 6105 (2017 多校训练赛6 1010)Gameia(博弈)
- HDU 2017 多校联合训练赛1 1002 6034 Balala Power 排序