2021牛客暑期多校训练营7 K-xay loves sequence(主席树+二分)
K-xay loves sequence
不难发现di=di+kd_i=d_i+kdi=di+k那么一定有di<0d_i<0di<0,同理di=di−kd_i=d_i-kdi=di−k那么一定有di≥0d_i\ge0di≥0
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=200010;
const int U=(1ll<<31)-1;
int a[N],d[N];
ll s[N];
int n,m;
struct node
{int l,r;ll v,ct;
}tree[N*100];
int rt[2][N],cnt;
void update(int l,int r,int pre,int &u,int v,int c)
{u=++cnt;tree[u]=tree[pre];tree[u].ct+=c;tree[u].v+=v*c;if(l==r) return;int mid=l+r>>1;if(v<=mid) update(l,mid,tree[pre].l,tree[u].l,v,c);elseupdate(mid+1,r,tree[pre].r,tree[u].r,v,c);
}
// void change(int &u,int l,int r,int v,int c)
// {// if(!u) u=++cnt;
// tree[u].ct+=c;
// tree[u].v+=v*c;
// if(l==r) return;
// int mid=l+r>>1;
// if(v<=mid)
// change(tree[u].l,l,mid,v,c);
// else
// change(tree[u].r,mid+1,r,v,c);
// }
// // 求前k大的sum
// ll query(int l,int r,int L,int R,int k)
// {// if(!k) return 0ll;
// if(l==r) return 1ll*k*l;
// int mid=l+r>>1;
// int tmp=tree[tree[R].r].ct-tree[tree[L].r].ct;
// if(k<=tmp)
// return query(mid+1,r,tree[L].r,tree[R].r,k);
// else
// return (1ll*tree[tree[R].r].v-tree[tree[L].r].v)+query(l,mid,tree[L].l,tree[R].l,k-tmp);
// }
// // 计算数组l~r的答案 取前k大
// ll calc(int l,int r,int k,int x)
// {// // a[l]+d[l+1]~d[r]+abs(0-a[r])// ll v=(s[r]-s[l]+a[r]+a[l])/2;
// ll s1=query(0,U,rt[0][l],rt[0][r],k);
// ll s2=query(0,U,rt[1][l],rt[1][r],k);
// return v-s1-s2+1ll*k*x;
// }
// 求前k大的sum
ll query(int l,int r,int L,int R,int k,int v)
{if(!k) return 0ll;if(l==r) return 1ll*k*l;int mid=l+r>>1;int tmp=tree[tree[R].r].ct-tree[tree[L].r].ct+(mid<v&&v<=r);if(k<=tmp) return query(mid+1,r,tree[L].r,tree[R].r,k,v);else return (1ll*tree[tree[R].r].v-tree[tree[L].r].v)+(mid<v&&v<=r)*v+query(l,mid,tree[L].l,tree[R].l,k-tmp,v);
}
// 计算数组l~r的答案 取前k大
ll calc(int l,int r,int k,int x)
{// a[l]+d[l+1]~d[r]+abs(0-a[r])ll v=(s[r]-s[l]+a[r]+a[l])/2;ll s1=query(0,U,rt[0][l],rt[0][r],k,a[l]);ll s2=query(0,U,rt[1][l],rt[1][r],k,a[r]);return v-s1-s2+1ll*k*x;
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++) {a[i]=rd();d[i]=abs(a[i]-a[i-1]);s[i]=s[i-1]+d[i];if(a[i]>=a[i-1]) {update(0,U,rt[0][i-1],rt[0][i],d[i],1);rt[1][i]=rt[1][i-1];}else{update(0,U,rt[1][i-1],rt[1][i],d[i],1);rt[0][i]=rt[0][i-1];}}while(m--){int x=rd(),y=rd(),k=rd();// a[x] d[x+1] d[x+2]... d[y] abs(0-a[y])// change(rt[0][y],0,U,a[x],+1);// change(rt[1][y],0,U,a[y],+1);int l=0,r=min(tree[rt[0][y]].ct-tree[rt[0][x]].ct,tree[rt[1][y]].ct-tree[rt[1][x]].ct)+1;//cout<<l<<' '<<r<<'\n';while(l<r){int mid=l+r>>1;if(calc(x,y,mid,k)<=calc(x,y,mid+1,k)) r=mid;else l=mid+1;}printf("%lld\n",calc(x,y,l,k));// change(rt[0][y],0,U,a[x],-1);// change(rt[1][y],0,U,a[y],-1);}return 0;
}
2021牛客暑期多校训练营7 K-xay loves sequence(主席树+二分)相关推荐
- 【2021牛客暑期多校训练营7】xay loves trees(dfs序,维护根出发的链)
F xay loves trees 题意: 给出两棵树,由这两棵树根据规则可以生成一个图,规则如下:如果u , v在第一棵树中满足其中一个点是另一个点祖先且最终所有所选的点都互相联通,在第二棵树中满足 ...
- 【2021牛客暑期多校训练营7 】 xay loves count
题目:点这里 要求:给出一组数,求满足 的i,j,k有多少个 分析:列举ak,对每一个找出满足题意的i,j然后计算有多少个(三个数可以相同,找i,j的范围是0~sqrt(ak): 下面还是队友代码时间 ...
- 2021牛客暑期多校训练营2 K Stack
题目大意: 题目告诉你利用单调栈几个点前面比它小并包含它自身的元素有多少个 让你构造一个包含1到n并每个数字只出现一次的序列 思路: 我们可以对于每个点都算出栈中元素的数量 对于没有给出的点的栈中元素 ...
- 2021牛客暑期多校训练营9
2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...
- 2021牛客暑期多校训练营5
2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...
- 2021牛客暑期多校训练营4
2021牛客暑期多校训练营4 题号 题目 知识点 A Course B Sample Game C LCS D Rebuild Tree E Tree Xor 思维+线段树 F Just a joke ...
- 2021牛客暑期多校训练营3
2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...
- 2021牛客暑期多校训练营2
2021牛客暑期多校训练营2 题号 题目 知识点 A Arithmetic Progression B Cannon C Draw Grids D Er Ba Game E Gas Station F ...
- 2021牛客暑期多校训练营1
2021牛客暑期多校训练营1 题号 题目 知识点 难度 A Alice and Bob 博弈论 B Ball Dropping 计算几何 签到 C Cut the Tree D Determine t ...
- 2021牛客暑期多校训练营2,签到题CDFKI
2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...
最新文章
- 越阳刚的男人越容易生女孩
- 6.QT信号槽的时序分析
- 《算法与数据结构专场》BitMap算法介绍
- python使用rabbitmq阻塞_python – Celery/RabbitMQ unacked消息阻塞队列?
- 机器学习火热,SQL 开发人员有何用?
- 单用户模式 启动 mysql_单用户模式连接以及故障排除
- Fang Fang 思维题
- ntp子母钟(gps子母钟系统)时钟系统在智能交通系统中的重要性
- 2021最新Java面试真题解析!java开发技能掌握
- 量子计算(十五):半导体量子芯片
- Sails.js简介
- 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数
- vue组件可视化_Vue HTML5音频可视化组件
- 关于STM32F407ZGT6的一些知识小结及串口1程序
- 高德h5地图api接口_H5,JS中使用微信、高德获取定位
- 沈询 java进阶,7细品这杯香浓的咖啡 阿里中间件高级专家沈询的JAVA之旅
- 通信系统与网络思维导图
- 【IT公司笔试面试】75道逻辑推理题及答案
- FAT16和FAT32目录结构分析
- 【转】揭秘迅雷VIP用户的破解方法
热门文章
- pixelbook安装linux系统,谷歌Pixelbook可以运行Fuchsia操作系统 正测试
- linux自动应答,08. 创建 ks.cfg自动应答文件
- 算法题目——质量(POJ-1862)
- mysql无法创建新用户_如何mysql禁止创建新用户
- 7-8 最优服务次序问题 (10 分)
- 7-1 活动选择问题 (25 分)(思路+详解+扩展)宝 今天你AC了吗!!!
- C++未定义行为-数组越界
- random(随机函数生成)
- A Mini Locomotive POJ - 1976(动态规划+思维)
- 数据结构与索引-- B+树索引