题解:B3646 数列前缀和 3】的更多相关文章

2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2312  Solved: 1330[Submit][Status][Discuss] Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? Input 第一行为两个整数n,k. Ou…
文章目录 题意 思路 特殊情况k=0 Source Code 1 Source Code 2 题意 给定一个数组和一个整数k,返回是否存在一个长度至少为2的连续子数组的和为k的倍数. 思路 和上一篇博客的思路基本一致. LeetCode subarray-sum-equals-k题解 所不同的是,子数组至少长度为2.因此需要一个缓冲区,延缓往Hash表中加数的操作. 另外,因为是和变成是k的倍数.利用同余的知识易得我们维护的前缀和是群ZkZ_kZk​中的和. ps.这里我犯了一个错误,没有考虑k…
分块 若块内最大值为0或1,则不用再开方 然后暴力修改 可以证明,如果开方后向下取整,则最多开方4次一个数就会变成0或1 #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; ],a[],maxb[],sum[]; void calbe(int n){ ;i<=n;i++) belong[i]=(i-)/sz+; }…
分块维护一个区间和 然后记得更新的时候左边角块的tag不要打错到右边角块 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; ],a[],sum[],tag[]; void calbe(int n){ ;i<=n;i++) belong[i]=(i-)/sz+; } void reset(int x){ sum[x…
用set维护有序序列 或许sort也可以,但这题的前驱定义是严格小于 所以要去重 然后就是记得自己打的加法tag在query的时候一定要算上 话说这题数据有点fake啊忘了查询算上自己的标记了还有70 然后还有玄学优化 块的大小从\( \sqrt x \)变成1000每个点能快300ms的样子qwq 似乎原理是减少维护的set的个数吧 #include <cstdio> #include <algorithm> #include <cstring> #include &…
查询小于k的值 注意lower_bound一定要减去查找的起始位置得到正确的位置 调了快两天 淦 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; ],b[],belong[],tag[],num,sz,n; void calbe(int n){ ;i<=n;i++){ belong[i]=(i-)/sz+; }…
分块裸题 然后就是记得左右边界处理和分块的初始化 忘了初始化会被卡成暴力 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; ],belong[],lm[],rm[],num,sz,tag[],n; inline int qread(void){ ; ; char s; s=getchar(); ')&&…
前言:世间还有这么卡常的题…… ------------------ 题目链接 题目大意:给定长度为$n$的序列${a_i}$.有$m$次询问,问$[l,r]$内出现正偶数次的数字有多少个. 这题跟蒲公英有些相似,不同的是这题特别卡常…… 设$sum[i][j]$表示前$i$块内$j$出现的次数,$ans[i][j]$表示块$i$到$j$的答案. 主要的问题是怎么在$O(n \sqrt n)$内进行预处理.我们采用“边扫边求”的方式来进行处理,扫的时候开一个桶,注意不要重复统计.对于$ans[i…
http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842/article/details/46417301 (不是论文题,但是还是借鉴了题解,我是真的菜) 首先我们分成的三个区间肯定是一个前缀+中间一段+一个后缀. 那么我们先求前缀,方法很简单,只需要将原数列倒着存,然后找字典序最小的后缀即可.可以用后缀数组实现. (因为原数列前缀的颠倒肯定是原数列颠倒…
CSP2019题解 格雷码 按照生成的规则模拟一下即可. 代码 括号树 看到括号匹配首先想到用栈,然后又在树上就可以想到可追溯化栈. 令\(a_i=1\)表示\(i\)号节点上的括号为(,否则为), 记栈为\(stk\),其中元素个数为\(top\). 设\(f_i\)表示加上节点\(i\)所对应的括号所增加的贡献,\(g_i\)表示这个点的答案,转移很显然: \[ \begin{aligned} \begin{cases} f_i=0&(a_{fa_i}=1)\\ f_i=f_{fa_i}&am…