The 19th Zhejiang Provincial Collegiate Programming Contest F - Easy Fix(主席树)

2023-10-27

F - Easy Fix
发现交换 l,r不会影响 1到l-1和r+1到 n
对l+1,r-1的影响只有正负一(用主席树计算一下改变的量,一共四种情况)
对l和r再算一下

//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=8e18;
const int maxn=2e5+100;
int a[maxn],c[maxn],p[maxn],b[maxn],d[maxn],pre[maxn];
int lowbit(int x)
{
	return x&(-x);
}
void update(int x,int val)
{
	while(x<maxn)
	{
		c[x]+=val;
		x+=lowbit(x);
	}
}
int ask(int x)
{
	int ans=0;
	while(x>0)
	{
		ans+=c[x];
		x-=lowbit(x);
	}
	return ans;
}
struct node
{
	int l,r;
	int sum;
	int op[5];
} t[maxn*32];
int cnt,root[maxn];
void update(int l,int r,int &x,int y,int num,vector<int>v)
{
	x=++cnt;
	t[x]=t[y];
	t[x].sum++;
	for(auto it:v) t[x].op[it]++;
	//t[x].op[type]++;
	if(l==r)return ;
	int mid=(l+r)>>1;
	if(num<=mid) update(l,mid,t[x].l,t[y].l,num,v);
	else update(mid+1,r,t[x].r,t[y].r,num,v);
}

int query(int l,int r,int x,int y,int num,int type)//查询<= num [type]的个数
{
	if(r<=num)return t[y].op[type]-t[x].op[type];
	int mid=(l+r)>>1;
	int ans=0;
	if(num>=l) ans+=query(l,mid,t[x].l,t[y].l,num,type);
	if(num>mid) ans+=query(mid+1,r,t[x].r,t[y].r,num,type);
	return ans;
}
int query(int l,int r,int x,int y,int num)//查询<= num的个数
{
	if(r<=num)return t[y].sum-t[x].sum;
	int mid=(l+r)>>1;
	int ans=0;
	if(num>=l) ans+=query(l,mid,t[x].l,t[y].l,num);
	if(num>mid) ans+=query(mid+1,r,t[x].r,t[y].r,num);
	return ans;
}
signed main()
{
	IOS
	int n,q;
	cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>p[i];
	}
	//cout<<"A:";
	for(int i=1; i<=n; i++)
	{
		a[i]=ask(p[i]);
		update(p[i],1);
		//cout<<a[i]<<" ";
	}
	//cout<<"\n";
	//cout<<"B:";
	for(int i=1; i<=n; i++) update(p[i],-1);
	for(int i=n; i>=1; i--)
	{
		b[i]=ask(p[i]);
		update(p[i],1);
		d[i]=min(a[i],b[i]);
	}
	for(int i=1; i<=n; i++)
	{
		//cout<<b[i]<<" ";
		pre[i]=pre[i-1]+d[i];
	}
	//cout<<"\n";
	for(int i=1; i<=n; i++)
	{
		vector<int>v;
		if(a[i]<=b[i]) v.pb(1);
		if(a[i]-1>b[i]) v.pb(2);
		if(a[i]>=b[i]) v.pb(3);
		if(a[i]<b[i]-1) v.pb(4);
		update(1,(int)1e6,root[i],root[i-1],p[i],v);
	}
	cin>>q;
	while(q--)
	{
		int l,r;
		cin>>l>>r;
		if(l>r) swap(l,r);
		if(l==r)
		{
			cout<<pre[n]<<"\n";
			continue;
		}
		int ans=pre[n]-d[l]-d[r];
		if(p[l]<p[r])
		{
			int s2=query(1,1e6,root[l],root[r-1],p[r],2)-query(1,1e6,root[l],root[r-1],p[l],2);
			int s1=query(1,1e6,root[l],root[r-1],p[r],1)-query(1,1e6,root[l],root[r-1],p[l],1);
			ans+=s2-s1;
		}
		else
		{
			int s4=query(1,1e6,root[l],root[r-1],p[l],4)-query(1,1e6,root[l],root[r-1],p[r],4);
			int s3=query(1,1e6,root[l],root[r-1],p[l],3)-query(1,1e6,root[l],root[r-1],p[r],3);
			ans+=s4-s3;
		}
		int low_l=query(1,1e6,root[l],root[r],p[l]);
		int low_r=query(1,1e6,root[l-1],root[r-1],p[r]);
		ans+=min(a[l]+low_l,b[l]-low_l);
		ans+=min(a[r]-low_r,b[r]+low_r);
		cout<<ans<<"\n";
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

The 19th Zhejiang Provincial Collegiate Programming Contest F - Easy Fix(主席树) 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy

随机推荐

  • 一位程序员生了 3 个孩子......

    程序猿要了3个孩子 分别取名叫Ctrl Alt 和Delete 如果他们不听话 程序猿就只要同时敲他们一下就会好的 假如你是喜欢看程序员的趣闻 假如你有程序员的沙雕图无人分享 假如你是被编程耽误的段子手 欢迎扫描下方二维码给程序人生投稿 每
  • 网络协议号大全

    1 ICMP Internet Control Message RFC792 2 IGMP Internet Group Management RFC1112 3 GGP Gateway to Gateway RFC823 4 IP IP
  • Docker入门——实战图像分类

    一 背景 思考 在一个项目的部署阶段 往往需要部署到云服务器或者是终端设备上 而环境的搭建往往是最费时间和精力的 特别是需要保证运行环境一致性 有什么办法可以批量部署相同环境呢 Docker本质 打包环境 将本机的环境和代码一同打包在doc
  • Jenkins设置默用户为root

    最近在需要在jenkins执行shell脚本 由于Jenkins之前是默认在线安装的 这样jenkins设置了默认用户jenkins权限 如果要执行root用户命令 则报权限错误 image png 所以要更换jenkins为root用户
  • 线程池与数据库连接池

    自己感觉线程池与数据库连接池是另个相似的概念 于是简单写一下自己的思考巩固复习 线程池 1 线程池的作用 在java中 如果每个请求到达就创建一个新线程 开销是相当大的 在实际使用中 服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当
  • 《C++ Primer Plus》学习笔记——第5章 循环和文本输入

    1 概述 C 中支持三种循环 for循环 while循环和do while循环 2 for循环 for循环遍历字符串输出 int main using namespace std string str cin gt gt str for i
  • QVector、QList、QLinkedList 类 用法区别

    QVector Qlist QlinkedList 类 用法比较 1 QVector 是提供动态数组的一个模板类 QList 是提供列表的一个模板类 QLinkedList 是提供链表的一个模板类 2 QVector
  • 剪辑必备神器,视频片段搜索工具!

    随着社交媒体和视频分享平台的不断发展 视频制作正在变得越来越普及和流行 随之而来的是 视频剪辑也变得越来越重要 在制作一个完整的视频时 大部分时间都是花费在剪辑和编辑上 然而 在海量的视频片段中寻找想要的素材是一项非常繁琐的任务 因此 针对
  • 贪心算法——n行m列的正整数矩阵中,每行选一个数使得总共n个数的和最大。

    6 1 n行m列的正整数矩阵中 每行选一个数使得总共n个数的和最大 采用贪心算法 include using namespace std int a 100 100 int n m int main cin gt gt n gt gt m
  • 基于 RT-Thread 的 RoboMaster 电控框架(三)

    基于 RT Thread 的 RoboMaster 电控框架 三 由于 RT Thread 稳定高效的内核 丰富的文档教程 积极活跃的社区氛围 以及设备驱动框架 Kconfig Scons 日志系统 海量的软件包 很难不选择 RT Thre
  • 开发一个飞书机器人

    开发一个飞书机器人需要以下步骤 首先 您需要确定机器人的功能和目标 飞书机器人是用来做什么的 它是用来传送物品 送快递还是其他用途 确定了这些之后 就可以开始设计机器人的外观和功能 其次 您需要选择适合的机器人平台 机器人平台包括机器人的硬
  • 时序约束理论与实践

    前言 基础概念整理 更多内容参考文后的链接 1 input delay input delay定义 由下图可以看出Input Delay是以上游芯片的时钟发送沿为参考 上游的输出数据到达FPGA的外部输入端口之间的延迟 输入延迟 input
  • Python文本数据分析:新闻分类任务(贝叶斯,TF-IDF词向量)

    文章目录 基本思路 1 文本分析 11 查看数据 1 2转换为llist格式 1 3使用jieba分词 1 4转换为DataFrame格式 1 5使用停用词 1 6查看词频 1 7生成词云 2 TF IDF关键词提取 2 1 提取关键词 3
  • 如何使希尔排序具有稳定性

    稳定上指排序前相等的数据的位置关系在排序后不发生变化 直接插入排序是稳定的 希尔排序是特殊的插入排序 但因为交换值的过程中有跳跃式的交换 所以不稳定 如下图红6和蓝6在排序后发生了变化 6个数的序列 dk先取3来看 所以说希尔排序是不稳定的
  • windows下charles 抓取 https包(以iphone为例)

    Aphorism 光看不练是退步 nginx https 证书生成和代理配置看之前博文 https blog csdn net palmer kai article details 83990341 主要分为两步 step1 charles
  • Unity3D进行项目build时的“Data folder not found”问题

    或许是因为在项目文件夹中放入了一些外部 dll文件 将这些外部 dll文件删除后重新build即可成功运行 Ps 我的项目中并没有用到这些 dll文件 只是当时加进来做测试用途 所以删除并没有造成其他影响
  • formItem

    目录结构 1 CRForm
  • 前端自学苦于找不到资源,2021最全学习资源整合!

    前端学习路线图火热出炉啦 还在为如何系统学习苦苦寻觅资源么 2021年新版前端学习路线图这不就来了么 小伙计们甩开膀子学起来吧 只要能坚持学下来走上人生巅峰不再是梦 PS 别忘了收藏呦 此套路线图不定期更新呦 第一阶段 前端入门HTML5
  • 【实用技能】git代理设置

    最近运行git pull和push的时候 发现有时候会不能运行 问了广宇后才知道原来Git是要专门设置代理才能正常用的 否则即使开了clash git用的也是境内网 代理设置方式如下 git config global http proxy
  • The 19th Zhejiang Provincial Collegiate Programming Contest F - Easy Fix(主席树)

    F Easy Fix 发现交换 l r不会影响 1到l 1和r 1到 n 对l 1 r 1的影响只有正负一 用主席树计算一下改变的量 一共四种情况 对l和r再算一下 pragma GCC optimize 2 pragma GCC opti