Codeforces Round #826 (Div. 3)(D. Masha and a Beautiful Tree)线段树解法
题目大意:输入包含 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)线段树解法相关推荐
- 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= ...
- 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][ ...
- 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 ...
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity 二维线段树||二维树状数组
http://codeforces.com/contest/869/problem/E 题意:n*m的矩阵,q次操作,三种类型 类型1:给指定矩阵加上围栏 类型2:给指定矩阵去掉围栏 类型3:查询两点 ...
- Codeforces Round #370 (Div. 2)E. Memory and Casinos[期望概率+线段树区间合并]详细推导
题目链接 题目大意:就说一个赌徒在nnn个赌场里面转,在每个赌场他有pip_ipi的胜率,如果赢了就向右走,输了就向左走,如果到达000或者n+1n+1n+1号赌场就相当退出的了赌局.定义统治区间[ ...
- Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 E - Sorting Books 一排书架上有 nnn 本书排成一排,每本书上有一个颜色 aia_i ...
- Codeforces Round #197 (Div. 2): D. Xenia and Bit Operations(线段树)
题意:定义一个长度2^n的序列{a1, a2-an},序列相邻两个元素或运算之后再进行异或运算再进行或运算(两种运算交替进行)直到只剩下一个数字,这个数字即为序列的值,输入第一行两个数n,m表示序列的 ...
- Codeforces Round #807 (Div. 2) E. Mark and Professor Koro 二进制/线段树
题目分析 模拟题目不难发现,实际上擦除操作就是在模拟二进制加法进位.那么可以得到原题意的转述: 将每个 a [ i ] a[i] a[i]看作 2 a [ i ] 2^{a[i]} 2a[i],维护整 ...
- Codeforces Round #826 (Div. 3)(A~D)
更好的阅读体验 \color{red}{更好的阅读体验} 更好的阅读体验 文章目录 A. Compare T-Shirt Sizes B. Funny Permutation C. Minimize ...
- Codeforces Round #826 (Div. 3)(A~F)
A. Compare T-Shirt Sizes 给出衣服尺码,判断两个尺码的大小关系. 思路:模拟. AC Code: #include <bits/stdc++.h>typedef l ...
最新文章
- 艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~
- [.NET Core].NET Core R2安装及示例教程
- 关于argc和argv的输出
- 《Python Cookbook 3rd》笔记(5.12):测试文件是否存在
- java通过POI技术将html转成word
- php 远程下载大文件,php下载远程文件(支持断点续传,支持超大文件)
- fianl属性 java_java基础-类的高级属性(包、final、内部类)
- 一位Oracle顶流铁粉的“躬身入局”
- java获取mysql时间格式化_Java与mysql的时间格式化问题,获取时间的上下午
- Android 系统(224)---如何不显示开机SIM卡欢迎语
- adodb.recordset.open方法的参数
- iOS-Senior19-FMDB第三方应用
- Java 实现打印文件详解(附demo)
- python能做什么工作好-python可以做什么工作
- 君正 X1000 音频驱动架构
- android logo在线生成工具,在线生成logo
- 高速公路联网收费二义性路径识别系统原理及开发
- 爆破密码-hydra
- 概率统计Python计算:自定义离散型分布
- WEB前端开发工程师面试题
热门文章
- 电路邱关源学习笔记——2.4电阻的Y形连接和▲形连接的等效变换
- FIR滤波器工作原理及实现过程介绍
- 生产制造追溯系统-通过微信小程序实现移动端报表平台
- 【C语言|RUNOOB教程】100道经典例题详解(1~5题)
- 雷尼绍测头TP200使用注意事项
- linux查看当前文化大小,Linux锐速当前连接数等状态查询
- easypoi教程_easypoi导出Excel
- python微信群管理开禁言_怎么设置群管理员-微信群最需要的,是禁言功能
- 快速应用开发模型(Rapid Application Development,RAD) 构件+快速
- 2017黑加传智java_传智黑马 Java在职加薪课 学成在线