1 条题解
-
0
C++ :
/* std:候选值(出现次数 >= 自身代号的值,数量 O(sqrt n))+ 二分统计区间出现次数 */ #include <cstdio> #include <algorithm> #include <vector> using namespace std; int n, m, K = 0, ncan = 0; int raw[100005], a[100005]; int srt[100005], cand[100005]; vector<int> occ[100005]; long long val[100005]; int main(){ if(scanf("%d", &n) != 1) return 0; for(int i = 1; i <= n; i++){ scanf("%d", &raw[i]); srt[i] = raw[i]; } sort(srt + 1, srt + n + 1); K = (int)(unique(srt + 1, srt + n + 1) - (srt + 1)); for(int i = 1; i <= n; i++){ int id = (int)(lower_bound(srt + 1, srt + K + 1, raw[i]) - srt); a[i] = id; val[id] = raw[i]; occ[id].push_back(i); } for(int id = 1; id <= K; id++) if((long long)occ[id].size() >= val[id]) cand[ncan++] = id; scanf("%d", &m); while(m--){ int L, R, k; scanf("%d %d %d", &L, &R, &k); int good = 0; for(int t = 0; t < ncan; t++){ vector<int>& v = occ[cand[t]]; int c = (int)(upper_bound(v.begin(), v.end(), R) - lower_bound(v.begin(), v.end(), L)); if((long long)c >= val[cand[t]]) good++; } long long ans = 1; for(int j = 0; j < k; j++) ans = ans * (good - j) / (j + 1); printf("%lld\n", ans); } return 0; }
- 1
信息
- ID
- 2867
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者