qq[2100];inlineboolcmp(sb a,sb b){returna.num<b.num;}inlineintread(){intx=0;intf=1;charc=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(
tips : 二分答案时所使用的left和right虽然没有超过int,但left+right超过了int范围,所以要开long long 点此查看代码 #include<bits/stdc++.h>#include<bits/extc++.h>// using namespace __gnu_pbds;// using namespace __gnu_cxx;usingnamespacestd;#defineinfile(x) freopen(x,"r",stdin)#defineoutfil...
LuoguP5356 [Ynoi2017] 由乃打扑克 Description 题目链接:P5356 一个长为 n 的序列 a,需要支持 m 次操作,操作有两种: 查询区间 [l,r] 的第k 小值。 区间[l,r] 加上k。 1≤n,m≤105,−2×104≤ 每次加上的数和原序列的数 ≤2×104。 Solution 查询第 k 小,直接想到两种方法: 二分枚举然后...
【题解】由乃打扑克 由乃打扑克 \(\text{Solution:}\) 题目就是区间加,求区间第\(k\)小。这里没有用时间分治的做法。 考虑每次修改的时候,如果遇到散块就暴力重构,整块打标记。 询问的时候直接二分答案,整块里面用lower_bound,对于散块: 如果我们暴力做,复杂度是错误的,这样是根号外面带了两个\(\log.\)...
洛谷P5356 [Ynoi2017] 由乃打扑克 题目 https://www.luogu.com.cn/problem/P5356 思路 由乃题,那么考虑分块(大雾,但确实分块是正解)。 题面很清晰,就是求动态的区间第k小,支持区间加法操作。 根据套路,需要维护一个原数组a,每个块的加法标记add,还有对原数组进行块内排序的结果c。
P5356 [Ynoi2017] 由乃打扑克 题解 纪念一下人生第一道 Ynoi 题目链接题意是个人都看得懂吧。。。solution看到Ynoi,想到什么?分块 卡常你猜对了,这题又是分块。在数列分块入门 2中我们已经学会了询问区间内小于某个值 xx 的元素个数。很容易想到...
luogu P5356 [Ynoi2017] 由乃打扑克 题面传送门真 块长的艺术。 这种东西显然树类型维护不了,我们考虑分块。 根据套路我们维护每个块的有序数列记为BB,然后每次修改归并,每次查询先二分然后零散块暴力查整块二分即可。 设块长为SS,修改复杂度O(S+nS)O(S+nS),查询复杂度O(logn(S+nSlogS))O(logn(S+nS...
分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是 O(√n)O(n) 的 查询的话,如果只有散块直接归并出结果,否则二分答案,加上小块合并成的整块,相当于是整体二分,就是 O(√nlogai)O(nlogai) 的 理论上块长取 √nlognnlogn 实际上直接取根号更快...
预处理复杂度n√nnn,每次询问复杂度是O(√n+3000064)O(n+3000064) 另一道由乃打扑克也是同样的做法,最后询问的时候,16位可以一起处理,预处理0-65535里面每个数低位连续的1的数量,中间的1在不同幂次下的贡献和高位连续的1的数量。 雪辉 View Code 由乃打扑克 View Code...