HDU 6058 Kanade's sum
2017-08-03 20:28
375 查看
题目地址
题解:求一个全排列中的任意区间的区间第k大的和
思路:假定num[i]为区间第k大,然后先向右查找(不够再向左查找),然后就再向左删除(详细看代码)
题解:求一个全排列中的任意区间的区间第k大的和
思路:假定num[i]为区间第k大,然后先向右查找(不够再向左查找),然后就再向左删除(详细看代码)
#include <iostream> #include <cstring> #include <string> #include <queue> #include <vector> #include <map> #include <set> #include <stack> #include <cmath> #include <cstdio> #include <algorithm> #include <iomanip> #define N 1000010 #define LL __int64 #define inf 0x3f3f3f3f #define lson l,mid,ans<<1 #define rson mid+1,r,ans<<1|1 #define getMid (l+r)>>1 #define movel ans<<1 #define mover ans<<1|1 using namespace std; const LL mod = 1e9 + 7; const double eps = 1e-9; int num ; int pre ; int main() { cin.sync_with_stdio(false); int n, T, k; cin >> T; while (T--) { cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> num[i]; } LL ans = 0; for (int i = 1; i <= n; i++) { int x = num[i]; int cnt = 0, j, sum = 0; pre[++cnt] = i; for (j = i + 1; j <= n&&cnt < k; j++) {//向右找到k-1个比x大的数 if (num[j] > x) { pre[++cnt] = j; } } cb64 if (cnt == k) {//如果右边有k-1个比x大的数 int nums = 1; for (; j <= n; j++) {//向右扩张区间 if (num[j] < x) { nums++; } else { break; } } sum += nums; for (j = i - 1; j >= 1 && cnt >= 1; j--) {//向左扩张区间 if (num[j] > x) { if (cnt == 1) { break; } else { nums = pre[cnt] - pre[cnt - 1];//遗弃最右边的值,更新剩余区间长度 cnt--; } } sum += nums; } } else { for (j = i - 1; j >= 1 && cnt < k; j--) { if (num[j] > x) { pre[++cnt] = j; } } if (cnt == k) { sort(pre + 1, pre + cnt + 1); int nums = n - pre[cnt] + 1;//因为右边都没有满,所以剩余的区间长度就是最左边的比x大的数到末尾的长度 sum += nums; for (; j >= 1 && pre[cnt] >= i; j--) { if (num[j] > x) { if (pre[cnt] == i) { break; } else { nums = abs(pre[cnt] - pre[cnt - 1]);//遗弃最右边的值,更新剩余区间长度 cnt--; } } sum += nums; } } } ans += (LL)x*sum; } cout << ans << endl; } return 0; }
相关文章推荐
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- HDU 6058 Kanade's sum (区间第k大的数的贡献)
- (2017多校训练第三场)HDU - 6058 Kanade's sum 链表
- HDU 6058 Kanade's sum 思维+ 模拟链表
- hdu 6058 Kanade's sum(区间跳跃)
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- hdu 6058 Kanade's sum
- 2017多校第3场 HDU 6058 Kanade's sum 双链表,思维
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- HDU-6058 Kanade's sum(计数)
- hdu 6058 Kanade's sum(思维)
- 【多校训练】hdu 6058 Kanade's sum
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- HDU 6058 枚举 Kanade's sum
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- hdu 6058 Kanade's sum
- HDU 6058 Kanade's sum 链表+枚举
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- HDU 6058 2017 Multi-University Training Contest - Team 3 1003 :Kanade's sum:简单计数问题