树状数组---Squared Permutation
最近,无聊的过河船同学在玩一种奇怪的名为“小Q的恶作剧”的纸牌游戏。
现在过河船同学手有张牌,分别写着
,打乱顺序之后排成一行,位置从左往右按照
标号。
接下来小Q同学会给出个操作,分为以下两种:
1.给定,交换从左往右数的第
和第
张牌,
2.给定,对从左往右数的第
张牌,记下位置是这张牌上的数字的牌的数字,询问所有记下的数字加起来的结果。
虽然无聊的过河船同学精通四则运算,但是要完成这么大的计算量还是太辛苦了,希望你能帮他处理这些操作。
Input
第一行是一个正整数,表示测试数据的组数,
对于每组测试数据,
第一行是一个整数,
第二行包含一个的排列,其中第
个数表示第
张牌上的数字,
第三行是一个整数,表示操作数,
接下来行,每行包含三个整数
,其中
表示操作的类型。
Output
对于每组测试数据,依次输出所有查询操作的结果,每个结果一行。
Sample Input
1
3
1 2 3
3
2 1 2
1 1 3
2 2 3
Sample Output
3
5
Hint
对于样例,
第二次操作后牌上的数字从左往右依次是3,2,1,
第三次操作的结果是位置是第2张牌上的数字的牌的数字加上位置是第3张牌上的数字的牌的数字,也就是第2张牌上的数字加上第1张牌上的数字,结果是5。
Source
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
long long s[];
int a[],b[],flag[],t,n,m,Time;
int f[],tot; int lowbit(int x)
{
return x & (-x);
} void update(int x,long long y)
{
while(x <= n)
{
s[x] += y;
x += lowbit(x);
}
} long long getsum(int x)
{
long long tmp = ;
while(x > )
{
tmp += s[x];
x -= lowbit(x);
}
return tmp;
} int main(){
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = ;i <= n;i++)
{
scanf("%d",&a[i]);
b[a[i]] = i;
s[i] = ;
}
for(int i = ;i <= n;i++)update(i,a[a[i]]);
scanf("%d",&m);
for(int i = ;i <= m;i++)
{
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op == )
{
Time++;
tot = ;
f[] = l;
f[] = r;
flag[l] = Time;
flag[r] = Time;
if(flag[b[l]] != Time)
{
++tot;
f[tot] = b[l];
flag[b[l]] = Time;
}
if(flag[b[r]] != Time)
{
++tot;
f[tot] = b[r];
flag[b[r]] = Time;
}
for(int i = ;i <= tot;i++)
update(f[i],-a[a[f[i]]]);
swap(a[l],a[r]);
b[a[l]] = l;
b[a[r]] = r;
for(int i = ;i <= tot;i++)
update(f[i],a[a[f[i]]]);
}
else printf("%lld\n",getsum(r)-getsum(l-));
}
}
return ;
}
树状数组---Squared Permutation的更多相关文章
- UVA11525 Permutation[康托展开 树状数组求第k小值]
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
- Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...
- [Codeforces 1208D]Restore Permutation (树状数组)
[Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...
- D. Restore Permutation 树状数组+二分
D. Restore Permutation 题意:给定n个数a[i],a[ i ]表示在[b[1],b[i-1]]这些数中比 b[i]小的数的和,要你构造这样的b[i]序列 题解:利用树状数组 求比 ...
- UVA 11525 Permutation(树状数组)
题目意思是说 给你一个数k 然后有k个si 问你1--k 的第n个全排列是多少 注意是 1 2 3...k的全排列 不是si的 N= 由观察得知(k-i)!就是k-i个数字的全排列种数 ...
- UVA 11525 Permutation (树状数组+YY)
题意:给你k个数Si,然后给你一个等式 H= ∑ Si ∗ (K − i)! (i=(1->k)且0 ≤ Si ≤ K − i). 叫你求出第H个全排列 其实这是一个康托展开:X=a[n ...
- cf1208 D Restore Permutation (二分+树状数组)
题意 让你构造一个长度为n的序列,记为p1……pn,(这个序列是1~n的全排列的一种) 给你n个数,记为s1……sn,si的值为p1……pi-1中小于pi的数的和. 思路 显然,应该倒着来,也就是从p ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
随机推荐
- 优先队列求解Huffman编码 c++
优先队列小析 优先队列的模板: template <class T, class Container = vector<T>,class Compare = less< ...
- Eclipse调试时Application XXX is waiting for the debugger to attach的提示
原文链接: http://blog.csdn.net/star_huang/article/details/7678845 最近Eclipse调试时总是出现Application XXX is wa ...
- 解决Spring+Quartz无法自动注入bean问题
问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...
- C8051 SMBus 原理
一.SMBus总线 SMBus串行I/O接口完全符合系统管理总线规范 1.1 版.它是一个双线的双向串行总线,与I2C串行总线兼容.系统控制器对总线的读写操作都是以字节为单位的,由SMBus接口自 ...
- JRE 1.8.0_65/66 Certified with Oracle E-Business Suite
Java Runtime Environment 1.8.0_65 (a.k.a. JRE 8u65-b17) and JRE 1.8.0_66 (8u66-b17) and later update ...
- 【转】 SVM算法入门
课程文本分类project SVM算法入门 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 支持向量机(Supp ...
- java攻城狮之路(Android篇)--BroadcastReceiver&Service
四大组件:activity 显示. contentProvider 对外暴露自己的数据给其他的应用程序.BroadcastReceiver 广播接收者,必须指定要接收的广播类型.必须明确的指定acti ...
- Sass学习之路:注释、变量以及导入
前言 由于.sass不兼容CSS代码,所以以下内容完全使用.scss的语法. Sass注释 Sass中除了提供CSS中的标准注释之外,还提供了一种静默注释: /* 我是标准注释 */ // 我是静默注 ...
- [OpenCV] Image Processing - Fuzzy Set
使用模糊技术进行 (灰度变换Grayscale Transform) 和 (空间滤波Spatial Filtering) 模糊集合为处理不严密信息提供了一种形式. 首先,需要将输入量折算为隶属度,这个 ...
- [OpenCV] IplImage and Functions
In this chapter, APIs will make U crazy. Good luck! Next, Review Linear Algebra. Ref: http://blog.c ...