AtCoder Beginner Contest 127 D,E,F
题意:先给出n个数字,然后可以有m次操作,每次操作以数字对(x,y)表示最多能选x个数字把它变成y,问经历m次操作后n个数字和最大为多少?
解法:一个明显正确的做法是:用y尽量大的操作去改变数组,直到不能改变(产生负收益)为止。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,a[N];
struct dat{
int x,y;
bool operator < (const dat &rhs) const {
return y>rhs.y;
}
}b[N]; int main()
{
cin>>n>>m;
for (int i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a+n+);
for (int i=;i<=m;i++) scanf("%d%d",&b[i].x,&b[i].y);
sort(b+,b+m+);
int nowa=,nowb=;
while (nowa<=n && nowb<=m) {
if (b[nowb].y<=a[nowa]) break;
for (int i=;i<=b[nowb].x;i++) {
if (nowa>n) break;
if (b[nowb].y<=a[nowa]) break;
a[nowa]=b[nowb].y; nowa++;
}
nowb++;
}
long long ans=;
for (int i=;i<=n;i++) ans+=(long long)a[i];
cout<<ans<<endl;
return ;
}
题意:给出n*m的表格,每次选k个,然后计算这k个格子任两个欧几里得距离和。算出以上所有不同方案答案距离总和。
解法:这题一看题目明显往算贡献方面想。选k个格子方案数是C(n,m),然后k个格子任两个欧几里得距离有C(k,2)对,那么每一对的距离是多少呢?我们注意到每一对的距离都可能不尽相同,但是题目要求计算的是任两对的距离,那么我们就可以考虑用总数*平均得到总和,这里有一个结论:任两个格子的平均欧几里得距离是(n+m)/3。那么答案就是:C(n*m,k)*C(k,2)*(n+m)/3。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int P=1e9+;
const int N=2e5+;
int n,m,k;
LL fac[N],inv[N]; LL power(LL x,LL p) {
LL ret=;
for (;p;p>>=) {
if (p&) ret=ret*x%P;
x=x*x%P;
}
return ret;
} void prework() {
fac[]=; inv[]=power(fac[],P-);
for (int i=;i<=;i++) {
fac[i]=fac[i-]*i%P;
inv[i]=power(fac[i],P-);
}
} LL C(LL n,LL m) {
return fac[n]*inv[m]%P*inv[n-m]%P;
} int main()
{
prework();
cin>>n>>m>>k;
LL ans=C(n*m,k)%P*C(k,)%P*(n+m)%P*power(,P-)%P;
cout<<ans<<endl;
return ;
}
题意:每个给出操作或查询,操作是给出(a,b)然后f(x)=f(x)+|x-a|+b,查询是查询所有f(x)的最小值坐标x以及最小值f(x)。
解法:大但猜想最小值坐标是不是a的中位数,手动尝试几个(a,b)操作后发现确实是这样。那么这题就变成景经典的动态中位数问题了,用大根堆小根堆解法可以解决。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
priority_queue<int,vector<int>,greater<int> > q1;
priority_queue<int> q2;
LL sum,sum1,sum2; int main()
{
int n,m; cin>>m;
while (m--) {
int opt; scanf("%d",&opt);
if (opt==) {
int x,y; scanf("%d%d",&x,&y);
n++; sum+=y;
q1.push(x); sum1+=x;
while (!q1.empty() && !q2.empty() && q1.top()<q2.top()) {
sum1-=q1.top(); sum1+=q2.top();
sum2-=q2.top(); sum2+=q1.top();
int t=q1.top(); q1.pop();
q1.push(q2.top());
q2.pop(); q2.push(t);
}
if (q1.size()-q2.size()>=)
sum1-=q1.top(),sum2+=q1.top(),q2.push(q1.top()),q1.pop();
} else {
int mid;
if (n%) mid=q1.top(); else mid=q2.top();
LL ans=((LL)mid*(n/)-sum2)+(sum1-(LL)mid*(n-n/))+sum;
printf("%d %lld\n",mid,ans);
}
}
return ;
}
AtCoder Beginner Contest 127 D,E,F的更多相关文章
- AtCoder Beginner Contest 127 解题报告
传送门 非常遗憾.当天晚上错过这一场.不过感觉也会掉分的吧.后面两题偏结论题,打了的话应该想不出来. A - Ferris Wheel #include <bits/stdc++.h> u ...
- 【AtCoder Beginner Contest 181】A~F题解
越学越菜系列 于2020.11.2,我绿了(错乱) A - Heavy Rotation 签到题,奇数Black,偶数White. code: #include<bits/stdc++.h> ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 238 A - F 题解
AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- AtCoder Beginner Contest 161
比赛链接:https://atcoder.jp/contests/abc161/tasks AtCoder Beginner Contest 161 第一次打AtCoder的比赛,因为是日本的网站终于 ...
随机推荐
- Vue小白篇 - ES6的语法
为什么要学 ES6 的语法呢? 因为 Vue 语法有很多都是 ES6(ECMAScript 6),这里推荐 [阮一峰 ECMAScript 6 入门]: http://es6.ruanyifeng.c ...
- 【记录】Mysql 建表注意事项
博主最近打算搭建商城,由于之前对建表只有很浅显的理解,没有太过深入了解,建表过程中遇到一些问题,现记录如下, 如有问题请各位留言指正,感激不尽: 建表时设置如何设置联合主键?如下标红处: CREATE ...
- 通过cmd命令启动appium server,appium server安装过程
电脑上已安装了appium desktop版,想在移动端自动化的过程中,通过脚本启动appium server,环境准备: 1.确保电脑安装了node.js,目前用的是node12 2.安装JDK,且 ...
- Motan框架初体验
1.什么是Motan? Motan是一套基于java开发的RPC框架,除了常规的点对点调用外,motan还提供服务治理功能,包括服务节点的自动发现.摘除.高可用和负载均衡等.Motan具有良好的扩展性 ...
- maven eclipse远程部署tomcat
pom.xml tomcat 配置信息 <properties><project.build.sourceEncoding>utf8</project.build.so ...
- js 对象属性和使用方法学习笔记
对象的引用 在ECMAScriipt中,不能访问对象的物理表示,只能访问对象的引用.每次创建对象,存储在变量中的都是对象的引用,而不是对象本身. 对象的废除 ECMASript拥有无用存储单元收集程序 ...
- [REPRINT] Java 101: Classes and objects in Java
http://www.javaworld.com/article/2979739/learn-java/java-101-classes-and-objects-in-java.html?page=3 ...
- 深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
POLARDB 是阿里云自主研发的下一代云原生分布式数据库,100%兼容MySQL.PostgreSQL等开源数据库,高度兼容Oracle语法,使用RDS服务的客户不需要修改应用代码,可以一键迁移到P ...
- shell脚本学习(1)入门
1脚本语言和编译型语言的区别:编译型的要从源码转换成目标代码,多运行于底层.脚本语言有解释器读入程序代码, 转成内部形式再执行. 2脚本语言,写的时间快,一般有awk,pwel, python Rub ...
- Python基础教程(005)--为什么要学习Python?
前言 为什么要选择Python学习 知识点 因为Python代码量少. 同样一个问题,用不同的语言,代码量差距还是很大的.一半情况下,Python是java的1比5,所以说,人生苦短,我用Python ...