[CF1519C] Berland Regional (数论分块)
题面
有 n 个学生和 n 所大学,每个学生在其中一所大学中学习,且各有一个能力值
s
i
s_i
si 。
某次组队打比赛的召集令会给一个数字 k ,表示团队数量。然后每所大学会先把自己的所有学生按照
a
i
a_i
ai 从大到小排序,选前
k
k
k 个组个队,前
k
+
1
k+1
k+1 到
2
k
2k
2k 个组个队,……剩下最后不足
k
k
k 个学生,这些学生就不能组队。
每次召集的总能力值为所有组出来的队伍的每个学生的能力值之和。现在有
n
n
n 次召集令,给出的
k
k
k 分别是 1~n,分别求每次召集的总能力值。
题解
我这个做法被 nlogn 做法吊打,本愧于过此题,然所用方法有点思维,不如写来搏之一笑。
分别求每个学生的贡献。
假设当前学生在他(她)的大学里排名为倒数第
y
y
y ,而大学里总共
x
x
x 个学生,那么该学生对数字为
k
k
k 的召集令有贡献当且仅当
x
m
o
d
k
<
y
x\!\!\!\!\mod k<y
xmodk<y
变一下式子:
x
−
⌊
x
k
⌋
∗
k
<
y
⇔
x
−
y
<
⌊
x
k
⌋
∗
k
⇔
⌊
x
−
y
k
⌋
<
⌊
x
k
⌋
x-\left\lfloor \frac{x}{k}\right\rfloor*k<y\\ ~~\Leftrightarrow~~ x-y<\left\lfloor \frac{x}{k}\right\rfloor*k\\ ~~\Leftrightarrow~~ \left\lfloor \frac{x-y}{k}\right\rfloor<\left\lfloor \frac{x}{k}\right\rfloor
x−⌊kx⌋∗k<y ⇔ x−y<⌊kx⌋∗k ⇔ ⌊kx−y⌋<⌊kx⌋
如果我们已知
⌊
x
k
⌋
=
d
\left\lfloor \frac{x}{k}\right\rfloor=d
⌊kx⌋=d,那么
⌊
x
−
y
k
⌋
<
d
⇔
x
−
y
<
d
k
⇔
⌊
x
−
y
d
⌋
<
k
\left\lfloor \frac{x-y}{k}\right\rfloor<d\\ ~~\Leftrightarrow~~ x-y<dk\\ ~~\Leftrightarrow~~ \left\lfloor \frac{x-y}{d}\right\rfloor<k
⌊kx−y⌋<d ⇔ x−y<dk ⇔ ⌊dx−y⌋<k
好,这是个关于
k
k
k 的范围的表达式了,由于我们知道
⌊
x
k
⌋
\left\lfloor \frac{x}{k}\right\rfloor
⌊kx⌋ 随着
k
k
k 的不同只有大约
x
\sqrt x
x
个取值,因此我们可以数论分块枚举,每次枚举到一个区间
[
l
,
r
]
[l,r]
[l,r] 和
d
d
d,就对答案序列的
[
max
(
⌊
x
−
y
d
⌋
+
1
,
l
)
,
r
]
[\max(\left\lfloor \frac{x-y}{d}\right\rfloor+1,l),r]
[max(⌊dx−y⌋+1,l),r] 产生贡献。
对每个学生都计算一次,复杂度
O
(
n
n
)
O(n\sqrt n)
O(nn
)。
CODE
#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 200005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
int n,m,i,j,s,o,k;
int a[MAXN];
vector<int> u[MAXN];
LL sm[MAXN];
bool cmp(int x,int y) {return a[x] > a[y];}
int main() {
int T = read();
while(T --) {
n = read();
for(int i = 1;i <= n;i ++) u[i].clear(),sm[i] = 0;
for(int i = 1;i <= n;i ++) {
s = read(); u[s].push_back(i);
}
for(int i = 1;i <= n;i ++) {
a[i] = read();
}
for(int i = 1;i <= n;i ++) {
sort(u[i].begin(),u[i].end(),cmp);
int X = u[i].size();
for(int j = 0,nm = X;j < (int)u[i].size();j ++,nm --) {
int con = a[u[i][j]];
sm[1] += con; sm[nm+1] -= con;
for(int l = nm+1,r = 1;l <= X;l = r+1) {
r = X/(X/l); int d = X / l;
int ll = max(l,((X-nm)/d) + 1);
if(ll <= r) {
sm[ll] += con; sm[r+1] -= con;
}
}
}
}
for(int i = 1;i <= n;i ++) {
sm[i] += sm[i-1];
printf("%lld ",sm[i]);
}ENDL;
}
return 0;
}
[CF1519C] Berland Regional (数论分块)的更多相关文章
- 【BZOJ1257】余数之和(数论分块,暴力)
[BZOJ1257]余数之和(数论分块,暴力) 题解 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的 ...
- 51nod“省选”模测第二场 B 异或约数和(数论分块)
题意 题目链接 Sol 这题是来搞笑的吧.. 考虑一个数的贡献是\(O(\frac{N}{i})\) 直接数论分块. #include<bits/stdc++.h> #define Pai ...
- 洛谷P2261 [CQOI2007] 余数求和 [数论分块]
题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...
- luoguP3235 [HNOI2014]江南乐 数论分块 + 博弈论
感觉其实很水? 题目就是一个Multi SG游戏,只需要预处理出所有的\(sg\)值即可\(O(Tn)\)计算 对于计算\(sg[n]\)而言,显然我们可以枚举划分了\(x\)堆来查看后继状态 那么, ...
- bzoj 3834 [Poi2014]Solar Panels 数论分块
3834: [Poi2014]Solar Panels Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 367 Solved: 285[Submit] ...
- 洛谷P1403 [AHOI2005] 约数研究 [数论分块]
题目传送门 约数研究 题目描述 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机“Samuel II”的长时间运算成为了可能.由于在去年一年的辛苦工作取得了不错的成绩, ...
- 「BZOJ 2440」完全平方数「数论分块」
题意 \(T\)组数据,每次询问第\(k\)个无平方因子的数(\(1\)不算平方因子),\(T\leq 50,k\leq 10^9\) 题解 \(k\)的范围很大,枚举肯定不行,也没什么奇妙性质,于是 ...
- bzoj 1257 余数之和 —— 数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1257 \( \sum\limits_{i=1}^{n}k\%i = \sum\limits_ ...
- 【数论分块】bzoj2956: 模积和
数论分块并不精通……第一次调了一个多小时才搞到60pts:因为不会处理i==j的情况,只能枚举了…… Description $\sum_{i=1}^{n}\sum_{j=1 \land i \not ...
随机推荐
- C语言 C++1X STL QT免费视频课程 QT5界面开发美化 式样表 QML
C/C++/QT界面开发界面美化视频课程系列 课程1 C语言 C++1X STL QT免费视频课程 QT5界面开发美化 式样表 QML 返回顶部 课程1 C语言 C++1X STL QT免费视 ...
- 关于webstorm更换主题
现在我们前端使用编辑器,只要用习惯就好,不过这里推荐使用webstorm,因为被称为,'js神器'的称号,不是白说的.接下来我们来看下怎么引入主题. 下面有一个网站,这个网站的名字叫 http://w ...
- JavaScript中用画布canvans做贪吃蛇
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- RocketMQ消息的顺序与重复
1.如何保证消息的顺序 原因:生产者将消息发给topic,topic分发给不同的队列再给多个消费者并发消费,难以保证顺序. 方案:topic和队列之间加入MessageQueueSelector.将一 ...
- 快速保存Win10锁屏壁纸,收获美丽瞬间
对于写程序而言,每天接触得最多的就是电脑了 所以保持一种开放乐观,豁达美丽的心情是十分有必要的 使用"Everything"工具,输入"LocalState\Assets ...
- Maven + SSM环境搭建
Maven + SSM 之前Maven+SSM都是照着搭建的,自己想写点什么的时候发现搭建的过程不清楚. 于是花了时间边整理思路边搭建,并把搭建过程记录下来. 视频看来终觉浅,还是需要自己动手实践,捋 ...
- Mybatis中@select注解联合查询
前言 在项目中经常会使用到一些简单的联合查询获取对应的数据信息,我们常规都是会根据对应的mapper接口写对应的mapper.xml的来通过对应的业务方法来调用获取,针对这一点本人感觉有点繁琐,就对@ ...
- jQuery获取市、区县、乡镇、村
效果图: 首先根据自己方法把地区树状结构json字符串拿到 html下拉框和js写法如下: <select class="form-control" style=" ...
- linux下的nginx日志自动备份压缩--日志切割机
部署完毕nginx之后,发现自己的/var/log/nginx/*log的日志不会压缩,一直都是一个文本写日志, 时间久了,日志文件内存过于增加,将会导致在日志添加过程效率降低,延长时间. 默认安装的 ...
- MyBatis 映射文件
Mybatis映射文件简介 1) MyBatis 的真正强大在于它的映射语句.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉 ...