数据结构
小青WA
扣扣1916493526
展开
-
hdu6230 2017CCPC 哈尔滨A Palindrome
题意 给你一个1e5的字符串,让你求出子串的数量,使得子串满足: 长度为3n−23n−2,且[1,2n−1][1,2n−1]和[n,3n−2][n,3n−2]都是回文串。 思路 这两个回文串长度都是奇数manachar求出每个位置的最长回文半径 那么假设两个回文中心为ij那么需满足 i + r[i] ≥ j &&j −r[j] ≤ i用树状数组离线求答案 G[i - r[i]].push_back(i);//G[这个位置开始的].push_back(覆盖到哪里); ...原创 2020-10-29 22:13:47 · 126 阅读 · 0 评论 -
hdu6547 2019CCPC女生专场 树链剖分+势能线段树
题意:给出一棵树op = 0求u到v链上的和 op = 1将u到v链上所有元素开根向下取整 树链剖分模板 +势能线段树(势能线段树大佬博客) #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int MaxN = 1e5 + 5; typede...原创 2020-10-13 20:33:47 · 164 阅读 · 1 评论 -
POJ1990 MooFest
题意 n只cow 给出每只的坐标及他们的耳背值 两头牛想要对话的分贝必须>= max(耳背值) * 距离 现在问你所有牛凉凉交谈产生的分贝值最小是多少 思路 建两棵树状数组 y——记录坐标和 cnt——记录牛的数量 以耳背值升序排列 这样对于每一头牛来讲都会和比它耳背值小的牛匹配一次加入答案 保证任意两头牛之间的交谈采取较大的耳背值。 每次通过cnt 和 y计算 当前牛的前半部分...原创 2019-12-11 13:33:31 · 99 阅读 · 0 评论 -
POJ3416 二维坐标轴下离线树状数组
题意 t组 n和m n个硬币的坐标+m个假定中心原点的坐标 求每个中心坐标对应的一三象限和二四象限上硬币数量的差 保证坐标轴上无硬币 思路 对硬币和中心点分别以x轴从小到大sort 建立两棵树状数组 分别表示当前点的左半边 和 右半边 的点的纵坐标 显然,初始所有点的纵坐标记录到 右半边R[]。 按照x坐标从左到右枚举中心点的横坐标 同时修改这一段的点的纵坐标在两个树状数组...原创 2019-12-10 17:36:47 · 99 阅读 · 0 评论 -
POJ2182 线段树维护区间可用值
题意 给你n 下面n - 1个数表示从第2个到第n个——第i个cow前面有多少只编号比它小的cows 问你这n只cows的排列。 思路 线段树维护区间可以用的编号有几个。 从后先前枚举 ans[i]是每次前面有a[i]个可用的答案 找到这一位的答案后 删除已经使用的编号更新线段树 Accode #include<cstdio> #include<iostream...原创 2019-12-10 13:35:02 · 105 阅读 · 0 评论 -
codeforces703D 树状数组离线处理区间不相同元素的异或和
题意 对于n个数字,m次询问,l~r的区间中所有出现偶数次数的xor 思路 区间xor和可以通过前缀和求得:sum[] 根据xor的性质,这个sum[]即为区间中出现次数为奇数的xor和 如果我们想要出现次数为偶数的所有书的异或和,只需对上面求得sum[] * [这一段中每个出现的different数字的xor],不难看出,这就实现了奇数次xor和偶数次xor之间的转化。 现在,我们...原创 2019-11-21 00:23:41 · 187 阅读 · 0 评论 -
双端队列deque
#include<cstdio> #include<iostream> #include<algorithm> #include<deque> using namespace std; deque<char> S,d; int main() { d.push_back('o'); d.push_back('n'); d.pu...原创 2019-10-08 15:57:58 · 92 阅读 · 0 评论 -
codeforces 1234Distinct Characters Queries[线段树解法]
题意: 给你一个字符串下面你的操作 op = 1,将pos位的字母换成x op = 2,问你l~r之间有多少个不同的字符串 解法: 26个字母用int类型二进制0 1表示每个字母是否出现 或运算表示两个区间加和 然后只要想到这个思路就是单点修改区间查询模板题 AC代码: #include<cstdio> #include<iostream> #includ...原创 2019-10-04 15:23:07 · 165 阅读 · 0 评论 -
HDU6638 2019多校第六场 Snowy Smile (坐标离散化+线段树枚举维护区间最大子段和)
题意 T组,给n,下面n行 给出个n个点的横纵坐标和这一点的价值(有正有负),点数最多2000,坐标范围(-1e9~1e9)问你在图中框出一个矩形(包括边界)得到的最大价值是多少,输出MaxValue。 思路 因为坐标范围给出-1e9~1e9,对所有点的纵坐标离散化,再将所有点按照横坐标从小到大排序,离散化后枚举n个点,每次遇到下一个不同的x坐标时(所选矩形左边界修改),重新build线段树...原创 2019-08-09 16:17:40 · 189 阅读 · 2 评论 -
字典树
每个点都独一无二欧~~ pre——前缀 void build(){ int root = 0;//首字母不存在的话从头开始存啊 for(int i = 0;i < len ;i++){ int cur = s[i] - 'a'; if(!trie[root][cur]) trie[root][cur] = ++cnt; //从root节点到cur这条边如果不存在的话 建...原创 2019-08-05 19:11:11 · 170 阅读 · 0 评论 -
RMQ模板
RMQ 初始化 max_cow[i][0] = min_cow[i][0] = a[i]; void rmq(int n){ for(int j = 1;(1 << j) <= n; j++){ for(int i = 1;i + (1 << j) - 1 <= n; i++){ max_cow[i][j] = max(max_cow[i...原创 2019-07-22 09:56:17 · 121 阅读 · 0 评论 -
线段树初学_HDU1166
大佬详解:look here 前情提要qaq: 结构体里面存下l——左边界,r——右边界,w——数值,f——懒标记 建树: void build(int k,int ll,int rr){ tree[k].l = ll; tree[k].r = rr; if(tree[k].l == tree[k].r){//到最下面子节点读入 scanf("%d...转载 2019-04-29 10:00:04 · 258 阅读 · 2 评论 -
康菜菜的树状数组板子
首先呢,这个可爱的数据结构大概是长介个样儿哒 咳咳先放一个讲的贼好的连接look here(下图是转的哇 额 看这张图(蕴含神奇的二进制 上面那个连接讲的贼好我就不赘述了qaq 来整理下板子 lowbit魔法 int lowbit(int x){ return x & (-x); } 单点修改 int add(int pos,int ad){ fo...原创 2019-04-28 10:48:00 · 219 阅读 · 0 评论