AT_ijpc_training.魔法の訓練 (Magical Training)
通过率:0%
AC君温馨提醒
该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
いもす是14岁时就进行了魔法觉醒的魔法少女。
いもす为了打倒161天以后即将来临的强敌「ウォーターリークス」,开始进行提高魔力的训练。这个训练是这样的:
一开始,有N个魔力值已给出的魔法石排成一列。
现在选择连续的一些魔法石,将它们按照魔力值从小到大排序,也就是说,将魔力值小的魔法石放在较小的编号上这样的训练,可以提高いもす的魔力。每一块魔法石都很重,所以排序的时候只能用魔法交换相邻的两块魔法石。
但是,魔法石有很多,交换魔法石的顺序是相当艰难的。又因为交换的方案有很多,所以いもす选择的是最轻松的方案。而且,魔法石的魔力值会在某些时间点突然发生变化。十分幸运的是,这些变化已经全部被预测了。
为了帮助いもす的魔法训练,请你写一个程序支持如下操作:
题目将给出一个包含N个整数的排列A(A0…AN−1),其中从左往右第i+1个魔法石的编号为i,Ai表示i号魔法石的魔力值。
要实现的操作如下:
- 含有参数的过程init(N,A):
- N——魔法石的个数。魔法石的编号从左至右依次为0...N−1
- A——表示魔法值的整数的序列。保证对0≤i<N有1≤Ai≤N
这个过程只在update和train之前出现一次,没有返回值。
- 含有参数的过程update(i,x):
- i——魔力值变动的魔法石编号
- x——魔力变动后魔法石i的魔力值。保证1≤x≤N
这个过程被多次调用,一次调用对应一次魔力值的变化,没有返回值。
- 含有参数的过程train(p,q):
- p——选择的魔法石序列的左端魔法石编号。保证1≤p<N
- q——选择的魔法石序列的右端魔法石编号。保证p≤q<N
这个过程被多次调用,一次调用对应从魔法石p到魔法石q(两端也包含),通过更换相邻的魔法石,达到升序排列的训练。需要返回作为对应的训练所需的最小的魔法石交换次数。但是,实际不进行魔法石的交换,只要求交换的次数。
举个例子
当N=6时,A为(4,1,2,2,6,5)时,进行如下的7次操作
| 操作 | 输出 |
|---|---|
| train(0,5) | 4 |
| train(2,3) | 0 |
| update(1,5) | 无 |
| train(0,5) | 5 |
| train(1,4) | 2 |
| update(5,1) | 无 |
| train(0,5) | 9 |
数据规模
设update和train的调用次数为P,Q
部分1(12分)
1≤N≤100
1≤P+Q≤200
部分2(18分)
1≤N≤5000
1≤P+Q≤10000
部分3(30分)
1≤N≤30000
P=0
1≤Q≤20000
部分4(40分)
1≤N≤30000
1≤P+Q≤20000
输入格式
第一行包含一个数N,表示魔法石总数。
第二行包含N个整数A0...AN−1,表示魔法石的魔法值。
第三行包含一个数M,表示操作个数。
接下来的M行,每行有三个整数Ti,Xi,Yi。Ti=0时调用update(Xi,Yi),Ti=1时调用train(Xi,Yi)。
输出格式
对于每一个train操作,输出一行,包含一个数,为最少交换次数。
输入输出样例
输入样例#1
6
4 1 2 2 6 5
7
1 0 5
1 2 3
0 1 5
1 0 5
1 1 4
0 5 1
1 0 5
输出样例#1
4
0
5
2
9
输入解题思路,AI测评打分。不知道怎么写?