您的位置:首页 > 大数据 > 人工智能

Codeforces 145D Lucky Pair (组合计数)

2016-03-31 14:55 393 查看
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <set>
#include <ctime>
#include <cstdlib>
using namespace std;

#define inf 0x3f3f3f3f
#define N 1000020
#define M 1000020
#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define ls (i << 1)
#define rs (ls | 1)
#define md (ll + rr >> 1)
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define B 350

int n, a
, san
, cnt;
int pre
;
set<int> st;
set<int>::iterator p, q;

ULL calc() {
LL ret = 1ull * n * (n - 1) / 2 * (n - 2) / 3 * (n - 3) / 4;
ret += 1ull * 2 * n * (n - 1) * (n - 2) / 6;
ret += 1ull * n * (n - 1) / 2;
return ret;
}

bool lucky(int x) {
while(x) {
if(x % 10 != 4 && x % 10 != 7) return 0;
x /= 10;
}
return 1;
}

int main() {
scanf("%d", &n);
ULL ans = calc();
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if(lucky(a[i])) {
san[++cnt] = i;
}
}
san[++cnt] = n + 1;

for(int i = 1; i < cnt; ++i) {
pre[i] = 0;
for(int j = 1; j < i; ++j) {
if(a[san[i]] == a[san[j]]) {
pre[i] = j;
}
}
}
for(int i = 2; i < cnt; ++i) {
st.clear();
st.insert(0);
ULL tmp = 0;
for(int j = i; j < cnt; ++j) {
if(pre[j] < i) {
for(int k = pre[j]; k; k = pre[k]) {
p = st.lower_bound(san[k]);
q = p;
p--;
if(q != st.end()) {
tmp += 1ull * (san[k] - *p) * (*q - san[k]) * (san[i] - san[i-1]);

}
else {
tmp += 1ull * (san[k] - *p) * (san[i] - san[i-1] + 1) * (san[i] - san[i-1]) / 2;
tmp += 1ull * (san[k] - *p) * (san[i-1] - san[k]) * (san[i] - san[i-1]);
}
st.insert(san[k]);
}
}
ans -= tmp * (san[j+1] - san[j]);

}
}
cout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: