题意:给2组数据a和b数组,每次有2种操作:(+,l,r,x)把a数组第l个到第r个元素全置为x,(?,l,r)查询[l,r]之间哪些位置满足a[i]>=b[i](i>=l && i<=r)并把这些位置的数量统计

一直想很久,没想到什么有效的方案,直到看到题解才明白过来,原来线段树套平衡树还有这种情况:里面其实不是平衡树,只是有序表。

然后这题就转换为区间查找数对应排名

由于此题不用对2个数组都修改,其中1个b树可作为固定的线段树套有序表以节省时间,另外1个表a树则单纯使用线段树的方法先修改,再更新对应b树结点的排名

这里查找排名如果全部logn查找会因为常数太大直接卡,注意每个结点都含有序表并且上下有包含关系

那咱们可以在b树自底向上更新父结点排名对应左右子树里的排名,用归并排序的方法,占用空间才o(nlogn),时间也是o(nlogn)

顺带把会改变的a树1个个结点查询b树查出排名,修改时先查出根结点对应位置,再根据位置子树表一边向下更新一边转移到子树对应位置

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
typedef __int64 ll;
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int cnt;
const int N=,M=,E=;
int n,m,i,a[N],b[N],x,l,r;
int st[M],en[M],v[M],tag[M],pl[E],pr[E],pool[E],cur;
ll ans,sum; void build(int x,int l,int r)
{
tag[x]=-;
if(l==r)
{
st[x]=cur+;
pool[++cur]=b[l];
en[x]=cur;
v[x]=(a[l]>=b[l]);
return;
}
int mid=((l+r)>>);
build(x<<,l,mid);
build((x<<)|,mid+,r);
v[x]=v[x<<]+v[(x<<)|];
int al=st[x<<],ar=en[x<<],bl=st[(x<<)|],br=en[(x<<)|];
st[x]=cur+;
while(al<=ar&&bl<=br)pool[++cur]=pool[al]<pool[bl]?pool[al++]:pool[bl++];
while(al<=ar)pool[++cur]=pool[al++];
while(bl<=br)pool[++cur]=pool[bl++];
en[x]=cur;
al=st[x<<],bl=st[x<<|];
for(int i=st[x];i<=cur;i++)
{
while(al<=ar&&pool[al]<=pool[i])al++;
while(bl<=br&&pool[bl]<=pool[i])bl++;
pl[i]=al-,pr[i]=bl-;
if(pl[i]<st[x<<])pl[i]=;
if(pr[i]<st[(x<<)|])pr[i]=;
}
} inline void rankpt(int x,int p)
{
v[x]=(p?p-st[x]+:);
tag[x]=p;
}
inline void pushdown(int x)
{
if(tag[x]<)return;
int p=tag[x];
rankpt(x<<,pl[p]);
rankpt((x<<)|,pr[p]);
tag[x]=-;
} void update(int x,int a,int b,int p)
{
if(l<=a && b<=r){rankpt(x,p);return;}
pushdown(x);
int mid=(a+b)>>;
if(l<=mid)update(x<<,a,mid,pl[p]);
if(r>mid)update((x<<)|,mid+,b,pr[p]);
v[x]=v[x<<]+v[(x<<)|];
} void query(int x,int a,int b)
{
if(l<=a && b<=r)
{
ans+=v[x];
return;
}
pushdown(x);
int mid=((a+b)>>);
if(l<=mid)query(x<<,a,mid);
if(r>mid)query((x<<)|,mid+,b);
v[x]=v[x<<]+v[(x<<)|];
} inline int lower(int x){
//lower_bound(pool+st[1],pool+ed[1]+1,x);
int l=st[],r=en[],mid,t=;
while(l<=r)
if(pool[mid=(l+r)>>]<=x)l=(t=mid)+;
else r=mid-;
return t;
} int seeda, seedb, C = ~(<<), MM = (<<)-;
int rnd(int last) {
seeda = ( + (last >> )) * (seeda & MM) + (seeda >> );
seedb = ( + (last >> )) * (seedb & MM) + (seedb >> );
return (C & ((seeda << ) + seedb)) % ;
} int main()
{
int t,ku;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&n,&m,&seeda,&seedb);
for(i=;i<=n;i++)scanf("%d",a+i);
for(i=;i<=n;i++)scanf("%d",b+i);
ans=sum=cur=;
build(,,n);
for(i=;i<=m;i++)
{
l=rnd(ans)%n+,r=rnd(ans)%n+,ku=rnd(ans)+;
int kkk=lower(ku);
if(l>r)l^=r^=l^=r;
if((l+r+ku)&)update(,,n,lower(ku));
else
{
ans=;
query(,,n);
sum=(sum+(ll)i*ans)%;
}
}
printf("%I64d\n",sum);
}
return ;
}

hdu5737(2016多校联赛第2场D)的更多相关文章

  1. 2016 多校联赛7 Elegant Construction

    Being an ACMer requires knowledge in many fields, because problems in this contest may use physics, ...

  2. 2016 多校联赛7 Joint Stacks (优先队列)

    A stack is a data structure in which all insertions and deletions of entries are made at one end, ca ...

  3. 2016 多校联赛7 Balls and Boxes(概率期望)

    Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...

  4. HDU 4627 The Unsolvable Problem 杭电多校联赛第三场1009 数学题

    题意描述:给出一个n,要求在所有满足n = a+b的a和b里面求a和b的最小公倍数最大的两个数的最小公倍数. 解题报告:比赛的时候看到这个题的第一反应就是寻找这两个数一定是在a和b比较接近的地方找,这 ...

  5. HDU 4639 hehe 杭电2013多校联赛第四场1008题

    解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态.先打一个 ...

  6. 2018HDU多校联赛第六场 6373 Pinball——水题&&物理题

    题意 给定一个斜面,从某处让一个小球作自由落体运动,求小球与斜面的碰撞次数(假设都为弹性碰撞). 分析 题图如下,x轴.y轴是虚拟的. 根据高中物理的套路,沿斜面方向分解重力加速度即可. #inclu ...

  7. 2015 HDU 多校联赛 5363 Key Set

    2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...

  8. 2015 HDU 多校联赛 5317 RGCDQ 筛法求解

    2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...

  9. 【杂题总汇】HDU多校赛第十场 Videos

    [HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...

随机推荐

  1. js获取当前时间戳 不需毫秒数

    var timestamp = Date.parse(new Date())/1000;

  2. javaScript中值类型通过typeof直接进行检测

    通过试验,对图像处理有了进一步深入了解和认知,基于第一次的滤波的处理和这次灰度线性变换和直方图处理图像,知道了图像的成像原理,都是一个个的像素点,就是矩阵的值.以后可以利用MATLAB进行图像处理,运 ...

  3. System.Data.SqlClient.SqlException: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)

    A network-related or instance-specific error occurred while establishing a connection to SQL Server. ...

  4. angularJS 按需加载

    之前做应用的时候都会在首页就把全站的js预先加载进来... 怎么实现按需加载? 首先在$routeProvider里面加resolve属性,angular-route提供的resolve功能,也就是路 ...

  5. Spark:Join相关优化文章

    http://blog.csdn.net/lsshlsw/article/details/48975771 https://www.douban.com/note/499691663/ http:// ...

  6. SSM框架-----------SpringMVC+Spring+Mybatis框架整合详细教程

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One  ...

  7. C#操作Mongodb的心得

    Mongodb是一个强大的文档型数据库,采用BSON的数据格式.本文主要采用其官方的C#驱动来操作其表中的集合.驱动版本为1.1.0,下载地址为: http://mongodb.github.io/m ...

  8. H5音频和视频

    使用媒体标签最大的缺点在于缺少编解码器的支持一.浏览器支持性检测检测浏览器是否支持audio元素或video元素最简单的方式就是用脚本动态创建它,然后检测特定函数是否存在 var hasVideo=! ...

  9. C语言第7次作业

    1 #include<stdio.h> int main() { char name[50];int character[26]={0};int i=0,j;int length=0;wh ...

  10. struts2:字段校验和非字段校验代码示例

    一.为什么要使用struts2的validate验证框架 :使用struts2的验证框架,能够提高客户端提交的数据的安全性.通过验证,确保保存进数据库的信息是正确的 二.使用struts2的valid ...