原题链接

简要题意:

给定一个 \(1\) ~ \(n\) 的置换,将数组分为 \(k\) 个区间,使得每个区间的最大值之和最大。求这个值,和分区的方案数。

关键在于 \(1\) ~ \(n\) 的置换。

显然,你只要把从 \(n - k + 1\) 到 \(n\) 这一段,每个区间分一个(其余的随便分)。

显然可以得出第一个答案:

\[(n-k+1) + (n-k+1) + \cdots + (n-1) + n
\]

(很显然,你可以用等差数列求和,可是没这个必要,一会儿求第二个答案的时候,可以顺便求啊

比方说:(以第三个样例为例)

7 3
2 7 3 1 5 4 6

这时你把 \(5\),\(6\),\(7\) 作为每个区间的最大值。

此时你会发现,比方说 \(3 \space 1\) 这一段。

它要么全归 \(7\),全归 \(5\) ,或者分两段,左边归 \(7\),右边归 \(5\).

那么,你想,这就相当于你可以在任意的位置把它分段。(包括最左边和最右边,此时尽属一段)

那么,方案数是 \(3\).

就是 \(5\) 的位置减去 \(7\) 的位置,即 \(5 - 2 = 3\).

而一共三段,分别计算。根据 乘法原理 可得:

\[1 \times 3 \times 2 = 6
\]

所以,第二个答案是:

每个 \(\geq n - k + 1\) 的数和前面一个 \(\geq n - k + 1\) 的数的位置之差的乘积。

第零个 \(\geq n - k + 1\) 的数的位置,我们认为是 \(0\).

记得开 \(\texttt{long long}\).

十年OI一场空,不开long long见祖宗

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll MOD=998244353; inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;} int n,k,last;
ll s=0,cnt=1; int main(){
n=read(),k=read();
for(int i=1,t;i<=n;i++) {
t=read(); if(t>n-k) {
s+=t; if(!last) last=i; //维护上一个 >= n - k + 1 的数的位置
else cnt=cnt*(i-last)%MOD,last=i; //计数
}
} printf("%lld %lld\n",s,cnt);
return 0;
}

CF1326C Permutation Partitions 题解,的更多相关文章

  1. Codeforces Global Round 7 C. Permutation Partitions(组合数学)

    题意: 给你 n 长全排列的一种情况,将其分为 k 份,取每份中的最大值相加,输出和的最大值和有多少种分法等于最大值. 思路: 取前 k 大值,储存下标,每两个 k 大值间有 vi+1 - vi 种分 ...

  2. CF1490D Permutation Transformation 题解

    Content 给定一个排列 \(a\),按照以下方法构造一棵树: 选择当前排列中的最大数作为根的编号. 最大数左边的所有数按照上述方法建左子树,若没有数则该节点没有左儿子. 最大数右边的所有数按照上 ...

  3. Codeforces Global Round 7

    A. Bad Ugly Numbers 思路 题意: 给我们一个k,让我们用 0-9 之间的数字构成一个 k位数a,a不能被组成a的每一位数字整除. 分析:首先 k等于1,无论我们怎么配都会被整除:当 ...

  4. CF #640 (div4)

    CF640 div4 草 迟到半个月的补题 真正的懒狗 再懒就无了 D. Alice, Bob and Candies 题意:n个数字,奇数时间从左侧删数字,偶数时间从右侧删数字,每次删的数字之和必须 ...

  5. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  6. [LeetCode 题解]: Permutation Sequcence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  7. 【题解】Codeforces 961G Partitions

    [题解]Codeforces 961G Partitions cf961G 好题啊哭了,但是如果没有不小心看了一下pdf后面一页的提示根本想不到 题意 已知\(U=\{w_i\}\),求: \[ \s ...

  8. 【题解】CF359B Permutation

    [题解]CF359B Permutation 求一个长度为\(2n\)的序列,满足\(\Sigma |a_{2i}-a_{2i-1}|-|\Sigma a_{2i}-a_{2i-1}|=2k\) 这种 ...

  9. [LeetCode]题解(python):031-Next Permutation

    题目来源 https://leetcode.com/problems/next-permutation/ Implement next permutation, which rearranges nu ...

随机推荐

  1. 【深入理解Java虚拟机】类的初始化过程

    类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...

  2. C++ 走向远洋——44(项目一、点—圆—圆柱类族的设计、派生类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. optparse(命令行参数解析工具)

    在用Python做自动化的时候,命令行的解析一定是少不了的,有很多命令行解析工具库,其中Python内建的一个库optparse,还是比较好用的 1.贴代码并注释 # coding=UTF-8 fro ...

  4. Git 程序员篇

    关于 Git Git 背后的故事 伟大的作品总是诞生于伟大的时代,正如 Git 同样诞生于一个英雄辈出.极富纷争的年代. 2005 年,Linux 内核开发社区正面临严峻的挑战:他们不能继续使用 Bi ...

  5. 46-Python深浅拷贝

    目录 一.引言 1.1 可变或不可变 二.拷贝 三.浅拷贝 深拷贝 一.引言 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象 ...

  6. zookeeper伪集群搭建

    zookeeper伪集群搭建 1. 下载zookeeper: https://zookeeper.apache.org/ 2. 解压: tar -zxvf zookeeper-3.4.14.tar.g ...

  7. iOS应用构建与部署小结

    注:本文首发于我的个人博客:https://evilpan.com/2019/04/06/ios-basics/ 上篇文章介绍了Objective-C的基本概念,本文就来接着看如何创建我们的第一个简单 ...

  8. docker部署tensorflow serving以及模型替换

    Using TensorFlow Serving with Docker 1.Ubuntu16.04下安装docker ce 1-1:卸载旧版本的docker sudo apt-get remove ...

  9. 数据库介绍以及MySQL数据库的使用

    一 数据库介绍 1.1 数据库定义 数据库就是存储数据的仓库  本质上就是一套cs结构的TCP程序   客户端连接到服务器 向服务器发送指令  完成数据的操作 1.2  常见数据库 关系型数据库 就是 ...

  10. oracle的wm_concat函数实现行转列

    有以下数据 deptname phone username isboss 部门A 电话1 员工A 0 部门A 电话1 领导A 1 部门B 电话2 员工B 0 部门B 电话2 员工C 0 部门B 电话2 ...