数据结构合集

线段树:

1、【codevs1690】开关灯

这道题是一道线段树裸题,可以开个标记记录当前节点被修改的次数,然后仿照区间修改区间查询来做就行了。

代码:

uses math;
type hh=record
  l,r,x,sum:longint;
end;
var a:array[0..400010]of hh;
  n,m,i,x,l,r:longint;
function calc(now:longint):longint;
begin
  exit(a[now].r-a[now].l+1);
end;
procedure build(now,l,r:longint);
begin
  a[now].l:=l; a[now].r:=r; a[now].x:=0; a[now].sum:=0;
  if l<>r then begin
    build(now<<1,l,(l+r)>>1); build(now<<1 or 1,(l+r)>>1+1,r);
  end;
end;
procedure change(now,l,r:longint);
begin
  if(l<=a[now].l)and(a[now].r<=r)then begin
    a[now].x:=a[now].x xor 1; a[now].sum:=calc(now)-a[now].sum;
  end
  else begin
    if l<a[now<<1 or 1].l then change(now<<1,l,r);
    if a[now<<1].r<r then change(now<<1 or 1,l,r);
    a[now].sum:=a[now<<1].sum+a[now<<1 or 1].sum;
    if a[now].x=1 then a[now].sum:=calc(now)-a[now].sum;
  end;
end;
function query(now,l,r:longint):longint;
var ret:longint;
begin
  if(l=a[now].l)and(a[now].r=r)then exit(a[now].sum)
  else begin
    ret:=0;
    if l<a[now<<1 or 1].l then ret:=ret+query(now<<1,l,min(r,a[now<<1].r));
    if a[now<<1].r<r then ret:=ret+query(now<<1 or 1,max(l,a[now<<1 or 1].l),r);
    if a[now].x=0 then exit(ret)
    else exit(r-l+1-ret);
  end;
end;
begin
  read(n,m);
  build(1,1,n);
  for i:=1 to m do begin
    read(x,l,r);
    if x=0 then change(1,l,r)
    else writeln(query(1,l,r));
  end;
end.

(虽然是一道裸题,但我还是WA了好几天)

2、【codevs1299】切水果

这道题是典型的区间set+区间查询,不过因为是全区间查询,所以可以直接输出根节点的sum(Hqy神犇这道写了一个25行线段树,%%%)

代码:

type tree=record
  l,r,sum:longint;
  en:boolean;
end;
var a:array[0..2000100]of tree;
  n,m,i,l,r:longint;
procedure build(now,l,r:longint);
begin
  a[now].l:=l; a[now].r:=r; a[now].sum:=r-l+1; a[now].en:=false;
  if l<>r then begin
    build(now<<1,l,(l+r)>>1); build(now<<1 or 1,(l+r)>>1+1,r);
  end;
end;
procedure cut(now,l,r:longint);
begin
  if a[now].en then exit;
  if(l<=a[now].l)and(a[now].r<=r)then begin
    a[now].en:=true; a[now].sum:=0; exit;
  end;
  if l<a[now<<1 or 1].l then cut(now<<1,l,r);
  if a[now<<1].r<r then cut(now<<1 or 1,l,r);
  a[now].sum:=a[now<<1].sum+a[now<<1 or 1].sum;
  if(a[now<<1].en)and(a[now<<1 or 1].en)then a[now].en:=true;
end;
begin
  read(n,m);
  build(1,1,n);
  for i:=1 to m do begin
    read(l,r);
    cut(1,l,r);
    writeln(a[1].sum);
  end;
end.

==========================分割线================================

树状数组:

1、【codevs1228】苹果树

这道题乍一看以为是树剖,蓝鹅我不会……

于是看了看题解,看到了一种神奇的思路:

因为是单点修改+子树查询,所以我们就能利用树的dfs的序的性质:一颗子树的所有节点一定会在dfs序中挤在一坨。

所以我们就能求出dfs序,记录每个节点在dfs序中的位置和以它为根的子树所代表的区间,然后就能愉快地单点修改+区间查询了。

代码:

var a,ne:array[0..200010]of longint;
  h,x,y,q,c,cou:array[0..100010]of longint;
  b:array[0..100010]of boolean;
  n,m,i,k,u,v,num:longint;
  ch:char;
procedure add(x,y:longint);
begin
  inc(m); a[m]:=y; ne[m]:=h[x]; h[x]:=m;
end;
procedure dfs(now:longint);
var i:longint;
begin
  inc(m); q[now]:=m; x[now]:=m; b[now]:=false;
  i:=h[now];
  while i>0 do begin
    if b[a[i]] then dfs(a[i]);
    i:=ne[i];
  end;
  y[now]:=m;
end;
function lowbit(x:longint):longint;
begin
  exit(x and -x);
end;
procedure change(x,num:longint);
begin
  while x<=n do begin
    c[x]:=c[x]+num;
    x:=x+lowbit(x);
  end;
end;
function sum(x:longint):longint;
begin
  sum:=0;
  while x>0 do begin
    sum:=sum+c[x];
    x:=x-lowbit(x);
  end;
end;
begin
  read(n); m:=0;
  fillchar(h,sizeof(h),255);
  for i:=1 to n-1 do begin
    read(u,v);
    add(u,v); add(v,u);
  end;
  fillchar(b,sizeof(b),true);
  m:=0;
  dfs(1);
  fillchar(c,sizeof(c),0);
  for i:=1 to n do begin
    cou[i]:=1; change(i,1);
  end;
  readln(m);
  for i:=1 to m do begin
    readln(ch,k);
    if ch=‘Q‘ then writeln(sum(y[k])-sum(x[k]-1))
    else begin
      cou[q[k]]:=-cou[q[k]];
      change(q[k],cou[q[k]]);
    end;
  end;
end.

时间: 2024-10-17 04:56:41

数据结构合集的相关文章

前端资源教程合集

综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 En类资源汇总 免费的编程中文书籍索引 前端书籍 前端免费书籍大全 前端知识体系 免费的编程中文书籍索引 智能社 - 精通JavaScript开发 重新介绍 JavaScript(JS 教程) 麻省理工学院公开课:计算机科学及编程导论 JavaScript中的this陷阱的最全收集--没有之一 JS函数式编程指南 JavaScript Promise迷你书

树和二叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版

习题集解析部分 第6章 树和二叉树 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       相关测试数据下载  链接? 数据包       本习题文档的存放目录:数据结构\▼配套习题解析\▼06 树和二叉树  

Python之路【第二十四篇】:Python学习路径及练手项目合集

Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Python技术路径中包含入门知识.Python基础.Web框架.基础项目.网络编程.数据与计算.综合项目七个模块.路径中的教程将带你逐步深入,学会如何使用 Python 实现一个博客,桌面词典,微信机器人或网络安全软件等.完成本路径的基础及项目练习,将具备独立的Python开发能力. 完整的Python学

数组和广义表-第5章-《数据结构题集》答案解析-严蔚敏吴伟民版

习题集解析部分 第5章 数组和广义表 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       本习题文档的存放目录:数据结构\▼配套习题解析\▼05 数组和广义表       文档中源码的存放目录:数据结构\▼配

Python渗透测试工具合集

Python渗透测试工具合集 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, 本文会列举其中部分精华. 网络 Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包.可用作交互式包处理程序或单独作为一个库. pypcap, Pcapy, pylibpcap: 几个不同 libpcap 捆绑的python库 libdnet: 低级网络路由,包括端口查看和以太网帧的转发 dpkt: 快速,轻量数据包创建和分析,面向基本的

图-第7章-《数据结构题集》习题解析-严蔚敏吴伟民版

习题集解析部分 第7章 图 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       相关测试数据下载  链接? 数据包       本习题文档的存放目录:数据结构\▼配套习题解析\▼07 图       文档中源

串-第4章-《数据结构题集》答案解析-严蔚敏吴伟民版

习题集解析部分 第4章 串 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       本习题文档的存放目录:数据结构\▼配套习题解析\▼04 串       文档中源码的存放目录:数据结构\▼配套习题解析\▼04

绪论-第1章-《数据结构题集》习题解析-严蔚敏吴伟民版

习题集解析部分 第1章  绪论 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑          本习题文档的存放目录:数据结构\▼配套习题解析\▼01 绪论\        文档中源码的存放目录:数据结构\▼配套习

图像拼接 SIFT资料合集

图像拼接SIFT资料合集 转自 http://blog.csdn.net/stellar0/article/details/8741780 分类: 最近也注意一些图像拼接方面的文章,很多很多,尤其是全景图拼接的,实际上类似佳能相机附加的软件,好多具备全景图拼接,多幅图像自动软件实现拼接,构成(合成)一幅全景图像(风景).Sift算法,我略知一二,无法仔细描述(刚也贴了2个最近的资料).      当就尺度空间(scale space),我想,其在计算机视觉(Computer Vision)\图像