【xsy1061】排列 树状数组
题目大意:给你一个$1$到$n$的排列,问是否存在一对数$a,b(1≤a,b≤n,a≠b)$满足$a+b$为偶数且$(a+b)/2$在$a$和$b$之间。
数据范围:$n≤3\times 10^{5}$。
$xfz$智商$=-1$系列题目
考虑到此题并没有问你存在多少对,而是是否存在,所以不要往统计有多少对上想!
我们考虑已经加入了前i个数,当前加入的数为x,下面我们需要判断是否存在有一对$a$,$b$满足$a+b=2x$的情况
令$m=min(n-x,x-1)$,显然满足a+b=2x的$(a,b)$的对数至多为$m$对
我们令$s1$表示前$i$个数,数值在区间$[x+1,x+m]$中的个数,$s2$表示前i个数,数值在$[x-m,x-1]$中的个数。
不难发现,若$s1<s2$,则$x$左侧必然有一个数,可以在右侧找到一个数与它匹配。
$s1>s2$的情况类似。
所以就可以用树状数组来统计了。
时间复杂度:$O(n\log\ n)$。
1 #include<bits/stdc++.h> 2 #define M 300005 3 #define lowbit(x) ((x)&(-x)) 4 using namespace std; 5 int a[M]={0},n; 6 void add(int x,int k){for(int i=x;i<=n;i+=lowbit(i)) a[i]+=k;} 7 int sum(int x){int k=0; for(int i=x;i>0;i-=lowbit(i)) k+=a[i]; return k;} 8 int main(){ 9 int cas; cin>>cas; 10 while(cas--){ 11 scanf("%d",&n); memset(a,0,sizeof(a)); 12 int ok=0; for(int i=1;i<=n;i++){ 13 int x; scanf("%d",&x); 14 if(ok) continue; 15 add(x,1); 16 int m=min(n-x,x-1); 17 int h1=sum(x-1)-sum(x-m-1); 18 int h2=sum(x+m)-sum(x); 19 if(h1!=h2) ok=1; 20 } 21 if(ok) printf("YES\n"); 22 else printf("NO\n"); 23 } 24 }
转载于:https://www.cnblogs.com/xiefengze1/p/10526184.html
【xsy1061】排列 树状数组相关推荐
- Tyler and Strings(树状数组/排列组合/dp)
题目 题意:给定两个数组s,ts,ts,t,现重排列数组sss,使得数组sss小于ttt.问有多少种排列方式. 参考 代码源自cwxzh #include<bits/stdc++.h> u ...
- Equalizing Two Strings 冒泡排序or树状数组
首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...
- Codeforces数学1600----day1[同余定理,树状数组+两次二分,,组合计数]
1.C. Kuroni and Impossible Calculation **知识点:同余定理 ** #include <iostream> #include <cstdio&g ...
- poj2352(树状数组)
题目链接:https://vjudge.net/problem/POJ-2352 题意:在直角坐标系中给出n个点的 (x,y),(0<=x,y<=32000),定义每个点的level为(x ...
- 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)
链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...
- 2016 Multi-University Training Contest 4 Bubble Sort(树状数组模板)
Bubble Sort 题意: 给你一个1~n的排列,问冒泡排序过程中,数字i(1<=i<=n)所到达的最左位置与最右位置的差值的绝对值是多少 题解: 数字i多能到达的最左位置为min(s ...
- 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...
- [算法学习] 线段树,树状数组,数堆,笛卡尔树
都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...
- hdu1394 Minimum Inversion Number 线段树和树状数组
题意: 输入一个长度 n 第二行给出长度为n的数组,数组的值刚好为0到n-1这n个数. 然后每次把数组的第一个数放到最后一个,放n-1次,共有n个排列,这n个排列就有n个逆序数,输出这n个逆序数的最小 ...
- hdu 1394(树状数组求逆序数)
解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...
最新文章
- 带有Python示例的math.sin()方法
- idea序列化自动生成_serialVersionUID在数据序列化中重要性
- 信息学奥赛一本通(2026:【例4.12】阶乘和)
- 中国晶体谐振器行业市场供需与战略研究报告
- 亚马逊被爆内部员工卖数据改差评,中国区尤为严重!
- Coursera机器学习课后作业Matlab代码(1~9周)
- python支付宝二维码支付源代码
- Castaways钓鱼还能参与么,数据来告诉你答案
- 雷达的工作原理示意图_雷达的工作原理是什么?
- linux 打开终端自动运行脚本.barshrc
- 使用U盘在VMware虚拟机安装Ubuntu(Linux)系统
- 『tensorflow笔记』图变量tf.Variable的用法解析
- localhost:8080打不开原因解决方法
- 电商运营太烦恼?不如试试RPA机器人流程自动化养号
- Failing Recovery Loader
- 一个程序员的正版清单
- iOS 音视频之网络视频播放AVPlayerViewController(iOS8.0+使用)
- Dundas绘制趋势线
- 复习总结并手写常用数据结构--数组
- java/php/net/python游艇俱乐部管理系统设计