BZOJ 3787: Gty的文艺妹子序列

2023-12-19 03:40
文章标签 序列 bzoj 文艺 妹子 gty 3787

本文主要是介绍BZOJ 3787: Gty的文艺妹子序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

自闭了很久,代码看了一遍又一遍,终于把过程想清楚了

其实还是太着急了,过程都没有想完整

分块做

$g[i][j] 表示 第j块对第i块的逆序对个数,i <= j$

第一位暴力,第二位树状数组维护

$smaller[i][j] 表示前i块中j的个数,第二维树状数组维护$

$这样我们就可以以log的时间求出前i块中 任意区间范围的数的个数$

 

$考虑把查询分成A, B, C 三块 A和C和两侧的散块,B为中间的整块$

$B块可以用g[][]得到答案$

$再考虑A和C 把A 和 C 放在一起跑一遍逆序对 就得到 AA ,CC, AC$

$再考虑 AB 和 BC 怎么做  AB 就是对于A中每个元素 找到B中有多少个比它小的$

$BC 就是 在B中对于C的每个元素找到有多少个比它大的$

 

再考虑 修改

$g[][] 每一块都是要修改的 $

$smaller[][] 修改当前块后面的所有块都要修改$

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 #define N 50010
  5 #define unit 300
  6 int n, q, a[N], lastans; 
  7 
  8 struct BIT
  9 {
 10     int a[N];
 11     void update(int x, int val)
 12     {
 13         for (; x <= n; x += x & -x)
 14             a[x] += val; 
 15     }
 16     int query(int x)
 17     {
 18         int res = 0;
 19         for (; x > 0; x -= x & -x)
 20             res += a[x]; 
 21         return res;
 22     }
 23     int query(int l, int r) 
 24     {
 25         return query(r) - query(l - 1);  
 26     }
 27 }g[unit], smaller[unit], bit;
 28 
 29 int pos[N], posl[unit], posr[unit];
 30 void init()
 31 {
 32     for (int i = 1; i <= n; ++i)
 33     {
 34         posr[pos[i]] = i;
 35         if (i == 1 || pos[i] != pos[i - 1])  
 36             posl[pos[i]] = i;
 37     }
 38     for (int i = 1; i <= pos[n]; ++i)
 39     {
 40         for (int j = posl[i]; j <= posr[i]; ++j)
 41         {
 42             bit.update(a[j], 1);
 43             g[i].update(i, bit.query(a[j] + 1, n));
 44         }
 45         for (int j = i + 1; j <= pos[n]; ++j)
 46             for (int k = posl[j]; k <= posr[j]; ++k)
 47                 g[j].update(i, bit.query(a[k] + 1, n));
 48         for (int j = posl[i]; j <= posr[i]; ++j)
 49             bit.update(a[j], -1);
 50     }
 51     for (int i = 1; i <= n; ++i)
 52     {
 53         for (int j = pos[i]; j <= pos[n]; ++j)   
 54             smaller[j].update(a[i], 1);  
 55     }
 56 }
 57 
 58 void update(int x, int y)
 59 {
 60     for (int i = pos[x] + 1; i <= pos[n]; ++i)  
 61         g[i].update(pos[x], -smaller[i].query(a[x] - 1) + smaller[i - 1].query(a[x] - 1));
 62     int tot = 0;
 63     for (int i = posl[pos[x]]; i < x; ++i) tot += a[i] > a[x];
 64     for (int i = x + 1; i <= posr[pos[x]]; ++i) tot += a[i] < a[x];
 65     g[pos[x]].update(pos[x], -tot);
 66     for (int i = 1; i < pos[x]; ++i)
 67         g[pos[x]].update(i, -smaller[i].query(a[x] + 1, n) + smaller[i - 1].query(a[x] + 1, n));
 68     for (int i = pos[x]; i <= pos[n]; ++i)
 69         smaller[i].update(a[x], -1);
 70     a[x] = y;
 71     for (int i = pos[x] + 1; i <= pos[n]; ++i)
 72         g[i].update(pos[x], smaller[i].query(a[x] - 1) - smaller[i - 1].query(a[x] - 1));
 73     tot = 0;
 74     for (int i = posl[pos[x]]; i < x; ++i) tot += a[i] > a[x];
 75     for (int i = x + 1; i <= posr[pos[x]]; ++i) tot += a[i] < a[x];
 76     g[pos[x]].update(pos[x], tot);
 77     for (int i = 1; i < pos[x]; ++i)
 78         g[pos[x]].update(i, smaller[i].query(a[x] + 1, n) - smaller[i - 1].query(a[x] + 1, n));
 79     for (int i = pos[x]; i <= pos[n]; ++i)
 80         smaller[i].update(a[x], 1); 
 81 }
 82 
 83 int query(int l, int r)
 84 {
 85     int res = 0; 
 86     if (pos[l] == pos[r])   
 87     {
 88         for (int i = l; i <= r; ++i) 
 89         {
 90             bit.update(a[i], 1);
 91             res += bit.query(a[i] + 1, n);                      
 92         }
 93         for (int i = l; i <= r; ++i)
 94             bit.update(a[i], -1);
 95         return res;
 96     }
 97     for (int i = l; i <= posr[pos[l]]; ++i)
 98     {
 99         bit.update(a[i], 1);
100         res += bit.query(a[i] + 1, n);
101         res += smaller[pos[r] - 1].query(a[i] - 1) - smaller[pos[l]].query(a[i] - 1);  
102     }
103     for (int i = posl[pos[r]]; i <= r; ++i)
104     {
105         bit.update(a[i], 1); 
106         res += bit.query(a[i] + 1, n);
107         res += smaller[pos[r] - 1].query(a[i] + 1, n) - smaller[pos[l]].query(a[i] + 1, n);
108     }
109     for (int i = l; i <= posr[pos[l]]; ++i) bit.update(a[i], -1);
110     for (int i = posl[pos[r]]; i <= r; ++i) bit.update(a[i], -1); 
111     for (int i = pos[l] + 1; i < pos[r]; ++i)  
112         res += g[i].query(pos[l] + 1, i);  
113     return res;
114 }
115 
116 void Run()
117 {
118     while (scanf("%d", &n) != EOF)
119     {
120         for (int i = 1; i <= n; ++i) scanf("%d", a + i), pos[i] = (i - 1) / unit + 1;   
121         lastans = 0; scanf("%d", &q); init();
122         for (int qq = 1, op, x, y; qq <= q; ++qq)
123         {
124             scanf("%d%d%d", &op, &x, &y);
125             x ^= lastans, y ^= lastans;
126             if (op) update(x, y);  
127             else printf("%d\n", lastans = query(x, y));
128         }
129     }
130 }
131 
132 int main()
133 {
134     #ifdef LOCAL
135         freopen("Test.in", "r", stdin);
136     #endif 
137 
138     Run();
139     return 0;
140 }
View Code

 

转载于:https://www.cnblogs.com/Dup4/p/10079793.html

这篇关于BZOJ 3787: Gty的文艺妹子序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510780

相关文章

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现n*k时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为好序列。请你返回 nums中好子序列的最长长度。 实例1: 输入:nums = [1,2,1,1,3],

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

时间序列|change point detection

change point detection 被称为变点检测,其基本定义是在一个序列或过程中,当某个统计特性(分布类型、分布参数)在某时间点受系统性因素而非偶然因素影响发生变化,我们就称该时间点为变点。变点识别即利用统计量或统计方法或机器学习方法将该变点位置估计出来。 Change Point Detection的类型 online 指连续观察某一随机过程,监测到变点时停止检验,不运用到

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

go json反序列化成指定类型

简介 简单的介绍一下使用go的json库,将json字符串反序列化成接口中指定的实现类 代码如下 package usejsontype ExamInterface interface {CheckRule(data any) bool}type IntStru struct {DefalutVal int `json:"defalut_val"`Max int `json:

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E