Description

DX3906星系,Melancholy星上,我在勘测这里的地质情况。
我把这些天来已探测到的区域分为N组,并用二元组(D,V)对每一组进行标记:其中D为区域的相对距离,V为内部地质元素的相对丰富程度。
在我的日程安排表上有Q项指派的计划。每项计划的形式是类似的,都是“对相对距离D在[L,R]之间的区域进行进一步的勘测,并在其中有次序地挑出K块区域的样本进行研究。”采集这K块的样品后,接下来在实验中,它们的研究价值即为这K块区域地质相对丰富程度V的乘积。
我对这Q项计划都进行了评估:一项计划的评估值P为所有可能选取情况的研究价值之和。
但是由于仪器的原因,在一次勘测中,这其中V最小的区域永远不会被选取。
现在我只想知道这Q项计划的评估值对2^32取模后的值,特殊地,如果没有K块区域可供选择,评估值为0。

Input

第一行给出两个整数,区域数N与计划数Q。
第二行给出N个整数,代表每一块区域的相对距离D。
第三行给出N个整数,代表每一块区域的内部地质元素的相对丰富程度V。
接下来的Q行,每一行3个整数,代表相对距离的限制L,R,以及选取的块数K。

Output

输出包括Q行,每一行一个整数,代表这项计划的评估值对2^32取模后的值。

Sample Input

5 35 4 7 2 61 4 5 3 26 7 12 6 21 8 3

Sample Output

552924

Data Constraint

分析

我们离散以后建线段树,然后剔除最小值也很简单,把最小值的位置找出来,求l,pos-1;pos+1,r的值就行了

然后值=∑i=1leftval[i]+right[val][i]  +∑i=1i<=6j=1j<ileftval[j]*rightval[i-j]

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <memory.h>
using namespace std;
#define lson t[x].l
#define rson t[x].r
typedef unsigned int ll;
const int N=1e5+10;
struct Area {ll d,v;bool operator < (const Area a) const {return d<a.d;}
}a[N];
struct Seg {int l,r,pos;ll min,sum[7];
}t[4*N];
int cnt,rt;
int tpos;
ll tmin,b[2][7],ans[7],l,r;
int n,q,k;inline void Build(int &x,int l,int r) {if (!x) x=++cnt;if (l==r) {t[x].min=t[x].sum[1]=a[l].v;t[x].pos=l;return;}register int mid=l+r>>1;Build(lson,l,mid);Build(rson,mid+1,r);t[x].min=min(t[lson].min,t[rson].min);t[x].pos=t[x].min==t[lson].min?t[lson].pos:t[rson].pos;for (register int i=1;i<=6;i++) t[x].sum[i]=t[lson].sum[i]+t[rson].sum[i];for (register int i=1;i<=6;i++)for (register int j=1;j<i;j++) t[x].sum[i]+=t[lson].sum[j]*t[rson].sum[i-j];
}inline void Get_Min(int x,int l,int r,int xl,int xr) {if (xl<=l&&r<=xr) {if (tmin>t[x].min) tmin=t[x].min,tpos=t[x].pos;return;}register int mid=l+r>>1;if (xl<=mid) Get_Min(lson,l,mid,xl,xr);if (mid<xr) Get_Min(rson,mid+1,r,xl,xr);
}inline void Query(int x,int l,int r,int xl,int xr,int side) {if (l>r||l>xr||xl>r||xl>xr) return;if (xl<=l&&r<=xr) {ll c[7]={0,0,0,0,0,0,0};for (register int i=1;i<=6;i++) c[i]=b[side][i]+t[x].sum[i];for (register int i=1;i<=6;i++)for (register int j=1;j<i;j++) c[i]+=b[side][j]*t[x].sum[i-j];memcpy(b[side],c,sizeof c);return;}register int mid=l+r>>1;if (xl<=mid) Query(lson,l,mid,xl,xr,side);if (mid<xr) Query(rson,mid+1,r,xl,xr,side);
}inline void Solve() {l=lower_bound(a+1,a+n+1,(Area){l,0})-a;r=upper_bound(a+1,a+n+1,(Area){r,0})-a-1;if (r-l<k) {printf("0\n");return;}if (l>=r) {printf("0\n");return;}tmin=2147483647u;tpos=-1;Get_Min(rt,1,n,l,r);memset(b,0,sizeof b);Query(rt,1,n,l,tpos-1,0);Query(rt,1,n,tpos+1,r,1);for (register int i=1;i<=6;i++) ans[i]=b[0][i]+b[1][i];for (register int i=1;i<=6;i++)for (int j=1;j<i;j++) ans[i]+=b[0][j]*b[1][i-j];for (register int i=1;i<=k;i++) ans[k]*=i;printf("%u\n",ans[k]);
}int main() {scanf("%d%d",&n,&q);for (int i=1;i<=n;i++) scanf("%d",&a[i].d);for (int i=1;i<=n;i++) scanf("%d",&a[i].v);sort(a+1,a+n+1);Build(rt,1,n);for (int i=1;i<=q;i++) {scanf("%d%d%d",&l,&r,&k);Solve();}
}

View Code

转载于:https://www.cnblogs.com/mastervan/p/10331709.html

[线段树][数学]JZOJ 4237 Melancholy相关推荐

  1. [支配树][lca][倍增][线段树][拓扑] Jzoj P4240 游行

    Description 恶梦是学校里面的学生会主席.他今天非常的兴奋,因为学校一年一度的学生节开始啦!! 在这次节日上总共有N个节目,并且总共也有N个舞台供大家表演.其中第i个节目的表演时间为第i个单 ...

  2. P6327 区间加区间sin和 线段树 + 数学

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,有mmm次操作,每次操作分两种类型: (1)l,r,v(1)l,r,v(1)l,r,v,将al,al+1,...,ara_l ...

  3. jzoj4231-寻找神格【线段树,数学】

    正题 题目大意 4个操作 单点修改,区间修改,区间求和,区间求方差 方差为:∑(xi−ave)2n\frac{\sum(x_i-ave)^2}{n}n∑(xi​−ave)2​ aveaveave为平均 ...

  4. CF311D Interval Cubing 数学、线段树

    CF311D Interval Cubing 数学.线段树 数学太重要了..有些人知道点结论就喜欢搞个数学包装水题,欺负吾等数学学渣啊... CF有官方题解,不过我还是记录一下吧. 这是个线段树的经典 ...

  5. P4588 [TJOI2018]数学计算(线段树维护区间乘和单点修改)

    P4588 [TJOI2018]数学计算 刚看到这题根本每想到用线段树,直接每次记录计算结果然后找到要除的数字就好了呗 但是!你会注意到,如果连续乘很多很多次,然后再除的话,如果不取模会爆 long ...

  6. Gym-101466K Random Numbers(线段树,数学,唯一分解定理)

    给一棵树,树上每个节点有一个权值,有两个操作,RAND操作查询u的子树乘积是多少以及有多少因数,SEED操作把节点u乘上v n,q <= 1e5.数值小于等于1e9,最大的质因数不超过13 组队 ...

  7. 【线段树】矮人排队(jzoj(gz) 3236)

    矮人排队 jzoj (gz)3236 题目大意: 有n个人,高度分别为1,2--n(高度按输入来看),现在有两种操作 1:把第x个人和第y个人换一下 2:询问高度为A,A+1--B这B-A+1个人是否 ...

  8. 小C的数学问题 线段树+分治

    题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n个数,每个数有权 ...

  9. JZOJ 7036. 2021.03.30【2021省赛模拟】凌乱平衡树(平衡树单旋+权值线段树)

    JZOJ 7036. 2021.03.30[2021省赛模拟]凌乱平衡树 题目大意 给出两棵Treap,大小分别为 n , m n,m n,m,每个点的 p r i o r i t y priorit ...

  10. [Splay][线段树] jzoj P5662 尺树寸泓

    Description Input Output Sample Input 3 4 1 2 3 1 0 0 1 0 0 2 1 0 1 2 2 2 1 Sample Output 3 6 2 Data ...

最新文章

  1. 个人博客开发-01-nodeJs项目搭建
  2. Android Activity使用OnGesture事件以后与子View的Click事件冲突解决办法
  3. python扩展,用python扩展列
  4. 三大前端框架,哪个框架组件间交互像js方法传值一样简单
  5. 贪心——区间选点问题(用最少数量的箭引爆气球 Leetcode 452)
  6. Windows下架设SVN服务
  7. 马士兵Python基础版2020教程P98-P134 PPT笔记+课堂代码
  8. 最新版盲盒商城thinkphp+uniapp
  9. WSUS:数据库从WID 换成 SQLExpress
  10. word行距设置教程
  11. APP如何实现「年轻化」的需求?
  12. ESP32CAM摄像头图像实时传输
  13. 清歌输入法 for Mac(最好用的五笔输入法
  14. zip和tgz以及exe的区别
  15. git如何新建分支进行开发
  16. 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序:
  17. 从无人问津到产值超千亿,动力电池回收利用,是新金矿吗?
  18. c++处理excel
  19. 利用VcOutPut.sh检查QE vc-relax优化情况
  20. 《REWORK》启示录 招聘笔杆子——程序员为什么值得写博客

热门文章

  1. python编写年金终值函数_2021年高校邦Python程序设计基础【实境编程】课后习题答案...
  2. 计算机主硬盘,电脑是固态和机械双盘系统在固态为什么显示主硬盘是机械盘
  3. 开源社区ECE:Elastic认证考试复盘总结134贴
  4. K折交叉验证大集合(KFold 、Stratified k-fold、Group k-fold、StratifiedGroupKFold)
  5. Android开发 人民币符号(¥)显示不一致的问题
  6. 跟键盘在一起时间比女朋友还长? 程序员如何选好一块专属键盘?
  7. 编写windows版ANE
  8. 基于Python的招聘信息可视化分析研究
  9. c++常对象和常成员函数详解
  10. 2018中南大学 计算机考研分数,2018中南大学考研分数线多少分?