这个区间离散化把我调死了。。

总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度

千万要注意下标不能弄错!

#include<bits/stdc++.h>
#define MAXN 400005
#define INF 1000000000
#define MOD 1000000007
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
int N;
int X[MAXN],Y[MAXN],L[MAXN],R[MAXN];
vector<int> v;
int X1,X2,Y1,Y2,A1,A2,B1,B2,C1,C2,M1,M2;
struct segtree
{
ll sum[*MAXN];
int lazy[*MAXN],len[*MAXN];
void pushup(int k)
{
sum[k]=sum[k*]+sum[k*+];
}
void pushdown(int k)
{
if(!lazy[k]) return;
for(int i=k*;i<=k*+;i++)
{
lazy[i]+=lazy[k];
sum[i]+=lazy[k]*len[i];
}
lazy[k]=;
return;
}
void build(int k,int l,int r)
{
if(l==r)
{
len[k]=v[l]-v[l-];
return;
}
int mid=(l+r)/;
build(k*,l,mid); build(k*+,mid+,r);
pushup(k);
len[k]=len[k*]+len[k*+];
}
void update(int k,int l,int r,int x,int y)
{
if(x>r||l>y) return;
if(l>=x&&r<=y)
{
lazy[k]++;
sum[k]+=len[k];
return;
}
pushdown(k);
int mid=(l+r)/;
update(k*,l,mid,x,y); update(k*+,mid+,r,x,y);
pushup(k);
}
int query(int k,int l,int r,ll x)
{
if(l==r)
{
int cnt=sum[k]/len[k];
int id=(x-)/cnt;
return v[l-]+id;
}
pushdown(k);
int mid=(l+r)/;
if(sum[k*]>=x) return query(k*,l,mid,x); else return query(k*+,mid+,r,x-sum[k*]);
}
}seg;
int main()
{
scanf("%d",&N);
scanf("%d%d%d%d%d%d",&X1,&X2,&A1,&B1,&C1,&M1);
scanf("%d%d%d%d%d%d",&Y1,&Y2,&A2,&B2,&C2,&M2);
X[]=X1; X[]=X2; Y[]=Y1; Y[]=Y2;
for(int i=;i<=N;i++)
{
X[i]=(1LL*A1*X[i-]+1LL*B1*X[i-]+C1)%M1;
Y[i]=(1LL*A2*Y[i-]+1LL*B2*Y[i-]+C2)%M2;
}
for(int i=;i<=N;i++)
{
L[i]=min(X[i],Y[i])+;
R[i]=max(X[i],Y[i])+; R[i]++;
v.push_back(L[i]); v.push_back(R[i]);
} sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end()); int sz=(int)v.size()-;
seg.build(,,sz);
ll sum=;
for(int i=;i<=N;i++)
{
int posl=lower_bound(v.begin(),v.end(),L[i])-v.begin();
int posr=lower_bound(v.begin(),v.end(),R[i])-v.begin();
posl++;
seg.update(,,sz,posl,posr);
sum+=R[i]-L[i];
printf("%d\n",seg.query(,,sz,(sum+)/));
}
return ;
}

update:其实用数组离散化也可以,,只是我的数组开小了一直不知道错在哪里。。

#include<bits/stdc++.h>
#include<vector>
using namespace std;
#define maxn 800005
#define MAXN 800005
#define ll long long
ll x[maxn],y[maxn],l[maxn],r[maxn];
ll n,a1,a2,b1,b2,c1,c2,m1,m2,m;
vector<ll>v;
ll h[maxn]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
//叶子结点l代表第l个区间,即起点为v[l-1],长度为v[l]-v[l-1]
ll sum[maxn<<],lazy[maxn<<],len[maxn<<];
void pushup(int rt){
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void pushdown(int rt){
if(lazy[rt]){
for(int i=(rt<<);i<=(rt<<|);i++){
lazy[i]+=lazy[rt];
sum[i]+=lazy[rt]*len[i];
}
lazy[rt]=;
}
}
void build(int l,int r,int rt){
if(l==r){
len[rt]=h[l+]-h[l];
return;
}
int m=l+r>>;
build(lson);build(rson);
len[rt]=len[rt<<]+len[rt<<|];
}
void update(int L,int R,int l,int r,int rt){
if(L>R)return;
if(L<=l && R>=r){
lazy[rt]++;
sum[rt]+=len[rt];
return;
}
pushdown(rt);
int m=l+r>>;
if(L<=m)update(L,R,lson);
if(R>m)update(L,R,rson);
pushup(rt);
}
ll query(ll k,int l,int r,int rt){
if(l==r){
int tmp=sum[rt]/len[rt];
int tmp2=(k-)/tmp;
return h[l]+tmp2;
}
pushdown(rt);
int m=l+r>>;
if(k<=sum[rt<<])return query(k,lson);
else return query(k-sum[rt<<],rson);
}
int main(){
cin>>n;
cin>>x[]>>x[]>>a1>>b1>>c1>>m1;
cin>>y[]>>y[]>>a2>>b2>>c2>>m2;
for(int i=;i<=n;i++){
x[i]=(a1*x[i-]+b1*x[i-]+c1)%m1;
y[i]=(a2*y[i-]+b2*y[i-]+c2)%m2;
}
for(int i=;i<=n;i++){
l[i]=min(x[i],y[i])+;
r[i]=max(x[i],y[i])+;
r[i]++;
h[++m]=l[i];h[++m]=r[i];
}
sort(h+,h++m);
m=unique(h+,h++m)-h-;
build(,m-,); ll sum=;
for(int i=;i<=n;i++){
int posl=lower_bound(h+,h+m+,l[i])-h;
int posr=lower_bound(h+,h+m+,r[i])-h;
posr--;
sum+=r[i]-l[i];
update(posl,posr,,m-,);
cout<<query((sum+)/,,m-,)<<'\n';
}
}

线段树区间离散化——牛客多校E的更多相关文章

  1. 线段树优化dp——牛客多校第一场I(好题)

    和两天做了两道数据结构优化dp的题,套路还是差不多的 题解链接! https://www.cnblogs.com/kls123/p/11221471.html 一些补充 其实这道题的dp[i]维护的不 ...

  2. ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)

    这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...

  3. 线段树区间离散化维护按秩合并并查集(可撤销)——牛客多校第八场E

    模板题..去网上学了可撤销的并查集.. /* 给定一个无向图,边的属性为(u,v,l,r),表示<u,v>可以通过的size为[l,r] 求出有多少不同的size可以从1->n 把每 ...

  4. 线段树 B数据结构 牛客练习赛28

    链接:https://ac.nowcoder.com/acm/contest/200/B来源:牛客网 题目描述 qn姐姐最好了~     qn姐姐给你了一个长度为n的序列还有m次操作让你玩,     ...

  5. 【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解

    https://www.nowcoder.com/acm/contest/143/I vc-dimension 题解:分三种情况,组合数学算一下,其中一种要用树状数组维护 技巧(来自UESTC):1. ...

  6. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  7. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  8. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  9. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

随机推荐

  1. vue 项目 跳转 页面 不刷新 问题

    vue项目中需要导出下载客户数据,因为数据太多,响应太慢.后台直接上传给七牛  然后返回一个下载链接  前端通过跳转链接 来下载 riskManagementApi.friendExprotAll(t ...

  2. JMeter生成性能报表-Windows环境和Linux环境

    转载自https://www.cnblogs.com/imyalost/p/10239317.html

  3. Magento站点优化方案

    Magento 是一个开源电子商务系统,尤其以扩展性高著称,但是很高的扩展性往往是牺牲了速度为代价的,虽然现在magento为速度提升做了很多工作,但是还是没能达到人们对速度的要求.既然如此还是很自然 ...

  4. 数学思维——cf351A

    把每个值的各种贡献算一下即可 /* ai的小数部分为xi,向下取整对答案贡献为xi 向上取整对答案的贡献是xi-1,如果这个数是0,那么对答案的贡献是xi,即如果0向上取整就可以免去-1 然后sum{ ...

  5. 高级运维(三):部署Lnmp环境、构建Lnmp平台、地址重写

    一.部署LNMP环境 目标: 安装部署Nginx.MariaDB.PHP环境 1> 安装部署Nginx.MariaDB.PHP.PHP-FPM: 2> 启动Nginx.MariaDB.FP ...

  6. 训练集(train set) 验证集(validation set) 测试集(test set)。

    训练集(train set) 验证集(validation set) 测试集(test set). http://blog.sina.com.cn/s/blog_4d2f6cf201000cjx.ht ...

  7. robotframework悬浮菜单定位问题

      有些菜单是悬浮菜单,鼠标点上去下级元素才会显示.比如在第一个菜单中选择后会触发二级菜单的某事件,触发二级菜单又去点三级菜单.. 最开始就用click element去点击了,可是菜单会缩回去,就有 ...

  8. 浅谈C/C++中的static和extern关键字

    static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话 ...

  9. asp.net core容器&mysql容器network互联 & docker compose方式编排启动多个容器

    文章简介 asp.net core webapi容器与Mysql容器互联(network方式) docker compose方式编排启动多个容器 asp.net core webapi容器与Mysql ...

  10. 错误 1 error C4996: 'getcwd': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getcwd. See online help for details.

    解决办法: 属性>C/C++>预处理定义>编辑>添加_CRT_NONSTDC_NO_DEPRECATE>应用