hdu 5063 不错的小想法题(逆向处理操作)
题意:
刚开始的时候给你一个序列,长度为n,分别为a[1]=1,a[2]=2,a[3]=3,a[4]=4...a[n]=n,然后有4种操作如下:
Type1: O 1 call fun1();
Type2: O 2 call fun2();
Type3: O 3 call fun3();
Type4: Q i问当前a[i]的值,****** 询问最多50次*******,输出%1e9+7.
Global Variables: a[1…n],b[1…n];
fun1() {
index=1;
for(i=1; i<=n; i +=2)
b[index++]=a[i];
for(i=2; i<=n; i +=2)
b[index++]=a[i];
for(i=1; i<=n; ++i)
a[i]=b[i];
}
fun2() {
L = 1;R = n;
while(L<R) {
Swap(a[L], a[R]);
++L;--R;
}
}
fun3() {
for(i=1; i<=n; ++i)
a[i]=a[i]*a[i];
}
思路:
感觉这个题目不错,首先我们要从题目给的信息里面获得重要的东西,比如这个题目最重要的是四种操作中询问的的操作不会大于50,这个非常重要,操作数一共是100000,而这个是50,50/100000的比率,现在我们来分析这个题目,首先,直接模拟肯定是不行的,这个我用我解释,其次就是我们怎么利用好这个50,我们对于每一次询问,问的只是第i个位置的值,而所有的操作中对于每各位置的处理都是独立的,就是我们变换的只是位置而已,对于每一位,我们不用管别的位数怎么变,只要知道自己该到那个位置就行了,那么这50次询问也只是关心的一位,所以我们可以先把所有的操作存起来<也可以说是离线?>,然后对于每一个询问,我们就把当前询问的这个位置逆序变换到当初的位置,这样的时间复杂度就是50*10W,完全可以接受,再就是怎么还原回去,这个虽然比较简单,我还是说下吧,省着有学弟疑问,对于第一和第二种操作,我们每次还原到上一步就是先断定他是奇数的第几个还是偶数的第几个,然后在算值<具体看代码>,对于)O
3这个更好弄,只要开始变量记录
下个数,最后乘回去就行了,<这个地方不是a^b是平方后再平方再平方...别弄错了>,遇到询问就直接跳过去,询问不改变位置,大体就是这样,具体看代码吧,这个题目要好好做做,能从中学到不少有用的东西。
#include<stdio.h>
#include<string.h>
typedef struct
{
int k;
}STAR; STAR Q[110000]; int poww(int a ,int b)
{
__int64 c = a;
for(int i = 2 ;i <= b ;i ++)
{
c *= c;
c %= 1000000007;
}
return (int)c;
} int main ()
{
int i ,j ,n ,m ,a ,t;
char str[4];
scanf("%d" ,&t);
while(t --)
{
scanf("%d %d" ,&n ,&m);
for(i = 1 ;i <= m ;i ++)
{
scanf("%s %d" ,str ,&a);
if(str[0] == 'O') Q[i].k = a;
else Q[i].k = a + 3;
} for(i = 1 ;i <= m ;i ++)
{
if(Q[i].k > 3)
{
int sp = 1 ,now = Q[i].k - 3;
for(j = i - 1 ;j >= 1 ;j --)
{
if(Q[j].k == 3) sp ++;
else if(Q[j].k > 3) continue;
else
{
if(Q[j].k == 1)
{
if(now <= (n + 1) / 2) now = now * 2 - 1;
else now = 2 * (now - (n + 1) / 2);
}
else now = n - now + 1;
}
}
printf("%d\n" ,poww(now ,sp));
}
}
}
return 0;
}
hdu 5063 不错的小想法题(逆向处理操作)的更多相关文章
- HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...
- hdu3006 状态压缩+位运算+hash(小想法题)
题意: 给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路: 是个小想法题目,要用到二进制压缩,位运算, ...
- HDU 4972 Bisharp and Charizard 想法题
Bisharp and Charizard Time Limit: 1 Sec Memory Limit: 256 MB Description Dragon is watching NBA. He ...
- HDU - 5969 最大的位或 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...
- HDU 5632 Rikka with Array [想法题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5632 ------------------------------------------------ ...
- HDU 4638 树状数组 想法题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 解题思路: 题意为询问一段区间里的数能组成多少段连续的数.先考虑从左往右一个数一个数添加,考虑当 ...
- HDU 5908 Abelian Period(暴力+想法题)
传送门 Description Let S be a number string, and occ(S,x) means the times that number x occurs in S. i. ...
- HDU 5635 ——LCP Array ——————【想法题】
LCP Array Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- hdu 4540 威威猫系列故事——打地鼠 dp小水题
威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
随机推荐
- CentOS安装libxml2报undefined reference to `gzopen64'
主要是记录一下安装时候踩的坑 CentOS在make libxml2的时候,会报这个错误 ./.libs/libxml2.so: undefined reference to `gzopen64' c ...
- C#关于个Base64,MD5,16进制的转换
1,待签名数据以UTF-8的格式转字节流,对字节流进行MD5算法得到的签名字节流,再转换为16进制字符串,即生成了数字签名. byte[] targetData = md5.ComputeHash(S ...
- 在linux下如何搭建jmeter的环境
首先 我们可以选择不同版本的jmeter 转载原连接:https://blog.csdn.net/lyl0724/article/details/79474388 Jmeter历史版本下载地址 htt ...
- Flask模板注入
Flask模板注入 Flask模板注入漏洞属于经典的SSTI(服务器模板注入漏洞). Flask案例 一个简单的Flask应用案例: from flask import Flask,render_te ...
- 最新版Swagger 3升级指南和新功能体验!
Swagger 3.0 发布已经有一段时间了,它于 2020.7 月 发布,但目前市面上使用的主流版本还是 Swagger 2.X 版本和少量的 1.X 版本,然而作为一名合格的程序员怎么能不折腾新技 ...
- Linux Python2 升级到 Python3
国内企业服务器用 CentOS 系统的比较多,CentOS8 系统已经将系统默认 Python 版本调整为了 Python3,但是 CentOS7 的存量还是很大,毕竟对企业生产服务来说稳定大于一切, ...
- C++11正则表达式
- MyBatis、Spring、SpringMVC 源码下载地址
MyBatis.Spring.SpringMVC 源码下载地址 github mybatis https://github.com/fengyu415/MyBatis-Learn.git spring ...
- MySQL中explain语句的使用
一.概述 在 MySQL 中,我们可以使用慢查询日志或者 show processlist 命令等方式定位到执行耗时较长的 SQL 语句,在这之后我们可以通过 EXPLAIN或者 DESC 命令获取 ...
- SqlServer存储过程的创建与使用
什么是存储过程? T-SQL中的存储过程,非常类似于net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句. 这样就可以提高存储过程的性能. ...