首页 > 其他分享 >「解题报告」ARC139D Priority Queue 2

「解题报告」ARC139D Priority Queue 2

时间:2023-01-27 11:13:28浏览次数:39  
标签:Queue int inv 1ll Priority ge MAXN ans ARC139D

我困炸了,一个月没有六点起过床了。

统计总贡献不好统计,考虑把贡献拆开统计。发现统计每个数出现次数还是不好统计,那就直接把数也拆开。

对于每一个 \(i\),统计 \(\ge i\) 的数有多少个,加起来就是总和了。

设 \(\ge i\) 的数有 \(c\) 个。发现,如果一开始的 \(n-x+1\) 大于 \(c\) 个,那么如果选一个 \(\ge i\) 的数会使 \(c + 1\),否则 \(c\) 数量不变。同理,如果一开始的 \(n-x+1\) 小于等于 \(c\) 个,那么如果选一个 \(\ge i\) 的数 \(c\) 不变,否则 \(c - 1\)。最后 \(c\) 到 \(n-x+1\) 的时候不变,于是就取个 \(\max / \min\)。

枚举选了多少个 \(\ge i\) 的数,那么就可以计算最后的 \(c\) 等于多少与选择的方案数,乘起来统计答案。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 4005, P = 998244353;
int qpow(int a, int b) {
    int ans = 1;
    while (b) {
        if (b & 1) ans = 1ll * ans * a % P;
        a = 1ll * a * a % P;
        b >>= 1;
    }
    return ans;
}
int n, m, k, x;
int a[MAXN];
int fac[MAXN], inv[MAXN];
int C(int n, int m) {
    if (n < 0 || m < 0 || n < m) return 0;
    return 1ll * fac[n] * inv[m] % P * inv[n - m] % P;
}
int main() {
    scanf("%d%d%d%d", &n, &m, &k, &x);
    fac[0] = 1;
    for (int i = 1; i <= k; i++) {
        fac[i] = 1ll * fac[i - 1] * i % P;
    }
    inv[k] = qpow(fac[k], P - 2);
    for (int i = k; i >= 1; i--) {
        inv[i - 1] = 1ll * inv[i] * i % P;
    }
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    sort(a + 1, a + 1 + n);
    int ans = 0;
    for (int i = 1; i <= m; i++) {
        int c = n - (lower_bound(a + 1, a + 1 + n, i) - a) + 1;
        if (c <= n - x + 1) {
            for (int j = 0; j <= k; j++) {
                ans = (ans + 1ll * C(k, j) * qpow(m - i + 1, j) % P * qpow(i - 1, k - j) % P * min(n - x + 1, c + j)) % P;
            }
        } else {
            for (int j = 0; j <= k; j++) {
                ans = (ans + 1ll * C(k, j) * qpow(m - i + 1, j) % P * qpow(i - 1, k - j) % P * max(n - x + 1, c - (k - j))) % P;
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}

标签:Queue,int,inv,1ll,Priority,ge,MAXN,ans,ARC139D
From: https://www.cnblogs.com/apjifengc/p/17068714.html

相关文章

  • Priority Hints & fetchPriority property All In One
    PriorityHints&fetchPrioritypropertyAllInOne试验性功能⚠️https://caniuse.com/?search=fetchPriorityPriorityHints优先级/性能优化https://web.de......
  • 【Java数据结构及算法实战】系列008:Java队列02——阻塞队列BlockingQueue
    阻塞队列(BlockingQueue)是一种支持额外操作的队列,这两个附加的操作是:l  在队列为空时,获取元素的线程会等待队列变为非空。l  当队列满时,存储元素的线程会等待队列可用。J......
  • 数据结构 玩转数据结构 8-8 Java中的PriorityQueue
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13745 1重点关注1.1用java自带的优先队列实现取前k个高频元素问题见3.1 1.2......
  • Java并发容器之DelayQueue源码分析
    一、简介DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。二、继承体系从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。另外,De......
  • LinkedBlockingQueue和ArrayBlockingQueue对比
    对比一下LinkedBlockingQueue和ArrayBlockingQueue的区别。1.底层数据结构不同LinkedBlockingQueue底层是单向链表,只有一个后继指针/***Linkedlistnodeclass*......
  • LinkedBlockingQueue源码解析
    java.util.concurrent.LinkedBlockingQueue是一个底层为单向链表的,有界的,FIFO阻塞队列;访问和移除操作是在队头,添加操作在队尾进行,并且使用不同的锁进行保护。在使用线程池时......
  • C++ move()函数及priority_queue队列使用记录
    最近刷leetcode题,使用了move()函数及优先队列(堆)priority_queue数据结构,记录一下!1.move函数move(obj)函数的功能是把obj当做右值处理,可以应用在对象的移动上。右值引用......
  • Java并发容器之PriorityBlockingQueue源码分析
    一、简介PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢?还记得我们前面介绍过的PriorityQueue吗?点击链接直达Java......
  • 1017 Queueing at Bank(25分)
    Supposeabankhas K windowsopenforservice.Thereisayellowlineinfrontofthewindowswhichdevidesthewaitingareaintotwoparts.Allthecustomer......
  • Stas and the Queue at the Buffet
    StasandtheQueueattheBuffet题解:贪心+思维我们看到公式\(ai⋅(j−1)+bi⋅(n−j)\),直接进行化简得到\[(a[i]-b[i])*j+n*b[i]-a[i]\]我们就知道\(n*b[i]-a[i]\)......