题目链接

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2214

题目

Description

有一个1到N的自然数序列1,2,3,...,N-1,N。

我们对它进行M次操作,每次操作将其中连续的一段区间 [Ai,Bi][Ai,Bi] (即第Ai个元素到第Bi个元素之间的一段)取出,然后插入到剩下的第Ci个元素的后面,如果Ci=0,表示插入到最左端。

现在,M次操作完后,有K个询问,每个询问Pi表示询问最终第Pi个元素是几。你的任务是写一个程序,依次回答这K个询问。

Input

第一行三个数,N,M,K。

接下来M行,每行三个整数Ai,Bi,Ci。

接下来K行,每行一个正整数Pi。

1<=N<=\(10^9\),1<=M<=\(10^4\),1<=K<=1000,1<=Ai<=Bi<=N,0<=Ci<=N-(Bi-Ai+1),1<=Pi<=N;

Output

输出共K行,为每次询问的答案。

Sample Input

13 3 13
6 12 1
2 9 0
10 13 8
1
2
3
4
5
6
7
8
9
10
11
12
13

Sample Output

6
7
8
9
10
11
12
2
3
4
5
13
1

题解

由于k,m都很小,所以我们可以考虑离线的思想离线的思想,对于每一次询问,从m到1把区间平移操作恢复。我们要知道的是最后序列的第x个数,那么我们可以算出不做最后一次平移前x是第几个位置,这样倒退到第一次就是一开始x所在的位置,也就是x所对应的数,输出答案即可。

考虑一下怎么算,有两种情况\(c[j] \ge a[j]\)时,我们把\(a[j]...b[j]\)移动到\(c[j]\)后面,此时若x在\(a[j],c[j]\)之间,那么他就会向后移动\(b[j]-a[j]+1\)个数,如果它在\(c[j]+1,c[j]+b[j]-a[j]+1\)之间,那么设这次位置是x,恢复平移后位置为y,那么\(a[j]+(x-c[j])-1=y\),即x+=a[j]-c[j]-1。其他情况x不变

若\(c[j]<a[j]\),此时若x在\(c[j]+1,c[j]+b[j]-a[j]+1\)之间,那么x+=a[j]-c[j]-1,若x处在\(c[j]+1+b[j]-a[j]+1,b[j]\)之间,那么\(x=c[j]+x-(c[j]+b[j]-a[j]+1)\)即x+=a[j]-b[j]-1。

一直倒推到1即为答案,依次输出即可

AC代码

#include<bits/stdc++.h>
#define N 10050
using namespace std;
int a[N], b[N], c[N];
typedef long long ll;
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= m; i++) {
scanf("%d%d%d", &a[i], &b[i], &c[i]);
}
for (int i = 1; i <= k; i++) {
ll x;
scanf("%lld", &x);
for (int j = m; j >= 1; j--) {
if (c[j] >= a[j]) {
if (x >= a[j] && x <= c[j]) {
x += b[j] - a[j] + 1;
}
else if (x >= c[j] + 1 && x <= c[j] + b[j] - a[j] + 1) {
x += a[j] - c[j] - 1;
}
}
else {
if (x >= c[j] + 1 && x <= c[j] + b[j] - a[j] + 1) {
x += c[j] + 1 + a[j] - c[j] - 1 - 1 - c[j];
}
else if (x >= c[j] + b[j] - a[j] + 1 + 1 && x <= b[j]) {
x -= (b[j] - a[j] + 1);
}
}
}
printf("%d\n", x);
}
}
/**********************************************************************
Problem: 2214
User: Artoriax
Language: C++
Result: AC
Time:284 ms
Memory:2140 kb
**********************************************************************/

结语

至此所有寒假集训选拔写过的题的题解补完了,赶快开始补寒假集训的题解了,不能再划水了

CSU-2214 Sequence Magic的更多相关文章

  1. CSU 2018年12月月赛 B 2214: Sequence Magic

    Description 有一个1到N的自然数序列1,2,3,...,N-1,N. 我们对它进行M次操作,每次操作将其中连续的一段区间 [Ai,Bi][Ai,Bi] (即第Ai个元素到第Bi个元素之间的 ...

  2. CSU 1515 Sequence (莫队算法)

    题意:给n个数,m个询问.每个询问是一个区间,求区间内差的绝对值为1的数对数. 题解:先离散化,然后莫队算法.莫队是离线算法,先按按询问左端点排序,在按右端点排序. ps:第一次写莫队,表示挺简单的, ...

  3. CSU 1515 Sequence

    莫队算法+map #include<cstdio> #include<cstring> #include<cmath> #include<map> #i ...

  4. STL or 线段树 --- CSU 1555: Inversion Sequence

    Inversion Sequence Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1555 Mean: 给你一 ...

  5. codeforces #447 894A QAQ 894B Ralph And His Magic Field 894C Marco and GCD Sequence

    A.QAQ 题目大意:从给定的字符串中找出QAQ的个数,三个字母的位置可以不连续 思路:暴力求解,先找到A的位置,往前扫,往后扫寻找Q的个数q1,q2,然 后相乘得到q1*q2,这就是这个A能够找到的 ...

  6. Inversion Sequence(csu 1555)

    Description For sequence i1, i2, i3, … , iN, we set aj to be the number of members in the sequence w ...

  7. CSU 1060 Nearest Sequence

    题意:求三个序列的最长公共子序列. 思路:一开始以为只要求出前两个的LCS,然后和第三个再求一遍LCS就是答案了.但是样例就对我进行啪啪啪打脸了.实际上就跟两个序列的差不多,换成三维的就行了. 代码: ...

  8. LVM XFS增加硬盘分区容量(resize2fs: Bad magic number in super-block while)

    LVM XFS增加硬盘分区容量(resize2fs: Bad magic number -- :: 分类: Linux LVM XFS增加硬盘分区容量(resize2fs: Bad magic num ...

  9. CodeForces 670D2 Magic Powder 二分

    D2. Magic Powder - 2 The term of this problem is the same as the previous one, the only exception — ...

随机推荐

  1. ElasticSearch 集群原理

    节点 一个运行中的EasticSearch 被称为一个节点,而集群是由多个用于拥有相同cluster.name配置的节点组成,它们共同承担数据和负载的压力,当有新的节点加入或移除,集群会重新平均分布所 ...

  2. ES6编程规范

    andre es6 js

  3. 转 Ubuntu 下 vim 搭建python 环境 配置

    1. 安装完整的vim# apt-get install vim-gnome 2. 安装ctags,ctags用于支持taglist,必需!# apt-get install ctags 3. 安装t ...

  4. GNU 关闭 MMU 和 Icache 和 Dcache

    1. cp15 寄存器   disable Icache 和 Dcache . disable_MMU: MCR p15,0,r0,c7,c7,0 MRC p15,0,r0,c1,c0,0 bic r ...

  5. web前端工程师面试技巧 常见问题解答

    web前端工程师面试技巧 常见问题解答 每年的春招是各企业需求人才的黄金时期,不少的前端大牛或者前端新手在面试时候不知道怎么来回答面试官的问题,下面来看下我转载的这篇文章吧,希望对从事前端工作的你有所 ...

  6. dts--tests(三)

    sample_built.py """ DPDK Test suite. Test sample_built. """ import uti ...

  7. 关于移动端video标签层级问题

    这是在微信中正常页面,就是用了一个原生video标签没做任何处理.然后顶部是固定页面顶端的,这个时候向上滑动页面时,会出现下图现象 这个时候正常人都会想到z-index问题,我也是这样想的,可惜很抱歉 ...

  8. PHP 面向对象 static 和 self 的区别

    一.前言 php是世界上最好的语言 php从面向过程走到现在成熟的面向对象体系, 在php面向对象中,静态变量的调用我们可以用这两个self::method和 static::method, 但是很多 ...

  9. POJ 3254 状压DP(基础题)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17749   Accepted: 9342 Desc ...

  10. 查找并绘制轮廓 opencv

    findContours(): 第二个参数为一个检测到的轮廓,函数调用后的运算结果都放在这里,每个轮廓存储为1个点向量,用point类型的vector表示. 第三个参数表示轮廓数量,包含了许多元素.每 ...