题面: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. SpringCloud及其五大常用组件之Feign、Ribbon和Hystrix

    1.Feign 我们已经将Eureka和Zuul开发完毕,而且上面注册了两个微服务,现在我们实现两个微服务之间的调用. String baseUrl = "http://127.0.0.1: ...

  2. 372 在O(1)时间复杂度删除链表节点

    原题网址:http://www.lintcode.com/zh-cn/problem/delete-node-in-the-middle-of-singly-linked-list/ 给定一个单链表中 ...

  3. vue.js出现cannot get /错误

    config中的index.js 原来是 assetsPublicPath: './', 改为 assetsPublicPath: '/',

  4. 搞大数据,你不懂这三大数据处理趋势就OUT了

    搞大数据,你不懂这三大数据处理趋势就OUT了 企业数据每年以PB级甚至上百PB爆炸式增长,越来越大的数据量正为扩大分析策略在企业应用软件领域的拓展提供了数据基础,但数据的价值是有时效性的,越早分析越能 ...

  5. QT之QComboBox

    1.addItems需要注意的事项: 1.在QT中设置maxVisibleItems的值,设置Items的最大可显示的值.(一般默认为10) 2.在每次需要清除已经添加的tems的时候需要注意,ui. ...

  6. Largest Rectangle in a Histogram /// 单调栈 oj23906

    题目大意: 输入n,,1 ≤ n ≤ 100000,接下来n个数为每列的高度h ,0 ≤ hi ≤ 1000000000 求得最大矩阵的面积 Sample Input 7 2 1 4 5 1 3 34 ...

  7. java 实现websocket(转)

    Java web项目使用webSocket   前端: <%@ page language="java" import="java.util.*" pag ...

  8. 【笔记篇】C#笔记3

    笔记目录:http://blog.csdn.net/enzymii/article/details/77169928 C#的接口有点意思,我们说过可以用来多重继承.. using System; na ...

  9. Python全栈开发:json与pickle

    #!/usr/bin/env python # -*- coding;utf-8 -*- """ 正解(序列化):将Python数据类型转换成json或者pickle格式 ...

  10. [转]C# 之泛型详解

    什么是泛型 我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为 ...