CF1039E-Summer Oenothera Exhibition【LCT,根号分治】

正题

题目链接:https://www.luogu.com.cn/problem/CF1039E


题目大意

给出nnn个数的序列,mmm次询问至少将这个序列分成多少段才能满足每一段的和不超过w−qiw-q_iwqi

1≤n,m≤105,1≤w,ai≤1091\leq n,m\leq 10^5,1\leq w,a_i\leq 10^91n,m105,1w,ai109


解题思路

考虑暴力的做法,我们可以每次走到必须要分段时才分段显然是正确的。

根据w−qiw-q_iwqi从小到大来做,设tit_iti表示以iii为左端点时,最长能分到的区间长度tit_iti,那么我们从iii就能直接到达i+tii+t_ii+ti

那么我们从111出发一直往右跳看跳的次数就可以了,这个和[HNOI2010]弹飞绵羊很像,考虑用LCTLCTLCT去维护。

不过这个tit_iti是可能每次都在改变的,所以不能只靠这样来做,但是注意到iii每次会直接跳过ti−1t_i-1ti1个位置,我们不需要统计全局的值。

所以我们考虑根号分治,对于一个T=nT=\sqrt nT=n,我们当ti≤Tt_i\leq TtiT时我们在LCTLCTLCT上条,当ti>Tt_i>Tti>T时我们直接暴力跳。

同样的我们不需要去维护这些>T>T>Ttit_iti,而是到达这些位置时直接二分下一个位置即可。

用一个堆去存ti≤Tt_i\leq TtiT的位置以方便更改。

时间复杂度:O(nnlog⁡n)O(n\sqrt n\log n)O(nnlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath> 
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=1e5+10,Q=230;
int n,m,w,a[N],t[N],ans[N];
int f[N][19],g[N][19],lg[N];
pair<int,int> q[N];
priority_queue<pair<int,int> >h;
struct LCT{int t[N][2],siz[N],fa[N];stack<int> s;bool r[N];bool Nroot(int x){return fa[x]&&(t[fa[x]][0]==x||t[fa[x]][1]==x);}bool Direct(int x){return (t[fa[x]][1]==x);}void PushUp(int x){siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;}void PushR(int x){swap(t[x][0],t[x][1]);r[x]^=1;return;}void PushDown(int x){if(r[x]){PushR(t[x][0]);PushR(t[x][1]);r[x]=0;}return;}void Rotate(int x){int y=fa[x],z=fa[y];int xs=Direct(x),ys=Direct(y);int w=t[x][xs^1];t[x][xs^1]=y;t[y][xs]=w;if(Nroot(y))t[z][ys]=x;if(w)fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);PushUp(x);return;}void Splay(int x){int y=x;s.push(y);while(Nroot(y))y=fa[y],s.push(y);while(!s.empty())PushDown(s.top()),s.pop();while(Nroot(x)){int y=fa[x];if(!Nroot(y))Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;}void Access(int x){for(int y=0;x;y=x,x=fa[x])Splay(x),t[x][1]=y,PushUp(x);return;}void MakeRoot(int x){Access(x);Splay(x);PushR(x);return;}void Link(int x,int y){Access(x);fa[x]=y;return;}void Cut(int x,int y){Access(x);Splay(y);fa[x]=t[y][1]=0;PushUp(y);return;}int FindRoot(int x){Access(x);Splay(x);PushDown(x);while(t[x][0])x=t[x][0],PushDown(x);Splay(x);return x;}
}T;
int MIX(int l,int r){if(r>n)return 1e9+7;int z=lg[r-l+1];int x=max(g[l][z],g[r-(1<<z)+1][z]);int y=min(f[l][z],f[r-(1<<z)+1][z]);return x-y;
}
int nxts(int x,int w){int l=x,r=n;while(l<=r){int mid=(l+r)>>1;if(MIX(x,mid)<=w)l=mid+1;else r=mid-1;}return l;
}
int main()
{scanf("%d%d%d",&n,&w,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[i][0]=g[i][0]=a[i];for(int j=1;(1<<j)<=n;j++)for(int i=1;i+(1<<j)-1<=n;i++){f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]);g[i][j]=max(g[i][j-1],g[i+(1<<j-1)][j-1]);}for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;for(int i=1;i<=n+1;i++)T.siz[i]=1;for(int i=1;i<=n;i++){t[i]=1,T.Link(i,i+t[i]);h.push(mp(-MIX(i,i+1),i));}for(int i=1;i<=m;i++)scanf("%d",&q[i].first),q[i].second=i;sort(q+1,q+1+m);reverse(q+1,q+1+m);for(int i=1;i<=m;i++){int x=w-q[i].first;while(!h.empty()&&-h.top().first<=x){int p=h.top().second;h.pop();T.Cut(p,p+t[p]);t[p]++;if(t[p]<=Q){T.Link(p,p+t[p]);h.push(mp(-MIX(p,p+t[p]),p));}else t[p]=-1;}int now=1,sum=0;while(now<n+1){if(t[now]==-1)now=nxts(now,x),sum++;else{T.Access(now);T.Splay(now);sum+=T.siz[now]-1;now=T.FindRoot(now);}}ans[q[i].second]=sum;}for(int i=1;i<=m;i++)printf("%d\n",ans[i]-1);return 0;
}

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

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

相关文章

E - Another Postman Problem FZU - 2038

E - Another Postman Problem FZU - 2038 题意&#xff1a; n个点通过n-1个边两两相连&#xff0c;每个边有权值&#xff0c;求对于每个点到其他点的距离和的总和 题解&#xff1a; 我们以下图中的1-2这条边为例子&#xff0c;1-2这条边一共计算了几次&#xff1f; 我们现在…

CF1034E Little C Loves 3 III(神仙构造+FWT_OR卷积)

title 题目 solution 先说很神仙的结论构造&#xff1a;对于aia_iai​&#xff0c;aivi∗4pop_count(i)a_iv_i*4^{pop\_count(i)}ai​vi​∗4pop_count(i)&#xff0c;bbb同理 ci∑j∣kiai∗bjc_i\sum_{j|ki}a_i*b_jci​∑j∣ki​ai​∗bj​&#xff0c;则ansi≡ci4pop_coun…

ASP.NET Core 3.0 项目开始“瘦身”

新的 ASP.NET Core 项目使用名为Microsoft.AspNetCore.App的综合包。该包也可以称为“ASP.NET Core 共享框架”&#xff0c;其背后的基本思想是&#xff0c;包括一个典型的应用程序所需要的所有东西。但是&#xff0c;如果看看该包的依赖项&#xff0c;对“需要”的定义看起来相…

CF1415D:XOR-gun(异或)

这就是CF 解析 这题真的是… …很妙 qwq 考虑到&#xff0c;如果相邻的连续三个二进制最高位相同&#xff0c;那么把后两个异或一下就可以打成目标 而如果不存在连续打三个二进制最高位相同的数&#xff0c;由于ai≤109a_i\leq10^9ai​≤109&#xff0c;所以n必然不超过60 前…

CF1369F-BareLee【博弈论,SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/CF1369F 题目大意 TTT次游戏&#xff0c;每次给出一个sss和ttt&#xff0c;两个人轮流操作&#xff0c;可以让ss1ss1ss1或者ss2ss\times 2ss2&#xff0c;如果s>ts>ts>t的话那个人就输了。 每次输的人将作为下一次的…

D - Maximum Value Problem FZU - 2037

D - Maximum Value Problem FZU - 2037 题意&#xff1b; 这个序列[1&#xff0c;3&#xff0c;2&#xff0c;4]&#xff0c;maxx0.如果将maxx赋值为最大值需要3次&#xff0c;第一次为maxx1&#xff0c;第二次maxx3&#xff0c;第三次maxx4 给你一个n&#xff0c;求n全排列的…

一个.NET Core开发者的Linux入门学习笔记

用.NET Core开发也有一段时间了&#xff0c;但是由于工作原因一直都是在Windows系统上进行的开发&#xff0c;一直想学习Linux然后把.NET Core开发的程序跑在Linux上&#xff0c;然后把心得体会记录一下发布再博客园&#xff0c;奈何拖延症泛滥&#xff0c;所以只写过一篇《Cen…

CF914G Sum the Fibonacci(FWT模板+子集卷积)

title 题目 solution (sa∣sb)&sc&(sd⊕se)2i,i∈Z;sa&sb0(s_a|s_b)\&s_c\&(s_d⊕s_e)2^i,i∈Z;s_a\&s_b0(sa​∣sb​)&sc​&(sd​⊕se​)2i,i∈Z;sa​&sb​0 令isa∣sb,jsc,dsd⊕seis_a|s_b,js_c,ds_d⊕s_eisa​∣sb​,jsc​,dsd​⊕se…

CF1415E New Game Plus(贪心)

解析 把题目标签写在数据范围上的一道题 由于k过大&#xff0c;显然无法dp 那就只能贪了 一开始被完全带跑偏了… 想的是把序列降序排列然后从后往前划分… 这个思路能很简单的写出nkdp 然后就卡住了… 算看了一半题解吧 看到第一段“考虑分成k组”后退出来了 有了这个线头后…

loj#6518-「雅礼集训 2018 Day11」序列【整体二分,dp,线段树】

正题 题目链接:https://loj.ac/p/6518 题目大意 一个长度为nnn的序列aaa&#xff0c;你可以花费111的代价让一个数111或者−1-1−1&#xff0c;给出mmm个限制形如第kkk个数要是区间[l,r][l,r][l,r]的最大/最小值。 求满足所有限制的最小代价 1≤n≤5000,1≤ai≤1051\leq n\l…

一二三系列之状压DP——Max Correct Set(一)Neko Rules the Catniverse (Large Version)(二)Make It Ascending(三)

文章目录一&#xff1a;CF1463F二&#xff1a;CF1152F2三&#xff1a;CF1342F一&#xff1a;CF1463F Max Correct Set 有一个结论&#xff1a;以xyxyxy为周期排列填充一定是不劣于最后的答案的 令pxy,rn%ppxy,rn\%ppxy,rn%p ⌊np⌋\lfloor\frac{n}{p}\rfloor⌊pn​⌋出现次数为…

C - Log Calculator FZU - 2036

C - Log Calculator FZU - 2036 题意&#xff1a; 已知a和b&#xff0c;满足alog2x&#xff0c;blog2y 求log2(xy) 题解&#xff1a; 因为alog2x&#xff0c;blog2y 所以x2a, yab log2(xy)log2(2a2b)log2(2b(12a-b))blog2(2a-b1) x>32时&#xff0c;blog2(2x1)xb 代码&…

实用帖 | 使用Visual Studio开发.NET Core推荐设置

Visual Studio 一直是.NET程序员的好伙伴&#xff0c;如今虽然.NET Core的开发可以用VSCode等其他环境&#xff0c;但VS依旧有强大的优势。今天来介绍下如何让VS用得更顺手的技能Here We Go!⛷基本配置首先要搞清楚的一点是&#xff0c;并不是所有版本的Visual Studio都支持.NE…

CF1654F-Minimal String Xoration【倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF1654F 题目大意 给出一个长度为2n2^n2n的字符串sss&#xff08;下标为0∼2n−10\sim 2^n-10∼2n−1&#xff09; 你要找到一个xxx满足tisixorxt_{i}s_{i\ xor\ x}ti​si xor x​&#xff0c;并且ttt的字典序最小。 1≤n≤…

P3642 [APIO2016]烟火表演(左偏树、函数)

解析 感觉是左偏树的神题了. 首先有一个比较显然的结论&#xff0c;一个合法的方案中&#xff0c;两个叶子到它们 lca\text{lca}lca 的距离必须相等. 考虑设计 dp\text{dp}dp &#xff1a; fi,xf_{i,x}fi,x​ 表示 iii 的子树中&#xff0c;所有叶子到它的距离为 xxx 的最小…

2011年全国大学生程序设计邀请赛(福州)

题号题目考点难度APassword table模拟签到BAxial symmetry计算几何代码题CLog Calculatorjava大数DMaximum Value Problem思维题EAnother Postman Problem思维题FPets二分图匹配模板题GTilingHChecker思维题角度很妙&#xff0c;值得多练练IThe Mad MathematicianJSocial Netwo…

概率与期望游戏地图

文章目录前言拾得宝典的玄灵大陆P2911P4316P6154P1297P6862参悟升级的三千界P1365P1850[CF]Crypto Lights打野刷野怪副本[AT-abc215G]Colorful Candies 2前言 其实从去年开始初次接触概率期望后&#xff0c;后面的考试几乎场场见到&#xff1b;而每次都只能敲最原始的暴力&…

.NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据

内容&#xff1a;本文带大家使用IdentityServer4进行对API授权保护的基本策略作者&#xff1a;zara(张子浩) 欢迎分享&#xff0c;但需在文章鲜明处留下原文地址。本文将要讲述如何使用IdentityServer4对API授权保护以及如何携带Token进行访问受保护的API&#xff0c;通过HttpC…

Loj#3077-「2019 集训队互测 Day 4」绝目编诗【结论,虚树,鸽笼原理】

正题 题目链接:https://loj.ac/p/3077 题目大意 给出nnn个点mmm条边的一张简单无向图&#xff0c;求是否存在两个长度相等的简单环。 1≤n≤104,1≤m≤1061\leq n\leq 10^4,1\leq m\leq 10^61≤n≤104,1≤m≤106 解题思路 先考虑一个暴力的做法&#xff0c;我们暴力搜索图上…

蒋金楠:200行代码7个对象《ASP.NET Core框架揭密》苏州.NET俱乐部课程分享

【课程名称】《ASP.NET Core框架揭密》【老师介绍】蒋金楠&#xff0c;同程艺龙机票事业部技术专家&#xff0c;微软最有价值专家&#xff08;MVP&#xff0c;连续12&#xff09;&#xff0c;多本.NET专著作者。博客园Artech&#xff0c;公众号“大内老A”。【课程简介】讲述AS…