2019 HL SC day4
自闭场本来 以为 顶多一些不太会 结果发现 一堆不太会 。
树状数组 感觉 好久没看 了有点遗忘 不过还好 现在我来了。莅临之神将会消灭一切知识点哦。
今天说点不一样东西 树状数组 hh 很有用的东西 现在想想常数可谓是非常的小的吧 因为 查询的时候log 基本上市跑不满的 况且增加的时候log 也很少跑满。
先说构造 构造是最体现水平的东西------lrj 我特别信服这句话 关键不是会用这个东西而是把更深层次的东西挖掘出来,显然的是 发明这个东西比会使用这个东西 来的更难。
构造 树状数组一般采用下标来存储 当然 也是有权值树状数组 那个是后话了。原理 话 我必须得提一下 因为曾经我有一个鬼畜的想法也是正确。
如今 只能靠我自己填坑了 。 一个数字 按照自己的编号lowbit 上去 然后 从一个位置 lowbit 减过去为什么是正确的呢?这点 我想是有必要证明。
因为 考虑 lowbit 上去 你做的一些事情 首先来说不断地二进制位往上进然后 为什么倒着可以累加上去呢 我们感性思考一下(大不了 丢坑
可以证明每个数字我们被我们至多累加一次 且不会漏掉任何一个数字 只要能证明出来这个那么树状数组的原理就是正确的。
首先对于我们最大的二进制位 一个数字下标如果不超过这个二进制位那么 它一定在 我们减剩下 最大的二进制位的时候 被我们累加一次然后结束 累加一次且没漏掉一切这种类型的数字。
然后是对于一个数字的下表没有超过了这个二进制位且大小不超过我们查询下标的大小 那么 此时 显然有这个数字下标不断逐位扩大 扩大至我们当前这个数字二进制位的某一位。也就是这个数字二进制位表示是我们查询的二进制数的子集 这样显然我们询问那个数字在减的同时 一定能到达其子集 如果证明其不会重复呢 这个还是要分两种情况讨论 一个是我们刚好达到累加这个数字起点之时 那么显然一个减一个加 不会再有交集。考虑我们遇到的不是起点而是中间时刻某个点 接下来会不会继续遇到这个问题 仔细思考我们发现中间时刻某点 一定满足x>x1 那么此时我们减去lowbit x这一位 这也同时意味着不可能再有x1这个二进制位了 如果有那么lowbit 的将会是它 但是考虑lowbit的是它下次是否会lowbit x 这位 这显然也是不可能完成累加的因为在上一步想要累加上去必然存在两个数字想等然后一个+一个- 自然不可能出现交集。
证毕。
你是否听说过逆序树状数组的存在 讲操作颠倒的那种 加值得时候向下累加 统计的时候向上统计。这个操作有兴趣 的话可以去研究一下 非常的流弊正序求逆序对。
例题:
bzoj 1878 求区间本质不同的数的个数。离线处理 维护右端点单调递增 然后遇到一个数字当前位置数字 贡献+1 上一次出现这个数字贡献-1 满足贪心的原理 故这个做法是正确的。
//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 10000000000000000ll
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
#define EPS 1e-8
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const int MAXN=,maxn=,MAX=;
int n,m;
int c[maxn],a[maxn],ans[MAXN];
int pre[maxn],last[MAX];
struct wy
{
int l,r;
int id;
int friend operator <(const wy a,const wy b){return a.r<b.r;}
}t[MAXN];
inline void add(int x,int y)
{
while(x<=n)
{
c[x]+=y;
x+=x&(-x);
}
}
inline int ask(int x)
{
int cnt=;
while(x)
{
cnt+=c[x];
x-=x&(-x);
}
return cnt;
}
int main()
{
//freopen("1.in","r",stdin);
n=read();
for(int i=;i<=n;++i)
{
a[i]=read();
pre[i]=last[a[i]];
last[a[i]]=i;
}
m=read();
for(int i=;i<=m;++i)
{
int x,y;
x=read();y=read();
t[i]=(wy){x,y,i};
}
int flag=;
sort(t+,t++m);
for(int i=;i<=n;++i)
{
add(i,);
if(pre[i])add(pre[i],-);
while(t[flag].r==i)
{
ans[t[flag].id]=ask(t[flag].r)-ask(t[flag].l-);
++flag;
}
}
for(int i=;i<=m;++i)printf("%d\n",ans[i]);
return ;
}
然后其他的应用学长讲的很鬼畜 回来再说。
线段树:主要学习了一下标记永久化 因为下传标记 会是一件很麻烦的事情 所以考虑标记不下传等到访问的时候获得标记的价值即可。
bzoj 4636 蒟蒻数列
//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
#define EPS 1e-8
#define l(p) t[p].l
#define r(p) t[p].r
#define mx(p) t[p].mx
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const int MAXN=;
int n,root,cnt;
struct wy
{
int l,r;
int mx;
}t[MAXN*];
inline void modify(int &p,int l,int r,int L,int R,int z)
{
if(!p)p=++cnt;
if(L<=l&&R>=r){mx(p)=max(mx(p),z);return;}
int mid=(l+r)>>;
if(L<=mid)modify(l(p),l,mid,L,R,z);
if(R>mid)modify(r(p),mid+,r,L,R,z);
}
inline ll ask(int p,int l,int r,int x)
{
if(!p)return ;
int mid=(l+r)>>;
ll sum=;
mx(p)=max(mx(p),x);
if(!l(p))sum+=(ll)mx(p)*(mid-l+);
if(!r(p))sum+=(ll)mx(p)*(r-mid);
sum+=ask(l(p),l,mid,mx(p));
sum+=ask(r(p),mid+,r,mx(p));
return sum;
}
signed main()
{
//freopen("1.in","r",stdin);
n=read();
for(int i=;i<=n;++i)
{
int a,b,k;
a=read();b=read()-;k=read();
if(a>b)continue;
modify(root,,INF,a,b,k);
}
printf("%lld\n",ask(root,,INF,));
return ;
}
其实不需要标记永久化应该也是可以写的不过比较繁琐,支持标记永久化就是支持未来。。
2019 HL SC day4的更多相关文章
- 2019 HL SC day1
今天讲的是图论大体上分为:有向图的强连通分量,有向图的完全图:竞赛图,无向图的的割点,割边,点双联通分量,变双联通分量以及圆方树 2-sat问题 支配树等等. 大体上都知道是些什么东西 但是仍需要写一 ...
- 2019 HL SC day10
10天都过去了 4天都在全程懵逼.. 怎么可以这么难啊 我服了 现在想起依稀只记得一些结论 什么 反演? 什么后缀自动机?什么组合数的应用?什么神仙东西 ,不过讲课人的确都是神仙.(实名羡慕. mzx ...
- 2019 HL SC day2
今天讲的是网络流 大部分题目都写过了 这里 就总结一番. bzoj 1066 裸的最大流 不过需要拆点细节方面有一点坑 剩下的 没什么了. //#include<bits/stdc++.h> ...
- N(C)O(S)I(P)P 2019 退役记
N(C)O(S)I(P)P 2019 退役记 day-4 今天下午老师突然咕了,于是一下午欢乐时光 今天上午考试T3线段树维护个区间加,区间乘 一遍过编译,一遍过样例(第一次,俺比较弱(虽然也发现和暴 ...
- Solr分组查询
项目中需要实时的返回一下统计的东西,因此就要进行分组,在获取一些东西,代码拿不出来,因此分享一篇,还是很使用的. facet搜索 /** * * 搜索功能优化-关键词搜索 * 搜索范围:商品名称.店 ...
- Light of future-冲刺集合
table th:nth-of-type(1) { width: 85px; } table th:nth-of-type(2){ width: 80px; } table th:nth-of-typ ...
- Light of future-冲刺总结
目录 1.凡事预则立.测试博客的链接 2.包含冲刺日志集合随笔的所有内容 3.描述项目预期计划 7.代码仓库地址.测试文档链接地址.PPT链接地址 归属班级 →2019秋福大软件工程实践Z班 作业要求 ...
- 线性基求交(2019牛客国庆集训派对day4)
题意:https://ac.nowcoder.com/acm/contest/1109/C 问你有几个x满足A,B集合都能XOR出x. 思路: 就是线性基求交后,有几个基就是2^几次方. #defin ...
- 2019中山纪念中学夏令营-Day4[JZOJ]
Begin (题目的排序方式:难易程度) 什么是对拍: 对拍是一种在写完程序后,验证自己程序是不是正解的比较方便的方法. 实现过程: 对同一道题,再打一个暴力程序,然后用一些大数据等跑暴力程序来进行验 ...
随机推荐
- SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束
SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束 其实这里知识不难,只是好久不接触突然被问的话有时还真的一时答不上,自己写一遍胜过盲扫.当然,也有些常读常新的地方会 ...
- 状压DP之Bill的挑战
题目 P2167 [SDOI2009]Bill的挑战 Sheng bill不仅有惊人的心算能力,还可以轻松地完成各种统计.在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng bill极度 ...
- Xenon's Attack on the Gangs,题解
题目: 题意: 有一个n个节点的树,边权为0-n-2,定义mex(a,b)表示除了ab路径上的自然数以外的最小的自然数,求如何分配边权使得所有的mex(a,b)之和最大. 分析: 看似有点乱,我们先不 ...
- CMDB03 /今日未采集的资产、资产入库、资产变更记录、资产采集
CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 目录 CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 1. 获取今日未采集的服务器 2. server资产入库以 ...
- 作为程序员居然没用过这款神器?太out了吧。
背景 工欲善其事,必先利其器.后面我将陆陆续续推荐一些软件利器帮助大家提高效率(主要针对 Mac 电脑). 如果你在使用 Mac 电脑,并且没有如某些人那样安装并使用 Windows 系统,那么你可 ...
- TCP 和 UDP,哪个更胜一筹
作为 TCP/IP 中两个最具有代表性的传输层协议,TCP 和 UDP 经常被拿出来相互比较.这些协议具体有什么区别,又是什么作用呢? 在 IT 圈混迹多年的小伙伴们,对 TCP 和 UDP 肯定再熟 ...
- Go Pentester - HTTP CLIENTS(3)
Interacting with Metasploit Early-stage Preparation: Setting up your environment - start the Metaspl ...
- CocosCreator之分层管理的ListView
前言 进入公众号回复listview即可获得demo的git地址. 之前写的一篇文章<Creator之ScrollView那些事>中提到了官方Demo中提供的ListViewCtl,只是实 ...
- 最小生成树的java实现
文章目录 一.概念 二.算法 2.1 Prim算法 2.2 Kruskal算法 笔记来源:中国大学MOOC王道考研 一.概念 连通图:图中任意两点都是连通的,那么图被称作连通图 生成树:连通图包含全部 ...
- 题解 洛谷 P5163 【WD与地图】
首先将操作倒序,把删边转化为加边.先考虑若边是无向边,条件为连通,要怎么处理. 可以用并查集来维护连通性,对每个连通块维护一颗权值线段树,连通块的合并用线段树合并来实现,线段树同时也支持了修改点权. ...