当前位置: 首页 > 编程日记 > 正文

CF 1093 E. Intersection of Permutations

E. Intersection of Permutations

链接

题意:

给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数。

分析:

首先求出一个数组,c[i],第二个排列的这个数字在第一个排列中出现的位置。那么查询就是询问c数组中的[l2,r2]中的有多少个数字的在[l1,r1]之间。此时可以差分+离线+树状数组在$nlogn$的时间复杂度内完成。

考虑修改操作,考虑cdq分治。在b排列中交换两个数,那么也就是c数组中交换这两个数,可以拆成一个加入和删除的操作。然后cdq分治,时间复杂度$nlog^2n$。

这道题也有树套树,分块的作法。

代码:

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<cmath>
  6 #include<cctype>
  7 #include<set>
  8 #include<queue>
  9 #include<vector>
 10 #include<map>
 11 using namespace std;
 12 typedef long long LL;
 13 
 14 inline int read() {
 15     int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
 16     for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
 17 }
 18 
 19 const int N = 200005;
 20 
 21 struct Node{
 22     int flag, l, r, pos, id, v;
 23 }A[N * 7], B[N * 7];
 24 int pos[N], a[N], b[N], ans[N];
 25 
 26 
 27 struct BIT{
 28     int sum[N], n;
 29     void update(int p,int v) {
 30         for (; p <= n; p += (p & (-p))) sum[p] += v;
 31     }
 32     int query(int p) {
 33         int ans = 0;
 34         for (; p; p -= (p & (-p))) ans += sum[p];
 35         return ans;
 36     }
 37     int Ask(int l,int r) {
 38         return query(r) - query(l - 1);
 39     }
 40 }bit;
 41 
 42 void cdq(int l,int r) {
 43     if (l >= r) return ;
 44     int mid = (l + r) >> 1;
 45     cdq(l, mid); 
 46     cdq(mid + 1, r);
 47     
 48     int i = l, j = mid + 1, k = l;
 49     while (i <= mid && j <= r) {
 50         if (A[i].pos <= A[j].pos) {
 51             if (A[i].flag != 2) bit.update(A[i].v, A[i].flag);
 52             B[k ++] = A[i ++];
 53         }
 54         else {
 55             if (A[j].flag == 2) ans[A[j].id] += bit.Ask(A[j].l, A[j].r) * A[j].v;
 56             B[k ++] = A[j ++];
 57         }
 58     }
 59     while (j <= r) {
 60         if (A[j].flag == 2) ans[A[j].id] += bit.Ask(A[j].l, A[j].r) * A[j].v;
 61         B[k ++] = A[j ++];
 62     }
 63     for (int t = l; t < i; ++t) if (A[t].flag != 2) bit.update(A[t].v, -A[t].flag);
 64     while (i <= mid) B[k ++] = A[i ++];
 65     for (int t = l; t <= r; ++t) A[t] = B[t];    
 66 }
 67 
 68 int main() {
 69     int n = read(), m = read(); bit.n = n;
 70     for (int i = 1; i <= n; ++i) {
 71         a[i] = read();
 72         pos[a[i]] = i;
 73     }
 74     for (int i = 1; i <= n; ++i) {
 75         b[i] = read();
 76     }
 77     int cnt = 0, tot = 0;
 78     for (int i = 1; i <= n; ++i) {
 79         A[++cnt] = (Node){1, 0, 0, i, 0, pos[b[i]]};
 80     }
 81     for (int i = 1; i <= m; ++i) {
 82         int opt = read();
 83         if (opt == 1) {
 84             int l1 = read(), r1 = read(), l2 = read(), r2 = read();
 85             ++tot;
 86             ++cnt; A[cnt] = (Node){2, l1, r1, l2 - 1, tot, -1};
 87             ++cnt; A[cnt] = (Node){2, l1, r1, r2, tot, 1};
 88         }
 89         else {
 90             int x = read(), y = read();
 91             ++cnt; A[cnt] = (Node){-1, 0, 0, x, 0, pos[b[x]]};
 92             ++cnt; A[cnt] = (Node){-1, 0, 0, y, 0, pos[b[y]]};
 93             swap(b[x], b[y]);
 94             ++cnt; A[cnt] = (Node){1, 0, 0, x, 0, pos[b[x]]};
 95             ++cnt; A[cnt] = (Node){1, 0, 0, y, 0, pos[b[y]]};
 96         }
 97     }
 98     cdq(1, cnt);
 99     for (int i = 1; i <= tot; ++i) printf("%d\n", ans[i]);
100     return 0;
101 }

转载于:https://www.cnblogs.com/mjtcn/p/10194738.html

相关文章:

s-seq 生成序列化数字

前言 seq命令用于产生从某个数到另外一个数之间的所有整数。 命令格式 seq [OPTION]... LAST seq [OPTION]... FIRST LAST seq [OPTION]... FIRST INCREMENT LAST 支持将指定范围的数字打印出来&#xff0c;按照指定的递增规律 -f, --format格式 使用printf 样式的浮点格式…

linux c++ 目录操作,C++文件及文件夹操作整理(代码示例)

一 文件1.1 使用C标准库中的IO库(fstream)读写文件#include #include using namespace std;int main(){char szData[200] "123456 test";fstream fFile;fFile.open("test.txt", ios::app | ios::out | ios::in);/****************将数据写入文件-begin***…

cocos2d-x 音效中断问题

做跑酷重吃金币播音效时&#xff0c;播放其它音效会使得音效所有中断&#xff0c;最后发现时音效上限的问题&#xff0c;2.2.3默认的似乎是5个音效&#xff0c;改动成50后问题解决。 在java中的org.cocos2dx.lib包下有一个Cocos2dxSound.java文件&#xff0c;改动里面 private …

AStyle - SourceInsight

SourceInsight : Options : Custom Commands Add 在弹出对话框写入 C/C Formatter "C:\AStyle\AStyle.exe" --styleansi -s2 --convert-tabs %f SourceInsight : Options : Key Assignments

c# blockingcollections

1 class Program2 {3 static BlockingCollection<int> cols new BlockingCollection<int>(2); //设置阻塞队列最大的容量&#xff1b;4 public static void Main(string[] args)5 {6 7 8 var t1…

递归/回溯:subsets求子集

前言 回溯法又称为试探法&#xff0c;但当探索到某一步时&#xff0c;发现原先选择达不到 目标&#xff0c;就退回一步重新选择&#xff0c;这种走不通就退回再走的技术为回溯法。 已知一组数(其中无重复元素)&#xff0c;求这组数可以组成的所有子集。 结果中不可有无重复的子…

C++ stl vector介绍

转自&#xff1a; STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector&#xff0c;如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用&#xff0c;如在remove_if()和for_each()中的使用。通过阅读这篇文章读者应该能够有效地使…

Linux服务器部署ssl证书教程,linux服务器在wdcp面板安装ssl证书教程

不少站长如今越来越在意站内数据传输的安全性&#xff0c;想着把自己建设的网站加密传输&#xff0c;许多站长都需要安装ssl证书&#xff0c;且很多站长都在找寻centos系统服务器linux服务器或者是wdcp面板怎么安装ssl证书&#xff0c;网上找了下没有完整步骤教程&#xff0c;所…

设备节点注册和操作方法连接

今天把驱动程序乱七八糟的看了一通&#xff0c;简单总结一下。 一个完整的驱动&#xff0c;需要提供如下的东西&#xff0c; 第一&#xff0c;用户空间/dev下面的设备节点。当然&#xff0c;如果该设备仅仅是内核的使用&#xff0c;例如I2C&#xff0c;则不需要在/dev下面建立…

maven(一 基本操作 命令 标签)

原来一直没有使用maven 小公司&#xff0c;只是听说过这个东西&#xff0c;我没事就喜欢 去学习一些新东西。maven学了几次&#xff0c;但是 没有用上 所以 最后还是忘记了&#xff0c;或者说不知道怎么使用maven&#xff0c;一年半以前公司 改革 &#xff0c;招了一个技术大牛…

递归/回溯:Subsets II求子集(有重复元素)

上一篇描述了针对数组中没有重复元素进行子集的求取过程递归/回溯&#xff1a;subsets求子集 但是当出现如下数组时&#xff1a; 例如: nums[] [2, 1, 2, 2] 结果为: [[], [1], [1,2], [1,2,2], [1,2,2,2], [2], [2,2], [2,2,2]] 注意: [2,1,2]与[1,2,2]是重复的集合,则不满足…

[WP]使用ApacheCordova开发HTML5-WindowsPhone应用程序

下载代码示例 这篇文章介绍 Apache 科尔多瓦&#xff0c;创建使用 HTML5 和 JavaScript&#xff0c;跨平台移动应用程序的框架&#xff0c;并显示了如何使用它为 Windows Phone 开发应用程序。 Windows Phone 和其本机开发平台允许您轻松地创建美丽地铁样式的应用程序。 最近诺…

linux 不能运行程序代码,linux-无法在Ubuntu上运行我自己的OpenGL 3程序

我正在尝试OpenGL 2.x和3.x教程.程序进行编译和链接,然后在看似无害的行上进行段错误处理,例如glGenBuffers (1, &m_buffer);我的main()以glewInit和glutInit开头. OpenGL 1程序可以编译并正常运行,这似乎是由glew包装的新功能.一个教程说,在尝试任何其他操作之前,我应该先…

Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1

错误大致显示如下信息&#xff1a;04-14 07:39:18.325: E/AudioEffect(20584): set(): AudioFlinger could not create effect, status: -104-14 07:39:18.325: E/libOpenSLES(20584): Effect initCheck() returned -104-14 07:39:18.325: E/libOpenSLES(20584): Environmental…

H2:开源内存数据库引擎

本资源由 伯乐在线 - 刘立华 整理H2是一个开源的内存数据库。Java编写、快速、小巧&#xff08;1.5MB jar包&#xff09;还提供了Web控制台管理数据库内容。 主要功能 非常快速的数据库引擎。开源。Java编写。支持标准SQL、JDBC API。支持嵌入式模式、服务器模式和集群。强大的…

递归/回溯:Combination Sum II数组之和

问题如下&#xff1a; 已知一组数(其中有重复元素)&#xff0c;求这组数可以组成的所有子集中&#xff0c;子 集中的各个元素和为整数target的子集&#xff0c;结果中无重复的子集。 例如: nums[] [10, 1, 2, 7, 6, 1, 5]&#xff0c; target 8 结果为: [[1, 7], [1, 2, 5], …

如何在SharePoint2010中添加Deep Zoom Image

如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation&#xff1b;SharePoint 2010 Standard&#xff1b;SharePoint 2010 Enterprise所需材料 1. SeaDragon Ajax Viewer Web部件&#xff08;点击此处下载&#xff09;2. Deep Zoom Image Composer&…

linux 读取磁盘扇区,linux 下检查硬盘坏道/扇区

文章摘自&#xff1a;Linux检测硬盘坏道Linux检测硬盘坏道badblocks功能说明&#xff1a;检查磁盘装置中损坏的区块。语法&#xff1a;badblocks [-svw][-b ][-o ][磁盘装置][磁盘区块数][启始区块]补充说明&#xff1a;执行指令时须指定所要检查的磁盘装置&#xff0c;及此装置…

Pjax是什么以及为什么推荐大家用

什么是pjax? 现在很多网站( facebook, twitter) 都支持这样的一种浏览方式&#xff0c; 当你点击一个站内的链接的时候&#xff0c; 不是做页面跳转&#xff0c; 而是只是站内页面刷新。 这样的用户体验&#xff0c; 比起整个页面都闪一下来说&#xff0c; 好很多。 其中有一…

Scrapy框架CrawlSpider类爬虫实例

CrawlSpider类爬虫中&#xff1a; rules用于定义提取URl地址规则&#xff0c;元祖数据有顺序 #LinkExtractor 连接提取器&#xff0c;提取url地址 #callback 提取出来的url地址的response会交给callback处理 #follow 当前url地址的响应是否重新经过rules进行提取url地址 cf.py具…

递归/回溯:Generate Parentheses生成合法括号

已知n组括号&#xff0c;开发一个程序&#xff0c;生成这n组括号所有的合法的组合可能。 例如:n 3 结果为: ["((()))", “(()())”, “(())()”, “()(())”, “()()()”] 首先思考如何生成所有的括号组合的可能性&#xff0c;即例如2组括号&#xff0c;总共4个符号…

利用“哨兵”“实现双链表

利用“哨兵”“实现双链表 下面的代码用一个”哨兵“实现双链表&#xff0c;感觉很简洁&#xff0c;中间也有点绕&#xff0c;暂时实现&#xff0c;供学习之用 static Node list_handle {&list_handle,&list_handle, };bool addNode(Node* node) {if (node NULL){re…

suse linux显示乱码,open suse11.4中文乱码问题

winland0704 于 2011-04-07 00:56:10发表:不是乱码&#xff0c;而是字符编码标准不一样。windows的文本使用GBK&#xff0c;国标码。Linux使用Unicode编码。解决参看&#xff1a;hi.baidu.com/winland0704/blog/item/c58008512cc843c9b645aef1.html四、其他的一些问题3、文本编…

软件破解系列之OD中断方法

OD中断方法浅探 Ollydbg是一个新的32位的汇编层调试软件。适应于windows98、me、2000、xp和2003操作系统。由于他具有图形窗口界面&#xff0c;所以操作方便、直观&#xff0c;是cracker的好工具。 由于Ollydbg没有了TRW2000的万能断点&#xff0c;所以许多的新手感觉到用Ollyd…

MongoDB系列:二、MongoDB常用操作练习

最近在自学MongoDB&#xff0c;在此记录一下&#xff0c;当做学习笔记了&#xff08;不断更新中&#xff09;&#xff01;&#xff01; 一、背景 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它是一个介于关…

递归/回溯:八皇后问题N-Queens

N皇后问题是计算机科学中最为经典的问题之一&#xff0c;该问题可追溯到1848年&#xff0c;由国 际西洋棋棋手马克斯贝瑟尔于提出了8皇后问题。 将N个皇后放摆放在N*N的棋盘中&#xff0c;互相不可攻击&#xff0c;有多少种摆放方式&#xff0c;每种摆 放方式具体是怎样的? 8…

KS103超声波测距模块

max232&#xff1a;电平转换芯片&#xff0c;将电脑的RS-232标准串口&#xff08;高12V&#xff0c;低-12V&#xff09;转换为&#xff08;高5V&#xff0c;低0V&#xff09;。 电脑串口&#xff08;RS -232&#xff09; > 单片机串口&#xff08;TTL串口&#xff09; SIPEX…

linux 硬盘操作,linux常用disk磁盘操作命令

#按照目录大小排序战士最前面15个目录或者文件du -xB M --max-depth2 /var | sort -rn | head -n 15#列出当前所有子目录的文件大小du -h --max-depth1#列出当前文件或者目录最大的10个du -s * | sort -n | tail#按照目录大小从大到小排序du -b --max-depth 1 | sort -nr | per…

在Spring中采用声明式方法对Hibernate和JDBC进行统一的事务配置(AOP)

<?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:aop"http://www.springframework.…

Leetcode 213.大家劫舍II

打家劫舍II 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈&#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房…