题目大意:输入包含 t ( 1 ≤ t ≤ 1e4 ) 组测试样例,每组样例先输入 m 大小的数组,构建一棵满二叉树。问是否可以通过交换根节点的子树让序列变成升序。

思路

我们在树的每个节点记录下区间的最小值 v 和 递归的方向 d 。规定向左递归为 0,向右为 1。

当序列本身就是一个升序序列时,每个节点的 d 都会是 0 ,也就是说如果你要询问每个点,一定是先找左子树再找右子树。

​​​​

那么 d==1 的地方一定是需要执行一次交换的点 ,加上 1 次即可,当L==R时,把当前值push 进一个数组里,代表排序后的顺序,最后再验证一遍顺序是否符合即可。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string>
#include <vector>
#include <string.h>
using namespace std;
int  t;
int n;
const int LL=3e5+5;
int arr[LL];
vector<int>vt;
struct node{int v,d;//最小值,方向
}w[LL<<2];void pushup(int u){w[u].v=min(w[u<<1].v,w[u<<1|1].v);if(w[u<<1].v<w[u<<1|1].v){w[u].d=0;}else w[u].d=1;
}void build(int u,int L,int R){if(L==R){w[u].v=arr[L];w[u].d=0;return;}int mid=L+R>>1;build(u<<1,L,mid);build(u<<1|1,mid+1,R);pushup(u);
}int query(int u,int L,int R){int res=0;res+=w[u].d;if(L==R){vt.push_back(w[u].v);//把当前值放进去,最后查看是否符合顺序return res;}int mid=L+R>>1;if(w[u].d==0){return res+=query(u<<1,L,mid)+query(u<<1|1,mid+1,R);}else{return res+=query(u<<1|1,mid+1,R)+query(u<<1,L,mid);}
}int main(){scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&arr[i]);}build(1,1,n);int flg=0;//等于1说明不可以,输出-1int ans=query(1,1,n);//交换的次数int lens=vt.size();for(int i=0;i<lens;i++){//查看是否符合顺序if(vt[i]!=i+1){flg=1;break;}}if(flg)printf("-1\n");else printf("%d\n",ans);vt.clear();}//system("pause");return 0;
}

这道题解法挺多的www

Codeforces Round #826 (Div. 3)(D. Masha and a Beautiful Tree)线段树解法相关推荐

  1. Codeforces Round #538 (Div. 2) F. Please, another Queries on Array? 线段树 + 欧拉函数

    传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,你需要实现两种操作: (1)(1)(1) 将[l,r][l,r][l,r]的aia_iai​都乘rrr. (2)(2)(2) 求ϕ(∏i= ...

  2. Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树

    传送门 文章目录 题意: 思路: 题意: 比如下面这个图: 思路: 对于这个题,比较容易就能考虑到dpdpdp,设f[i][j]f[i][j]f[i][j]为到了第iii行,覆盖了[j,j+k−1][ ...

  3. Codeforces Round #345 (Div. 1) D. Zip-line 上升子序列 离线 离散化 线段树

    D. Zip-line 题目连接: http://www.codeforces.com/contest/650/problem/D Description Vasya has decided to b ...

  4. Codeforces Round #439 (Div. 2) E. The Untended Antiquity 二维线段树||二维树状数组

    http://codeforces.com/contest/869/problem/E 题意:n*m的矩阵,q次操作,三种类型 类型1:给指定矩阵加上围栏 类型2:给指定矩阵去掉围栏 类型3:查询两点 ...

  5. Codeforces Round #370 (Div. 2)E. Memory and Casinos[期望概率+线段树区间合并]详细推导

    题目链接 题目大意:就说一个赌徒在nnn个赌场里面转,在每个赌场他有pip_ipi​的胜率,如果赢了就向右走,输了就向左走,如果到达000或者n+1n+1n+1号赌场就相当退出的了赌局.定义统治区间[ ...

  6. Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 E - Sorting Books 一排书架上有 nnn 本书排成一排,每本书上有一个颜色 aia_i ...

  7. Codeforces Round #197 (Div. 2): D. Xenia and Bit Operations(线段树)

    题意:定义一个长度2^n的序列{a1, a2-an},序列相邻两个元素或运算之后再进行异或运算再进行或运算(两种运算交替进行)直到只剩下一个数字,这个数字即为序列的值,输入第一行两个数n,m表示序列的 ...

  8. Codeforces Round #807 (Div. 2) E. Mark and Professor Koro 二进制/线段树

    题目分析 模拟题目不难发现,实际上擦除操作就是在模拟二进制加法进位.那么可以得到原题意的转述: 将每个 a [ i ] a[i] a[i]看作 2 a [ i ] 2^{a[i]} 2a[i],维护整 ...

  9. Codeforces Round #826 (Div. 3)(A~D)

    更好的阅读体验 \color{red}{更好的阅读体验} 更好的阅读体验 文章目录 A. Compare T-Shirt Sizes B. Funny Permutation C. Minimize ...

  10. Codeforces Round #826 (Div. 3)(A~F)

    A. Compare T-Shirt Sizes 给出衣服尺码,判断两个尺码的大小关系. 思路:模拟. AC Code: #include <bits/stdc++.h>typedef l ...

最新文章

  1. 艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~
  2. [.NET Core].NET Core R2安装及示例教程
  3. 关于argc和argv的输出
  4. 《Python Cookbook 3rd》笔记(5.12):测试文件是否存在
  5. java通过POI技术将html转成word
  6. php 远程下载大文件,php下载远程文件(支持断点续传,支持超大文件)
  7. fianl属性 java_java基础-类的高级属性(包、final、内部类)
  8. 一位Oracle顶流铁粉的“躬身入局”
  9. java获取mysql时间格式化_Java与mysql的时间格式化问题,获取时间的上下午
  10. Android 系统(224)---如何不显示开机SIM卡欢迎语
  11. adodb.recordset.open方法的参数
  12. iOS-Senior19-FMDB第三方应用
  13. Java 实现打印文件详解(附demo)
  14. python能做什么工作好-python可以做什么工作
  15. 君正 X1000 音频驱动架构
  16. android logo在线生成工具,在线生成logo
  17. 高速公路联网收费二义性路径识别系统原理及开发
  18. 爆破密码-hydra
  19. 概率统计Python计算:自定义离散型分布
  20. WEB前端开发工程师面试题

热门文章

  1. 电路邱关源学习笔记——2.4电阻的Y形连接和▲形连接的等效变换
  2. FIR滤波器工作原理及实现过程介绍
  3. 生产制造追溯系统-通过微信小程序实现移动端报表平台
  4. 【C语言|RUNOOB教程】100道经典例题详解(1~5题)
  5. 雷尼绍测头TP200使用注意事项
  6. linux查看当前文化大小,Linux锐速当前连接数等状态查询
  7. easypoi教程_easypoi导出Excel
  8. python微信群管理开禁言_怎么设置群管理员-微信群最需要的,是禁言功能
  9. 快速应用开发模型(Rapid Application Development,RAD) 构件+快速
  10. 2017黑加传智java_传智黑马 Java在职加薪课 学成在线