【算法每日一练]-结构优化(保姆级教程 篇5 树状数组)POJ3067日本 #POJ3321苹果树 #POJ2352星星

本文主要是介绍【算法每日一练]-结构优化(保姆级教程 篇5 树状数组)POJ3067日本 #POJ3321苹果树 #POJ2352星星,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

今天知识点

求交点转化求逆序对,每次操作都维护一个y点的前缀和

树的变动转化成一维数组的变动,利用时间戳将节点转化成区间

先将y排序,然后每加入一个就点更新求一次前缀和

POJ3067:日本

思路:

POJ3321苹果树:

思路:

POJ2352:星星

思路:


        

        

POJ3067:日本

东海岸有n个城市,西海岸有m个城市,每个海岸的城市从北到南编号为1,2……,每条高速公路都是直线,连接东西海岸的城市。求公路的交叉点数

输入:
1
3 4 4
1 4
2 3
3 2
3 1

        
思路:

根据样例画出草图:按照1 4,2 3,3 1,3 2的顺序去画,很容易发现只要出现逆序对就会产生交点。

定义逆序对:(x1,y1)和(x2,y2)为逆序对,则等价于x1<x2且y1<y2。

所以在画2 3时候产生了一个逆序对,画3 1时候产生了2个逆序对,画 3 2时候也产生了两个逆序对。故最终5个交点。

所以这道题就是求逆序对数。

因为比如两边都同时大于或小于。我们先对x排序(若x相等,则y升序),然后按x的顺序检查每条边,统计y的前缀和,因为当前已经连了i条边,那么y的前缀和数就一定是非逆序对数。所以i减去y的前缀和就是逆序对数。

这道题就变成了每次增加一个元素就前一次对应的前缀和问题。因此我们只需要对每个点y维护一个关于y的前缀。每次操作后都要给对应点y加个1
        

#include <bits/stdc++.h>
using namespace std;
#define maxn 1010
#define maxk 1000010
#define lowbit(x) (x)&(-x)
typedef long long ll;
int c[maxn],kas,n,m,k;
struct edge{int x,y;}e[maxk];bool cmp(edge a,edge b){return a.x<b.x||(a.x==b.x&&a.y<b.y);
}void add(int i){//加1操作,参数省略while(i<=m){++c[i];i+=lowbit(i);}
}int sum(int i){int s=0;while(i>0){s+=c[i];i-=lowbit(i);}return s;
}int main(){int t;cin>>t;while(t--){memset(c,0,sizeof(c));//每个样例都要清空一次树状数组。scanf("%d%d%d",&n,&m,&k);for(int i=0;i<k;i++)scanf("%d%d",&e[i].x,&e[i].y);sort(e,e+k,cmp);//默认升序ll ans=0;for(int i=0;i<k;i++){ans+=i-sum(e[i].y);//累加逆序对add(e[i].y);//加入进去}printf("Test case %d: %lld\n",++kas,ans);}
}

        

        

POJ3321苹果树:

        
一个苹果树上有n个叉,通过分支连接,我们将叉从1到n进行编号,每个叉上最多只会有一个苹果,且苹果树上一开始长满了苹果。
卡卡可能会从树上摘一个苹果,树上的空叉可能又会长出新的苹果。
输入:
第一行n表示叉数。
以下n-1行是两个整数u和v表示之间有叉相连
以下m行表示m条消息
C x表示叉x上的苹果变化了:有过原来有则现在没有,原来没有则现在有了
Q x表示叉x上方子树中的苹果数量,包括x叉上的苹果(如果存在的话)
3
1 2
1 3
3
Q 1
C 2
Q 1

        
思路:

                

我们先把树倒过来,既然要统计每个节点的变动,每变动一次就统计一次不现实。

那就把树所有节点按照dfs顺序映射成一维数组a,再利用时间戳就把求节点孩子问题变成了求时间戳的区间和问题

                
既要统计a的区间和又要考虑到节点的变动,那就创建树状数组c来维护a。节点的变动恰好对应了点更新。

红色代表L,蓝色代表R, 可见每个点的时间戳,不难看出每个节点的R-L就是这个节点的孩子数量

#include <bits/stdc++.h>
#define lowbit(x) (x)&(-x)//求区间长度
using namespace std;
const int maxn=1e5+10;
int n,q;
int c[maxn],a[maxn];
int L[maxn],R[maxn];
int head[maxn];
int cnt,dfn;
struct edge{int u,v,next;}e[2*maxn];void adde(int u,int v){e[++cnt]={u,v,head[u]};head[u]=cnt;}int sum(int i){//求前缀和,int ans=0;for(;i>0;i-=lowbit(i)) ans+=c[i];return ans;
}void add(int i,int val){//在第i点上加val,修改找后继for(;i<=n;i+=lowbit(i)) c[i]+=val;
}void init(){memset(c,0,sizeof(c));memset(L,0,sizeof(L));memset(R,0,sizeof(R));memset(head,0,sizeof(head));cnt=0;dfn=0;//因为深度优先的序列是从1开始的for(int i=1;i<=n;i++)a[i]=1,add(i,1);//a[i]是1表示该分支i上有苹果
}void dfs(int u,int fa){//之所以写fa,是防止走父子边,这样子的话vis就不再需要了L[u]=++dfn;//相当于是时间戳,根节点是1for(int i=head[u];i;i=e[i].next){int v=e[i].v;if(v==fa)continue;dfs(v,u);}R[u]=dfn;//记录时间戳
}int main(){cin>>n;int u,v;init();for(int i=1;i<n;i++){scanf("%d%d",&u,&v);adde(u,v);}	dfs(1,1);cin>>q;char op[10];//之所以定义字符串,就是因为字符型于回车不兼容,所以换成字符串输入不怕回车for(int i=1;i<=q;i++){getchar();scanf("%s %d",op,&v);//不用考虑回车问题if(op[0]=='C'){if(a[L[v]]) add(L[v],-1);else add(L[v],1);a[L[v]]^=1;//0变1,1变0}else{int s1=sum(R[v]);int s2=sum(L[v]-1);printf("%d\n",s1-s2);}}
}

        

        

POJ2352:星星

在平面上有n个星星,每颗星星都有自己的坐标。规定星星的等级数为纵横坐标均不超过自己的星星数量(不包括自己),请输出每个级别的星星数量
输入保证y是递增的,且如果y相等,那么x是递增的。
5
1 1
5 1
7 1
3 3
5 5

        
思路:

看似是二维前缀和,实际上y是排好顺序的,那也就是说只需要按y的顺序计算每个x的前缀和即可。相当于加入一个x就统计一下x的前缀和。
        

#include<bits/stdc++.h>
using namespace std;
#define maxn 32005
#define lowbit(x) (x)&(-x)
int ans[maxn],c[maxn];
int n;void add(int i,int val){while(i<=maxn){c[i]+=val;i+=lowbit(i);}	
}int sum(int i){//统计前缀和int s=0;while(i>0){s+=c[i];i-=lowbit(i);}return s;
}
int main(){cin>>n;int x,y;for(int i=0;i<n;i++){scanf("%d%d",&x,&y);x++;//注意给的坐标x是从0开始的,树状数组的下标必须从0开始,所以都加1ans[sum(x)]++;add(x,1);//x的数量加1}for(int i=0;i<n;i++){//一共最多n-1个等级printf("%d\n",ans[i]);}
}

这篇关于【算法每日一练]-结构优化(保姆级教程 篇5 树状数组)POJ3067日本 #POJ3321苹果树 #POJ2352星星的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/476011

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖