YBTOJ洛谷P2839:最大中位数(主席树、二分答案)

遇事不决,二分试试

解析

很好的一道题
真是把主席树玩明白了
一个关于中位数的常用trick:

二分答案mid,把>=mid的看成1,<mid的看成-1,然后看最大子段和是否>=0

然而如果对离散化后的每一个值建一棵小白逛公园那样的线段树显然时空双炸
这里主席树就用上了
注意到关于相邻的值域所建的两棵主席树只有个别值从1变成-1
所以就用主席树优化时空即可
时间复杂度mlogn2mlogn^2mlogn2,空间复杂度nlognnlognnlogn

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=20050;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
int tot,r[N];
struct node{int sum,l,r;
};
struct tree{int ls,rs;node o;
}tr[N*20];
inline node merge(node a,node b){node res;res.sum=a.sum+b.sum;res.l=max(a.l,a.sum+b.l);res.r=max(b.r,b.sum+a.r);return res;
}
#define pushup(k) tr[k].o=merge(tr[tr[k].ls].o,tr[tr[k].rs].o)
inline int copy(int x){tr[++tot]=tr[x];return tot;
}
#define mid ((l+r)>>1)
void build(int &k,int l,int r){k=copy(k);if(l==r){tr[k].o=(node){1,1,1};return;}build(tr[k].ls,l,mid);build(tr[k].rs,mid+1,r);pushup(k);//printf("k=%d (%d %d) sum=%d l=%d r=%d\n",k,l,r,tr[k].o.sum,tr[k].o.l,tr[k].o.r);
}
void upd(int &k,int l,int r,int p,int v){k=copy(k);if(l==r){tr[k].o=(node){v,max(v,0),max(v,0)};return;}if(p<=mid) upd(tr[k].ls,l,mid,p,v);else upd(tr[k].rs,mid+1,r,p,v);pushup(k);return;
}
node ask(int k,int l,int r,int x,int y){//printf("  k=%d (%d %d) x=%d y=%d sum=%d\n",k,l,r,x,y,tr[k].o.sum);if(x<=l&&r<=y) return tr[k].o;else if(y<=mid) return ask(tr[k].ls,l,mid,x,y);else if(x>mid) return ask(tr[k].rs,mid+1,r,x,y);else return merge(ask(tr[k].ls,l,mid,x,y),ask(tr[k].rs,mid+1,r,x,y));
}
int a[N],q[N],num;
vector <int>v[N];
int w[5];
bool check(int k,int a,int b,int c,int d){//printf("check:k=%d x=%d (%d %d) (%d %d)\n",k,q[k],a,b,c,d);node o=ask(r[k],1,n,b,c),u=ask(r[k],1,n,a,b-1),v=ask(r[k],1,n,c+1,d);//printf("res=%d+%d+%d\n\n",o.sum,u.r,v.l);return o.sum+u.r+v.l>=0;
}
int main(){n=read();for(int i=1;i<=n;i++) a[i]=q[i]=read();sort(q+1,q+1+n);num=unique(q+1,q+1+n)-q-1;for(int i=1;i<=n;i++){a[i]=lower_bound(q+1,q+1+num,a[i])-q;v[a[i]].push_back(i);}build(r[1],1,n);for(int i=1;i<num;i++){r[i+1]=r[i];for(int j=0;j<v[i].size();j++){int pl=v[i][j];upd(r[i+1],1,n,pl,-1);}}m=read();int lst=0;for(int i=1;i<=m;i++){for(int j=1;j<=4;j++) w[j]=(read()+lst)%n;sort(w+1,w+1+4);int a=w[1],b=w[2],c=w[3],d=w[4];a++;b++;c++;d++;int st=1,ed=num;while(st<ed){int o=(st+ed+1)>>1;if(check(o,a,b,c,d)) st=o;else ed=o-1;}printf("%d\n",lst=q[st]);}return 0;
}

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

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

相关文章

计数学习小记

前言 闲的无聊懒得做题不如来水点博客。 虽然一直作为一个感性做题的选手&#xff0c;但是理性层面上确实是分析题目初步做法的一个十分重要的方法。 额不会涉及具体的知识点&#xff0c;只是总结点自己做题的时候遇到的比较巧妙的方法。 混沌排版请见谅 还有我也很菜有错…

[dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)

文章目录前言树上启发式合并引入算法思想时间复杂度模板练习例题&#xff1a;CF600E Lomsat gelralsolutioncodeCF208E Blood CousinssolutioncodeCF570D Tree RequestssolutioncodeCF1009F Dominant Indicessolutioncode前言 最近不是在⛏李超树嘛&#xff0c;然后就去玩了下…

F Christmas Game

F Christmas Game 题意&#xff1a; 给一棵n个节点树&#xff0c;每个点上都有权值&#xff0c;两个人轮流操作&#xff0c;每次可以将一个点的权值给他的父亲节点&#xff0c;&#xff08;父亲节点与当前点的深度差必须为k&#xff09;&#xff0c;当有一方不能操作时即为输…

领域驱动设计,让程序员心中有码(七)

领域驱动设计- 让程序员心中有码&#xff08;七&#xff09;-设计原则和设计模式&#xff0c;互联网开发者们共同的追求前言多年来&#xff0c;笔者一直从事传统软件企业的软件开发和项目管理工作。笔者发现在众多的传统软件企业中&#xff0c;评判优秀开发者的标准往往是技能的…

codeforces:CF750 复盘

总结 solve 4 rnk:833 我变成小学生(pupil)啦&#xff01; 这次看完题解感觉D和F其实都挺可做的 还是思维的问题 A 签到题 判断加起来是奇数还是偶数即可 但我做的分类讨论就很恶心qwq 因为我没看到a、b、c都至少是1&#xff01; 所以我还在辛苦的分类讨论qwq 只能说我分类讨…

UOJ#351-新年的叶子【树的直径,数学期望】

正题 题目链接:https://uoj.ac/problem/351 题目大意 给出nnn个点的一棵树&#xff0c;开始所有点都是白色&#xff0c;每次随机点黑一个叶子&#xff08;可以重复点&#xff09;&#xff0c;求期望多少次能使得白色点构成的图直径发生变化。 答案对998244353998244353998244…

cf1504. Travelling Salesman Problem

cf1504. Travelling Salesman Problem 题意&#xff1a; n个城市&#xff0c;编号1~n&#xff0c;每个城市有美丽值a[i]&#xff0c;现在要从城市1出发&#xff0c;其他所有城市走一遍&#xff0c;最后回到城市1&#xff0c;城市i到j的花费为max(ci,aj-ai)&#xff0c;ci为第…

[NOIP-S 2020]游记(附考前注意事项)

呜呼起飞T1&#xff1a;排水系统T2&#xff1a;字符串匹配T3&#xff1a;移球游戏T4&#xff1a;微信步数总述考前注意事项T1&#xff1a;排水系统 嗯—— 怎么说呢&#xff1f;&#xff1f; 比赛开始后迅速通读三遍题 顶着第一题肯定是打卡题的心态 哪怕是恶心模拟也得上&…

模板:二维线段树(线段树套线段树)

文章目录问题解析单点修改询问完整代码标记永久化代码所谓二维线段树&#xff0c;就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作&#xff1a; 1.询问一个子矩形的最值 2.修改某一个单点的值 解析 使用线段树套线段树&#xff0c;来解决二维动态问题 注意…

程序猿修仙之路--数据结构之你是否真的懂数组?

数据结构但凡IT江湖侠士&#xff0c;算法与数据结构为必修之课。早有前辈已经明确指出&#xff1a;程序算法数据结构 。要想在之后的江湖历练中通关&#xff0c;数据结构必不可少。数据结构与算法相辅相成&#xff0c;亦是阴阳互补之法。开篇说道数组&#xff0c;几乎每个IT江…

P5643-[PKUWC2018]随机游走【min-max容斥,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5643 题目大意 给出nnn个点的一棵树&#xff0c;一个人从点xxx开始随机游走&#xff0c;然后QQQ次询问给出一个点集SSS&#xff0c;求期望多少步这个人会经过这个点集中的所有点。 1≤n≤18,1≤Q≤50001\leq n\leq 18,1\leq…

Rolling The Polygon Gym - 102222B

Rolling The Polygon Gym - 102222B 题意&#xff1a; 给你一个多边形&#xff0c;给你内部一个点Q&#xff0c;多边形在平面上滚动一周&#xff08;当有一个边第二次触地滚动停止&#xff09;&#xff0c;问Q的轨迹长度 题解&#xff1a; 计算几何题目 自己一直不是很擅长…

[杂题训练]CF1228E Another Filling the Grid(容斥),CF936C Lock Puzzle(构造)

文章目录T1&#xff1a;CF1228E Another Filling the GridsolutioncodeT2&#xff1a;CF936C Lock PuzzlesolutioncodeT1&#xff1a;CF1228E Another Filling the Grid 点我 solution 反过来思考&#xff0c;用所有方案数➖不合法方案数 很容易想到的是——容斥&#xff01…

Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章

前言事情的起因是由于一段简单的数据库连接代码引起&#xff0c;这段代码从语法上看&#xff0c;是没有任何问题&#xff1b;但是就是莫名其妙的报错了&#xff0c;这段代码极其简单&#xff0c;就是打开数据库连接&#xff0c;读取一条记录&#xff0c;然后立即更新到数据库中…

CF1146F: Leaf Partition(树形dp)

解析 阴间dp题qwq 不难设计dp&#xff1a; dpx,0:x节点没有被包含、子树内的方案数dp_{x,0}:x节点没有被包含、子树内的方案数dpx,0​:x节点没有被包含、子树内的方案数 dpx,1:x节点被包含、子树内的方案数dp_{x,1}:x节点被包含、子树内的方案数dpx,1​:x节点被包含、子树内的…

Take Your Seat Gym - 102222D

Take Your Seat Gym - 102222D 题意&#xff1a; 第一次是n个人坐飞机&#xff0c;按照1到n的顺序登机&#xff0c;第一个人登机牌丢了&#xff0c;他随机做一个座位&#xff0c;2到n个人上来按照自己的登机牌坐座位&#xff0c;如果他的座位被坐了&#xff0c;就在随机找一个…

CF446D-DZY Loves Games【高斯消元,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/CF446D 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;一些点有陷阱&#xff0c;走到时会损失一条生命&#xff0c;总共有kkk条生命&#xff0c;求从111出发随机游走到nnn没有死亡且到终点时仅剩一条命的概率。 1≤n≤…

「BJOI2019」奥术神杖(AC自动机+DP)

文章目录titlesolutioncodetitle solution 令MagicViVjVk...MagicV_i\times V_j\times V_k...MagicVi​Vj​Vk​... 这里对Magicc\sqrt[c]{Magic}cMagic​有一个很巧妙的转换——取对数 Magicc(Magic)1celoge(Magic)1c\sqrt[c]{Magic}(Magic)^{\frac{1}{c}}e^{log_e(Magic)^{…

try.dot.net 的正确使用姿势

来源&#xff1a;https://www.cnblogs.com/7tiny/p/10277600.html【简介】微软官方前不久发布了 try.dot.net 这个有趣的网址&#xff0c;开始只是图个新鲜看了一下&#xff0c;后面通过自身实践过后&#xff0c;发现这着实算是个“有趣”的站点&#xff01;首先我们大概地列举…

A - TOYS POJ - 2318

A - TOYS POJ - 2318 题意&#xff1a; 一个盒子中有n个隔板&#xff0c;分出n1个空间&#xff08;从左往右空间的编号分别是0…n&#xff09;&#xff0c;&#xff08;隔板之间不会相交&#xff0c;且按照从左往右的顺序给出&#xff09;&#xff0c;现在给你m个坐标的物品&…