HDU 5496 - Beauty of Sequence (序列 + 统计贡献)
2015-10-03 23:07
465 查看
题意
统计所有子序列的和,子序列中连续的重复元素消去只剩一个。思路
看了snowy_smile巨巨在比赛时写的代码,每行代码都有注释,仰慕。考虑每个元素的贡献。
当前元素后面当然可以随便选,有2n−i种情况。
如果当前元素是第一个不重复的元素,那么显然前面2i−1也可以随便选。
如果不是,我们要从前面所有的情况里减去重复算的情况。
重复算的情况就是same[上一个]。
下面考虑如何维护same数组。
考虑累计到当前位置,包含当前元素的唯一情况数same[i]。也就是说,在same[i]包含的情况中,再加上当前的元素是没用的。same[i]由两部分组成
不包含当前位置的元素u,就是same[上一个u]。
包含当前位置的元素u,就是2i−1
把两部分相加就是最终的结果。
代码
#include <stack> #include <cstdio> #include <list> #include <cassert> #include <set> #include <fstream> #include <iostream> #include <string> #include <sstream> #include <vector> #include <queue> #include <functional> #include <cstring> #include <algorithm> #include <cctype> #pragma comment(linker, "/STACK:102400000,102400000") #include <string> #include <map> #include <cmath> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/hash_policy.hpp> using namespace std; //using namespace __gnu_pbds; #define LL long long #define ULL unsigned long long #define SZ(x) (int)x.size() #define lowbit(x) ((x) & (-x)) #define MP(a, b) make_pair(a, b) #define MS(p, num) memset(p, num, sizeof(p)) #define PB push_back #define X first #define Y second #define ROP freopen("input.txt", "r", stdin); #define MID(a, b) (a + ((b - a) >> 1)) #define LC rt << 1, l, mid #define RC rt << 1|1, mid+1, r #define LRT rt << 1 #define RRT rt << 1|1 #define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++) #define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++) const double PI = acos(-1.0); const int INF = 0x3f3f3f3f; const double eps = 1e-8; const int MAXN = 1e5+10; const int MOD = 1e9+7; const int dir[][2] = { {1, 0}, {0, -1}, {-1, 0}, {0, 1} }; const int seed = 131; int cases = 0; typedef pair<int, int> pii; LL b[MAXN], same[MAXN]; map<int, int> mp; int main() { //ROP; b[0] = 1; for (int i = 1; i < MAXN; i++) b[i] = b[i-1] * 2 % MOD; int T; scanf("%d", &T); while (T--) { int n; mp.clear(); scanf("%d", &n); LL ans = 0; for (int i = 1; i <= n; i++) { int tmp; scanf("%d", &tmp); if (!mp.count(tmp)) { same[i] = 0; ans = (ans + b[i-1]*b[n-i]%MOD*tmp) % MOD; } else { ans = (ans + (b[i-1]-same[mp[tmp]])*b[n-i]%MOD*tmp) % MOD; same[i] = same[mp[tmp]]; } same[i] = (same[i] + b[i-1]) % MOD; mp[tmp] = i; } printf("%lld\n", (ans+MOD) % MOD); } return 0; }
相关文章推荐
- hdoj1001解题报告
- HDU 2351 - One is an Interesting Number (模拟)
- UVa 10339 - Watching Watches (数学)
- UVa 10458 - Cricket Ranking (容斥)
- UVa 314 - Robot (bfs)
- 斯坦福大学王颖 浅谈ACM ICPC的题目风格和acm比赛近几年
- 【随笔】2015年ICPC四省赛/邀请赛小结
- HDU 5071 Chat (2014ICPC鞍山赛区现场赛B题)
- HUNAN NORMAL UNIVERSITY ACM/ICPC Judge Online 数字整除 java
- Japan poj3067--树状数组
- ACM的数学知识体系
- What ICPC taught me
- ACM 比赛须知
- 2015 ICPC 北京场E、F、G (计算几何)
- ACM ICPC Greater NewYork Region 2015 Problem E-A Rational Sequence
- 2016ICPC大连网赛 Weak Pair 线段树&&树状数组
- 2016icpc网络赛——青岛赛区
- 2016icpc网络赛——沈阳赛区
- 2016/41届ACM/ICPC大连现场赛D题&hdoj5974
- 2017ICPC乌鲁木齐网络赛 全题解