当前位置: 首页 > news >正文

CF2227G (2000)树状数组+条件转化

原题链接

题目不再赘述

首先,我们要判断什么样的数组是好数组。好数组通过操作可以最后变为1个且每次操作将3个数缩为1个数,因此得出第一个条件好数组的长度一定是奇数。

再者,有一个需要记忆的二级结论:将ai替换成ai-1+ai+1-ai(>0)之后[i-1,i+1]的交替和没有改变,仍为ai-1-ai+ai+1.进一步会发现,经过无限次操作后如果只剩一个数,那个数的大小就等于原数组的交替和,所以好数组的条件是:1.区间长度为奇数 2.区间交替和>0

首先,我们定义p数组=a[1]-a[2]+a[3]-a[4]....之后对于区间[l,r]的区间,交替和=(-1)^l-1(p[r]-p[l-1]);

之后由于区间长度为奇数,l和r肯定同奇偶,l-1和r肯定不同奇偶。因此要枚举r或者l-1,且时间复杂度要小于n

此时我们想到了树状数组,那么我们要如何用树状数组实现实时查询比p[r]小或者大的l-1的个数呢?

我们可以想到,离散化p数组的值,然后每枚举一个r就按奇偶性让对应树状数组里面对应离散下标的位置++,而比p[r]小只需要去查询在对应树状数组中[1,id]的总个数即可(因为r+1往后的下标值还没加入树状数组当中)

因此代码如下

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ull unsigned long long
const int N=2e5+5;
struct BIT{int n;vector<int> c;void init(int x){n=x+1,c.clear();for(int i=0;i<=n;i++)c.push_back(0);}void add(int id){while(id<n)c[id]++,id+=id&-id;}int sum1(int r){int ans=0;while(r>0)ans+=c[r],r-=r&-r;return ans;}int sum(int l,int r){if(l>r)return 0;return sum1(r)-sum1(l-1);}
}tji,tou;void solve(){int n;cin>>n;vector<int> a(n+1),p(n+1,0);for(int i=1;i<=n;i++){cin>>a[i];if(i&1)p[i]=p[i-1]+a[i];else p[i]=p[i-1]-a[i];}vector<int> b=p;sort(b.begin(),b.end());b.erase(unique(b.begin(),b.end()),b.end());auto id=[&](int x){return lower_bound(b.begin(),b.end(),x)-b.begin()+1;};tji.init(b.size()),tou.init(b.size());tou.add(id(0));int ans=0;for(int i=1;i<=n;i++){int x=id(p[i]);if(i&1){ans+=tou.sum1(x-1);tji.add(x);}else{ans+=tji.sum(x+1,b.size());tou.add(x);}}cout<<ans<<'\n';}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int _=1;cin>>_;while(_--)solve();
}
/*
4
3
10 20 10
5
1 1 1 1 1
4
5 1 5 1
1
100*/

 

http://www.jsqmd.com/news/733932/

相关文章:

  • 如何使用edb-debugger:多架构调试的终极指南
  • 还在为B站视频下载烦恼?BBDown命令行神器让你轻松搞定离线收藏
  • OpenHTMLtoPDF常见问题解决方案:处理复杂布局和字体问题
  • 从科研到游戏:用MATLAB scatter3玩转三维粒子特效(含完整代码包)
  • 使用 Taotoken 为部署在 Ubuntu 上的开源项目提供可持续的大模型支持
  • 如何使用FairyGUI-unity打造视觉震撼UI:BlurFilter与ColorFilter实战指南
  • 如何实现Skaffold与Prometheus/Grafana的完美集成:监控Kubernetes开发全流程
  • Windows 11系统优化终极指南:3步实现51%性能提升的免费开源工具
  • 如何快速掌握MusicPlayer2:面向Windows用户的完整音乐播放器教程
  • cnn_captcha:基于TensorFlow的终极验证码识别解决方案
  • 如何确保witr诊断结果的准确性:完整测试与验证指南
  • Sunshine游戏串流服务器终极指南:如何打造你的个人游戏云平台
  • 如何在 Claude Code 中快速切换并调用不同的大模型 API
  • 终极抖音下载器指南:免费批量下载无水印视频的完整教程
  • 深度学习篇---ViT
  • 快速开始Websoft9:5分钟完成首次应用部署
  • Emscripten自动化终极指南:掌握Python脚本扩展工具链
  • 机器学习缺失值填补技术全解析与应用实践
  • Chrome文本替换插件终极指南:如何快速免费编辑任何网页内容
  • 终极指南:如何使用vagrant-vbguest命令模式手动更新VirtualBox Guest Additions
  • 0.1 ROCm rocr-libhsakmt实现深度剖析专栏介绍
  • 2025年构建大型单页应用的终极指南:为什么Angular是TypeScript开发者的首选框架
  • SiYuan快捷键效率对比测试:从新手到专家的终极进阶指南
  • 打造终极游戏串流服务器:Sunshine完整指南让普通玩家享受专业级跨设备游戏体验
  • Monero GUI与Monero Core集成:GUI与CLI钱包协同工作
  • ToastFish:如何利用Windows通知系统高效记忆5000+单词?
  • MCP 2026量子栈部署实战手册(含IBM Qiskit v1.4+、QuTiP 5.0+、Azure Quantum Runtime 2026-Alpha三套验证配置)
  • 终极指南:如何5分钟解锁中兴光猫工厂模式 - zteOnu工具完全解析
  • 终极GitUI安全应急响应指南:5个关键步骤快速处理终端Git安全事件
  • 深度学习篇---BERT