题面: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平均数,序列题解的更多相关文章

  1. [CSP-S模拟测试52]题解

    A.平均数 看到第K小,又确定跟平衡树/主席树没有关系,可以把问题转化为有K-1个答案比它小再考虑二分. 二分平均值x,之后将原序列统一减去x.这时序列中区间和<0的区间个数就是原序列中平均值小 ...

  2. [CSP模拟测试43、44]题解

    状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...

  3. 2019.9.26 csp-s模拟测试52 反思总结

    刚刚写了一个小时的博客没了,浏览器自动刷新. 一!个!小!时! 鼠标键盘电脑哪个都不能摔,气死我了. 垃圾选手T1T2没思路,T3倒是想出来得比较早,靠T3撑着分数. 数据结构学傻选手,属实垃圾. T ...

  4. [考试反思]0926csp-s模拟测试52:审判

    也好. 该来的迟早会来. 反思再说吧. 向下跳过直到另一条分界线 %%%cbx也拿到了他的第一个AK了呢. 我的还是遥不可及. 我恨你,DeepinC. 我恨透你了.你亲手埋葬所有希望,令我无比气愤. ...

  5. [CSP-S模拟测试]:简单的序列(DP)

    题目描述 从前有个括号序列$s$,满足$|s|=m$.你需要统计括号序列对$(p,q)$的数量. 其中$(p,q)$满足$|p|+|s|+|q|=n$,且$p+s+q$是一个合法的括号序列. 输入格式 ...

  6. NOIP模拟测试3「序列·熟练剖分·建造游乐园(play)」

    ---恢复内容开始--- 序列 刚调出来样例就A了,假装是水题. 因为是乱序,我们要求出来每两项之间最小公比,而不是直接比 求出来每两项之间最小公比,然后扫一遍就完了.(还要注意重复情况) 那么问题就 ...

  7. [7.18NOIP模拟测试5]砍树 题解(数论分块)

    题面(加密) 又考没学的姿势……不带这么玩的…… 考场上打了个模拟 骗到30分滚粗了 稍加思考(滑稽)可将题面转化为: 求一个最大的$d$,使得 $\sum \limits _{i=1}^n {(\l ...

  8. [20190727NOIP模拟测试9]单(single) 题解(树上dp)

    啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...

  9. [NOIP模拟测试9]题(Problem) 题解 (组合数全家桶+dp)

    达哥送分给我我都不要,感觉自己挺牛批. $type=0:$ 跟visit那题类似,枚举横向移动的步数直接推公式: $ans=\sum C_n^i \times C_i^{\frac{i}{2}} \t ...

随机推荐

  1. 阿里第一颗芯片问世,平头哥发布最强AI芯片含光800

    阿里巴巴第一颗自研芯片正式问世.9月25日的杭州云栖大会上,达摩院院长张建锋现场展示了这款全球最强的AI芯片——含光800.在业界标准的ResNet-50测试中,含光800推理性能达到78563 IP ...

  2. java基本类型映射表

  3. linux学习(五)-----组管理和权限管理

    Linux 组基本介绍 在 linux 中的每个用户必须属于一个组,不能独立于组外.在 linux 中每个文件有所有者.所在组.其它组的概念. 1)所有者 2)所在组 3)其它组 4)改变用户所在的组 ...

  4. Kafka和RabbitMQ 对比

    1)  Kafka成为业界大数据松耦合架构,异步,队列 特点:吞吐量高50m/s. Kafka和RabbitMQ都是MQ机制,它差异 Kafka作为大数据产品,可以作为数据源,也可以作为结果数据中转 ...

  5. Docker系列(九):Kubernetes架构深度解析

    Kubernetes重要概念 Docker解决了打包和隔离的问题,但我们需要更多:调度的问题,生命周期及健康状况,服务发现,监控,认证,容器聚合. Kubernetes概述 开源DOcker容器编排系 ...

  6. Hadoop完全分布式配置

    ***** 全部三个节点 *****1. 关闭防火墙 service iptables stop chkconfig iptables off2. 修改主机名,Hadoop主机名中不能出现_和- vi ...

  7. shell脚本,循环的记录

    ######################################################################### # File Name: showlogged.sh ...

  8. 外引js — 先引入cdn,cdn失效时引入本地js

    参考:http://www.tianshan277.com/563.html 效果: html: <!DOCTYPE html> <html lang="en"& ...

  9. java_缓冲流(字节输出流)

    缓冲流分为: 字节缓冲流:BufferedIntputSream(字节缓冲输出流),BufferdOutputStream(字节缓冲输入流) 字符缓冲流:BufferedReader(字符输入缓冲流) ...

  10. Java开发系列-Cookie与Session会话技术

    概述 会话技术:当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话.会话技术产生是由于Http请求是一个无状态的协议,它不会记录上次访问的内容,用户在访过程中难免产生一 ...