csp-s模拟测试52平均数,序列题解
题面:https://www.cnblogs.com/Juve/articles/11602244.html
平均数:
第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个
虑把序列中的每个数减去 x,则我们只需求区间和小于 0 的区间数量。
我们对这个序列求前缀和,则区间[L,R]和小于 0 当且仅当 SL-1>SR,
答案即为前缀和序列 S 的逆序对数量,使用经典的归并排序即可解决
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define int long long
#define double long double
using namespace std;
const int MAXN=1e5+5;
int n,k,ans=0;
double L=0.0,R=1e9+1,sum[MAXN],temp[MAXN],res,a[MAXN];
double max(double a,double b){
return a>b?a:b;
}
void merge_sort(int l,int r){
int mid,i,j,k;
if(l==r) return;
mid=(l+r)/2;
merge_sort(l,mid);merge_sort(mid+1,r);
i=l;j=mid+1;k=l;
while(i<=mid&&j<=r){
if(sum[i]>sum[j]){
ans+=mid-i+1;
temp[k]=sum[j];
j++;
k++;
}else{
temp[k]=sum[i];
i++;
k++;
}
}
while(i<=mid){
temp[k]=sum[i];
i++;
k++;
}
while(j<=r){
temp[k]=sum[j];
j++;
k++;
}
for(i=l;i<=r;i++)
sum[i]=temp[i];
}
bool check(double x){
ans=0;
sum[0]=0;
for(int i=1;i<=n;++i){
sum[i]=sum[i-1]+a[i]-x;
}
merge_sort(0,n);
return ans<k;
}
signed main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;++i){
scanf("%Lf",&a[i]);
}
while(L<R-(1e-5)){
double mid=(L+R)/2.0;
if(check(mid)) L=mid;
else R=mid;
}
printf("%0.4Lf\n",L);
return 0;
}
序列:
考虑主席树,相当与对每一个位置建一棵动态开点权值线段树,
我们不能把所有区间插进去,我们插入询问,对于每一个位置,经过它的询问有很多,我们统计a[i]对整个答案的贡献
我们对每一个位置插入所有在这个位置上要查询的x,然后答案就是对于每一个位置i,在i所在的线段树中找小于a[i]的x的数量,这是a[i]对整个答案的贡献
修改后我们还像之前那样查询,如果将p位置更改为v,那么减去a[p]的贡献,在加上更改后的v对整个答案的贡献
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define int long long
#define re register
using namespace std;
const int MAXN=1e5+5;
int n,m,q,a[MAXN],ans,x[MAXN];
int root[MAXN],tot=0,ls[MAXN<<6],rs[MAXN<<6],tr[MAXN<<6];
struct node{
int pos,val;
};
vector<node>v[MAXN];
inline void insert(re int &k,re int pre,re int l,re int r,re int pos,re int val){
k=++tot;
ls[k]=ls[pre],rs[k]=rs[pre],tr[k]=tr[pre];
if(l==r){
tr[k]+=val;
return ;
}
re int mid=(l+r)>>1;
if(pos<=mid) insert(ls[k],ls[pre],l,mid,pos,val);
else insert(rs[k],rs[pre],mid+1,r,pos,val);
tr[k]=tr[ls[k]]+tr[rs[k]];
}
inline int query(re int k,re int l,re int r,re int opl,re int opr){
if(opl<=l&&r<=opr) return tr[k];
re int mid=(l+r)>>1,res=0;
if(opl<=mid) res+=query(ls[k],l,mid,opl,opr);
if(opr>mid) res+=query(rs[k],mid+1,r,opl,opr);
return res;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&q);
for(re int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
for(re int i=1,l,r;i<=m;++i){
scanf("%lld%lld%lld",&l,&r,&x[i]);
v[l].push_back((node){x[i],1});
v[r+1].push_back((node){x[i],-1});
}
for(re int i=1;i<=n;++i){
root[i]=root[i-1];
int N=v[i].size();
for(re int j=0;j<N;++j){
insert(root[i],root[i],1,n,v[i][j].pos,v[i][j].val);
}
}
for(re int i=1;i<=n;++i){
ans+=query(root[i],1,n,1,a[i]);
}
printf("%lld\n",ans);
for(re int i=1,p,v;i<=q;++i){
scanf("%lld%lld",&p,&v);
p^=ans,v^=ans;
ans+=(query(root[p],1,n,1,v)-query(root[p],1,n,1,a[p]));
a[p]=v;
printf("%lld\n",ans);
}
return 0;
}
csp-s模拟测试52平均数,序列题解的更多相关文章
- [CSP-S模拟测试52]题解
A.平均数 看到第K小,又确定跟平衡树/主席树没有关系,可以把问题转化为有K-1个答案比它小再考虑二分. 二分平均值x,之后将原序列统一减去x.这时序列中区间和<0的区间个数就是原序列中平均值小 ...
- [CSP模拟测试43、44]题解
状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...
- 2019.9.26 csp-s模拟测试52 反思总结
刚刚写了一个小时的博客没了,浏览器自动刷新. 一!个!小!时! 鼠标键盘电脑哪个都不能摔,气死我了. 垃圾选手T1T2没思路,T3倒是想出来得比较早,靠T3撑着分数. 数据结构学傻选手,属实垃圾. T ...
- [考试反思]0926csp-s模拟测试52:审判
也好. 该来的迟早会来. 反思再说吧. 向下跳过直到另一条分界线 %%%cbx也拿到了他的第一个AK了呢. 我的还是遥不可及. 我恨你,DeepinC. 我恨透你了.你亲手埋葬所有希望,令我无比气愤. ...
- [CSP-S模拟测试]:简单的序列(DP)
题目描述 从前有个括号序列$s$,满足$|s|=m$.你需要统计括号序列对$(p,q)$的数量. 其中$(p,q)$满足$|p|+|s|+|q|=n$,且$p+s+q$是一个合法的括号序列. 输入格式 ...
- NOIP模拟测试3「序列·熟练剖分·建造游乐园(play)」
---恢复内容开始--- 序列 刚调出来样例就A了,假装是水题. 因为是乱序,我们要求出来每两项之间最小公比,而不是直接比 求出来每两项之间最小公比,然后扫一遍就完了.(还要注意重复情况) 那么问题就 ...
- [7.18NOIP模拟测试5]砍树 题解(数论分块)
题面(加密) 又考没学的姿势……不带这么玩的…… 考场上打了个模拟 骗到30分滚粗了 稍加思考(滑稽)可将题面转化为: 求一个最大的$d$,使得 $\sum \limits _{i=1}^n {(\l ...
- [20190727NOIP模拟测试9]单(single) 题解(树上dp)
啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...
- [NOIP模拟测试9]题(Problem) 题解 (组合数全家桶+dp)
达哥送分给我我都不要,感觉自己挺牛批. $type=0:$ 跟visit那题类似,枚举横向移动的步数直接推公式: $ans=\sum C_n^i \times C_i^{\frac{i}{2}} \t ...
随机推荐
- agc38C LCMs
https://atcoder.jp/contests/agc038/tasks/agc038_c 题意:给\(a_i\),求\(\sum_{i=1}^n\sum_{j=i+1}^nlcm(a_i,a ...
- HUD1686-Oulipo-kmp模板题/哈希模板题
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
- 第十七篇:csv拆分、csv转excel方法
首先对微软的office功能表示敬佩!可能是这些办公软件太过平常化,所以体会不到他有多牛!csv格式数据以前没接触过,百度百科定义,Comma-Separated Values,CSV,逗号分隔值,或 ...
- java中一个类不想被继承怎么办?
方法一:把类声明为final 方法二:对类中的构造器声明为private,类中提供一个static方法,完成对类的初始化.如下代码: public class Base{ private Base() ...
- Python Flask高级编程之从0到1开发《鱼书》精品项目 ✍✍✍
Python Flask高级编程之从0到1开发<鱼书>精品项目 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移 ...
- 初识OpenCV-Python - 004: Trackbar as the color palette
此次学习了如何用OpenCV建立一个色调盘.其中会用到cv2.getTrackbarPos(), cv2.createTrackbar()函数. code: import cv2import nump ...
- spring:bean的细节之三种创建Bean对象的方式
<!--创建Bean的三种方式--><!--第一种方式,使用默认构造函数创建 在spring的配置文件中使用bean标签,配以id和class属性之后,且没有属性和标签时. 采用的就 ...
- 锋利的Jquery(Table,Checkbox)
1.Table奇数偶数行 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- Luogu P4180 【模板】严格次小生成树[BJWC2010]
P4180 [模板]严格次小生成树[BJWC2010] 题意 题目描述 小\(C\)最近学了很多最小生成树的算法,\(Prim\)算法.\(Kurskal\)算法.消圈算法等等.正当小\(C\)洋洋得 ...
- vue初学之node.js安装、cnpm安装、vue初体验
1. 如果本机没有安装node运行环境,请下载node 安装包进行安装.地址:https://nodejs.org/en/ 2.装完,使用cmd命令行输入:node -v回车 如果输出版本号则成功. ...