P3332 [ZJOI2013]K大数查询(整体二分做法)

P3332 [ZJOI2013]K大数查询

题意:

在这里插入图片描述

题解:

利用整体二分来做,这个题和P3834 【模板】可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改+区间查询
但是不知道为什么我调了一阵子也不对。。人傻了

代码:

自己写的代码还没调出:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b)
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=5e4+9;
struct node{int op,x,y;ll k;int id;
}q[maxn],q1[maxn],q2[maxn];
ll ans[maxn];
struct tree{int l,r;ll sum;ll lazy;
}tr[maxn<<2];
void pushup(int root){tr[root].sum=tr[root<<1].sum+tr[root<<1|1].sum;
}
void cal(int root,ll x)
{tr[root].sum=1ll*(tr[root].r-tr[root].l+1)*x;tr[root].lazy+=x;
}
void pushdown(int root){cal(root<<1,tr[root].lazy);cal(root<<1|1,tr[root].lazy);tr[root].lazy=0;
}
void build(int root,int l,int r)
{tr[root].l=l;tr[root].r=r;if(l==r){tr[root].sum=0;tr[root].lazy=0;return; }int mid=l+r>>1;build(root<<1,l,mid);build(root<<1|1,mid+1,r);pushup(root);
}
void update(int root,int l,int r,ll x){if(tr[root].r<l||tr[root].l>r)return ;if(tr[root].l>=l&&tr[root].r<=r){cal(root,x);return ;}if(tr[root].lazy)pushdown(root);update(root<<1,l,r,x);update(root<<1|1,l,r,x);pushup(root);
}
ll query(int root,int l,int r)
{if(tr[root].r<l||tr[root].l>r)return 0;if(tr[root].l>=l&&tr[root].r<=r){return tr[root].sum;}if(tr[root].lazy)pushdown(root);return query(root<<1,l,r)+query(root<<1|1,l,r);
}void solve(int ql,int qr,ll L,ll R)
{//printf("ql=%d qr=%d L=%d R=%d\n",ql,qr,L,R);if(ql>qr||L>R)return ;if(L==R){for(int i=ql;i<=qr;i++)if(q[i].op==2)ans[q[i].id]=L;return ;}int len1=0,len2=0;ll mid=L+R>>1;for(int i=ql;i<=qr;i++){if(q[i].op==1)//添加 {if(q[i].k<=mid)//放在右侧 {q2[++len2]=q[i];}else{update(1,q[i].x,q[i].y,1);q1[++len1]=q[i];} }else //查询 {ll tmp=query(1,q[i].x,q[i].y);if(tmp>=q[i].k){q1[++len2]=q[i];}else {q[i].k-=tmp;q2[++len2]=q[i];}}}for(int i=1;i<=len1;i++){if(q[i].op==1&&q[i].k>mid)update(1,q[i].x,q[i].y,-1);}for(int i=1;i<=len1;i++)q[ql+i-1]=q1[i];for(int i=1;i<=len2;i++)q[ql+len1+i-1]=q2[i];solve(ql,ql+len1-1,L,mid);solve(ql+len1,qr,mid+1,R);
}
int main()
{int n,m;cin>>n>>m;int tot=0;for(int i=1;i<=m;i++){int op,l,r;ll c;cin>>op>>l>>r>>c;if(op==1)//添加操作 q[i]=(node){op,l,r,c};if(op==2)//查询 q[i]=(node){op,l,r,c,++tot};}build(1,1,n); solve(1,m,-n,n);for(int i=1;i<=tot;i++){cout<<ans[i]<<endl;}return 0;
}

别人的AC的代码(和我写的风格很像):

#include <bits/stdc++.h>
using namespace std;
#define debug(...) fprintf(stderr,__VA_ARGS__)
typedef long long ll;
const int MAXN=200010;
const ll INF=2e18;
struct seg{int l,r;ll add,sum;
}t[MAXN<<2];
void pushup(int x){t[x].sum=t[x<<1].sum+t[x<<1|1].sum;
}
void pushdown(int x){if (!t[x].add) return;int l=t[x].l,r=t[x].r,mid=(l+r)>>1;t[x<<1].add+=t[x].add;t[x<<1|1].add+=t[x].add;t[x<<1].sum+=t[x].add*(mid-l+1);t[x<<1|1].sum+=t[x].add*(r-mid);t[x].add=0;
}
void build(int x,int l,int r){t[x]=(seg){l,r,0,0};if (l==r)return;int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);pushup(x);
}
void update(int x,int ql,int qr,ll v){int l=t[x].l,r=t[x].r;if (ql<=l&&r<=qr){t[x].add+=v;t[x].sum+=v*(r-l+1);return;}pushdown(x);int mid=(l+r)>>1;if (ql<=mid) update(x<<1,ql,qr,v);if (mid<qr) update(x<<1|1,ql,qr,v);pushup(x);
}
ll query(int x,int ql,int qr){int l=t[x].l,r=t[x].r;if (ql<=l&&r<=qr) return t[x].sum;pushdown(x);int mid=(l+r)>>1;ll res=0;if (ql<=mid) res+=query(x<<1,ql,qr);if (mid<qr) res+=query(x<<1|1,ql,qr);return res;
}
ll ans[MAXN];
int n,m;
struct event{int opt,x,y;ll v;int id;void print(){debug("%d %d %d %lld\n",opt,x,y,v);}
}q[MAXN],q1[MAXN],q2[MAXN];
void solve(ll l,ll r,int ql,int qr){if (ql>qr||l>r) return;if (l==r){for (int i=ql;i<=qr;i++)if (q[i].opt==2) ans[q[i].id]=l;return;}ll mid=(l+r)>>1;int cnt1=0,cnt2=0;for (int i=ql;i<=qr;i++){if (q[i].opt==1){if (q[i].v>mid){update(1,q[i].x,q[i].y,1);q1[++cnt1]=q[i];}elseq2[++cnt2]=q[i];}else{ll tmp=query(1,q[i].x,q[i].y);if (tmp>=q[i].v)q1[++cnt1]=q[i];else{q[i].v-=tmp;q2[++cnt2]=q[i];}}}for (int i=1;i<=cnt1;i++)if (q1[i].opt==1&&q1[i].v>mid) update(1,q1[i].x,q1[i].y,-1);for (int i=ql;i<ql+cnt1;i++)q[i]=q1[i-ql+1];for (int i=ql+cnt1;i<=qr;i++)q[i]=q2[i-ql-cnt1+1];solve(mid+1,r,ql,ql+cnt1-1);solve(l,mid,ql+cnt1,qr);
}
int main(){scanf("%d%d",&n,&m);build(1,1,n);int tot=0;for (int i=1;i<=m;i++){int opt,a,b;ll c;scanf("%d%d%d%lld",&opt,&a,&b,&c);if(opt==2)q[i]=(event){opt,a,b,c,++tot};else q[i]=(event){opt,a,b,c,0};}solve(-n,n,1,m);for (int i=1;i<=tot;i++)printf("%lld\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[APIO2020]交换城市(交互+kruskal重构树)

[APIO2020]交换城市 description solution 如果u,vu,vu,v存在于一条链上&#xff08;只有两个点度数为111其余点度数为222&#xff09;则无解&#xff0c;否则必有解 如图&#xff0c;不管是哪个点度数>2>2>2&#xff0c;都可以有解 以蓝色为例&#xff0c;第二个…

如何在ASP.NET Core程序启动时运行异步任务(1)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 1)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu背景当我们做项目的时候&#xff0c;有时候希望自己的ASP.NET Core应用在启动前执行一些初始化逻辑。例如&#xff0c;你希望验证配置是否合…

扫描线讲解

参考文章&#xff1a; 线段树扫描线&#xff08;有关扫描线的理解&#xff09; 线段树扫描线&#xff08;基本原理&#xff09; 扫描线 第二个文章里面的图很生动&#xff1a; 我总结一下就是&#xff1a;将所给图形的横坐标全部记录&#xff0c;纵坐标记录为扫描线 然后对与…

梁迪:我为MVP骄傲,《微软最有价值专家奖励计划介绍》附专题视频

题记&#xff1a;有些事情&#xff0c;比 MVP 更加不朽&#xff0c;浩气长空&#xff0c;日月星汉&#xff0c;我们为 MVP 和那些心目中的“MVP”感到骄傲。微软 MVP 是一种追求&#xff0c;不必要去强求&#xff0c;但 MVP 必定是俱乐部发展的根基础。火车跑得快全凭车头带&am…

P3295 [SCOI2016]萌萌哒(DP+倍增)

P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同&#xff0c;很容易就想到了并查集&#xff0c;直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结构将其转化成O(nlog⁡n)O(n\log n)O(nlogn)的 树之类的就不考虑了&#xff0c;一段一段的区间…

【恭贺新春】2019年春节放假

2019年放假通知致全体微友&#xff1a; 2019年2月5日&#xff08;正月初一&#xff09;至2月8日&#xff08;正月初四&#xff09;春节放假&#xff0c;共4天&#xff0c;小编停止更新公众号信息。敬请相互转告。值此新春佳节到来之际&#xff0c;“dotNet跨平台”给大家拜个…

C - Insertion Sort Gym - 101955C

C - Insertion Sort Gym - 101955C 题意&#xff1a; t组数据&#xff0c;每组数据给你n&#xff0c;k&#xff0c;q&#xff0c;让你求存在多少合法的1~n排列 合法要求&#xff1a; 对排列的前k项进行排序&#xff0c;使得整个序列中最长的递增子序列长度为n-1 题解&#x…

华为云.NET Core支持情况调查

各大公有云都提供了开发者开发的SDK&#xff0c;今天我们来看看华为云对.NET Core的支持情况怎么样&#xff1f; .NET SDK地址 https://developer.huaweicloud.com/sdk#.NET华为云的.NET SDK相比其他语言少的可伶&#xff0c;而且这几个SDK还不支持.NET Core。SDK的支持实在太差…

[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP操作descriptionsolutioncode异或descriptionsolutioncode等级descriptionsolutioncode矩阵descriptionsolutioncode操作 description 有n堆石子&#xff0c;每堆石子都有一定的数量&#xff0c;第i堆石子的数量用Ai表示。 任意两堆石子均可合并&…

.NET和Java之争

这几天连续有多篇文章诋毁.NET&#xff0c;这类文章我十几年前就看得多了&#xff0c;只不过十几年前是C和C之争&#xff0c;C和Java之争。我从来不理这类文章&#xff0c;因为这类口水战并没有什么实际意义。然而接连收到多位粉丝私聊说&#xff0c;主席&#xff0c;你应该写点…

线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化神奇的矩阵descriptionsolutioncode[NOI2013]向量内积descriptionsolutioncode矩阵既可以看成是一张数位表&#xff0c;也可以看成是若干个行向量或者若干个列向量的向量表神奇的矩阵 description solution 暴力做A∗BA*BA∗B会达到n3n^3n3的复杂度&#xff0c;难…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记&#xff1a;凡我赶不上的&#xff0c;我就在未来等他&#xff0c;随时等待捕捉那个趋势的的到来。2019年立一个FLAG&#xff0c;加入一个成长性组织&#xff0c;一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来&#xff0c;一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结&#xff0c;其中在多处用到Redis实现的分布式锁&#xff0c;虽然在OnResultExecuting方法中做了防止死锁的处理&#xff0c;但在某些场景下还是会发生死锁的问题&#xff0c;下面我只展示部分代码&#xff1a;问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意&#xff1a; 圆心为(0,0)半径为R的圆&#xff0c;现在被被n个互不相交的圆切割(圆心和半径会给出)&#xff0c;保证这n个彼此之间不会交叉&#xff0c;保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径&#xff08;即两点…

线性代数二之矩阵加速DP——数学作业,Arc of Dream

矩阵加速数学作业descriptionsolutioncodeArc of Dreamdescriptionsolutioncode数学作业 description solution dpdpdp状态转移方程&#xff0c;dpidpi−1∗10lenii(modM)dp_{i}dp_{i-1}*10^{len_i}i\pmod Mdpi​dpi−1​∗10leni​i(modM) nnn巨大&#xff0c;分段矩阵加速 …

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

接着上一篇Shadow Properties之美&#xff08;一&#xff09;&#xff0c;我们来继续举一个有点啰嗦的栗子。先看简单需求&#xff1a;某HR系统&#xff0c;需要记录员工资料。需要记录的资料有&#xff1a;员工号&#xff08;规则&#xff1a;分公司所在城市拼音首字母&#x…

线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

状压与矩阵加速的藕断丝连Quad Tilingdescriptionsolutioncode[Hnoi2010]Bus 公交线路descriptionsolutioncodeQuad Tiling description solution 设dpi,S:dp_{i,S}:dpi,S​: iii列的状态为SSS的方案数&#xff0c;最后答案为dpn,(1<<4)−1dp_{n,(1<<4)-1}dpn,(…

如何在ASP.NET Core程序启动时运行异步任务(2)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 2)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu在我的上一篇博客中&#xff0c;我介绍了如何在ASP.NET Core应用程序启动时运行一些一次性异步任务。本篇博客将继续讨论上一篇的内容&…

线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

动态DP——广义矩阵加速SP1716 GSS3 - Can you answer these queries IIIdescriptionsolutioncode[NOIP2018 提高组] 保卫王国descriptionsolutioncode动态DP能矩阵加速要满足外层操作符对内层操作符具有分配率加法对于乘法就具有分配率(ab)*ca*cb*c SP1716 GSS3 - Can you a…

.Net Core跨平台应用研究-HelloArm(串口篇)

引言为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行&#xff0c;针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证研究。硬件环境硬件系统经过对比筛选&#xff0c;选用了友善之臂出品的NanoPC-T3 Plus…