题目大意:给你一个$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】排列 树状数组相关推荐

  1. Tyler and Strings(树状数组/排列组合/dp)

    题目 题意:给定两个数组s,ts,ts,t,现重排列数组sss,使得数组sss小于ttt.问有多少种排列方式. 参考 代码源自cwxzh #include<bits/stdc++.h> u ...

  2. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

  3. Codeforces数学1600----day1[同余定理,树状数组+两次二分,,组合计数]

    1.C. Kuroni and Impossible Calculation **知识点:同余定理 ** #include <iostream> #include <cstdio&g ...

  4. poj2352(树状数组)

    题目链接:https://vjudge.net/problem/POJ-2352 题意:在直角坐标系中给出n个点的 (x,y),(0<=x,y<=32000),定义每个点的level为(x ...

  5. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  6. 2016 Multi-University Training Contest 4 Bubble Sort(树状数组模板)

    Bubble Sort 题意: 给你一个1~n的排列,问冒泡排序过程中,数字i(1<=i<=n)所到达的最左位置与最右位置的差值的绝对值是多少 题解: 数字i多能到达的最左位置为min(s ...

  7. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set

    题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...

  8. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

  9. hdu1394 Minimum Inversion Number 线段树和树状数组

    题意: 输入一个长度 n 第二行给出长度为n的数组,数组的值刚好为0到n-1这n个数. 然后每次把数组的第一个数放到最后一个,放n-1次,共有n个排列,这n个排列就有n个逆序数,输出这n个逆序数的最小 ...

  10. hdu 1394(树状数组求逆序数)

    解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...

最新文章

  1. 带有Python示例的math.sin()方法
  2. idea序列化自动生成_serialVersionUID在数据序列化中重要性
  3. 信息学奥赛一本通(2026:【例4.12】阶乘和)
  4. 中国晶体谐振器行业市场供需与战略研究报告
  5. 亚马逊被爆内部员工卖数据改差评,中国区尤为严重!
  6. Coursera机器学习课后作业Matlab代码(1~9周)
  7. python支付宝二维码支付源代码
  8. Castaways钓鱼还能参与么,数据来告诉你答案
  9. 雷达的工作原理示意图_雷达的工作原理是什么?
  10. linux 打开终端自动运行脚本.barshrc
  11. 使用U盘在VMware虚拟机安装Ubuntu(Linux)系统
  12. 『tensorflow笔记』图变量tf.Variable的用法解析
  13. localhost:8080打不开原因解决方法
  14. 电商运营太烦恼?不如试试RPA机器人流程自动化养号
  15. Failing Recovery Loader
  16. 一个程序员的正版清单
  17. iOS 音视频之网络视频播放AVPlayerViewController(iOS8.0+使用)
  18. Dundas绘制趋势线
  19. 复习总结并手写常用数据结构--数组
  20. java/php/net/python游艇俱乐部管理系统设计

热门文章

  1. SDRAM-高手进阶,终极内存技术指南----学习笔记
  2. VR全景制作教程|VR全景拍摄和制作竟如此简单
  3. 服务器 无线键鼠,几台电脑一套键鼠 不光省钱还方便
  4. qq企业邮箱怎么删除邮件服务器,腾讯企业邮箱删除邮件方法
  5. JAVA 实现《萝卜勇者》游戏
  6. 广义矩方法(GMM)与动态面板数据简述
  7. SSL证书以及其验证过程
  8. Pygame 入门基本指南
  9. svn 命令行使用总结
  10. [转]设计工作6年感触随笔