codevs2492 上帝造题的七分钟 2
2492 上帝造题的七分钟 2
题目描述 Description
XLk觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。
"第一分钟,X说,要有数列,于是便给定了一个正整数数列。
第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作。
第三分钟,k说,要能查询,于是便有了求一段数的和的操作。
第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围。
第五分钟,诗人说,要有韵律,于是便有了时间限制和内存限制。
第六分钟,和雪说,要省点事,于是便有了保证运算过程中及最终结果均不超过64位有符号整数类型的表示范围的限制。
第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。"
——《上帝造题的七分钟·第二部》
所以这个神圣的任务就交给你了。
输入描述 Input Description
第一行一个整数n,代表数列中数的个数。
第二行n个正整数,表示初始状态下数列中的数。
第三行一个整数m,表示有m次操作。
接下来m行每行三个整数k,l,r,k=0表示给[l,r]中的每个数开平方(下取整),k=1表示询问[l,r]中各个数的和。
UPD:注意数据中有可能l>r,所以遇到这种情况请交换l和r。
输出描述 Output Description
对于询问操作,每行输出一个回答。
样例输入 Sample Input
10
1 2 3 4 5 6 7 8 9 10
5
0 1 10
1 1 10
1 1 5
0 5 8
1 4 8
样例输出 Sample Output
19
7
6
数据范围及提示 Data Size & Hint
对于30%的数据,1<=n,m<=1000,数列中的数不超过32767。
对于100%的数据,1<=n,m<=100000,1<=l,r<=n,数列中的数大于0,且不超过1e12。
注意l有可能大于r,遇到这种情况请交换l,r。
来源:Nescafe 20
【思路】
区间查询+打标记。
一个关键的思想就是一个数被反复开方并向下取整最终会变为1,如果一个数变成1就不需要对它操作了。
对于区间开方操作,对于区间中的每一个点都进行操作如果为1则下次不再操作。
实现1:
BIT+“并查集”。
【代码1】
//341ms
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long LL;
const int maxn = +; LL a[maxn],p[maxn];
int n,m; LL read() {
char c=getchar();
while(!isdigit(c)) c=getchar();
LL x=;
while(isdigit(c)) {
x=x*+c-'';
c=getchar();
}
return x;
} LL c[maxn];
int lowbit(int x) { return x&(-x); }
LL Sum(LL x) {
LL res=;
while(x>) {
res += c[x];
x-=lowbit(x);
}
return res;
}
void Add(int x,LL d) {
while(x<=n) {
c[x] += d;
x += lowbit(x);
}
}
int find(int x) {
return x==p[x]?x:p[x]=find(p[x]);
} int main() {
n=read();
FOR(i,,n) a[i]=read(),Add(i,a[i]);
FOR(i,,n+) p[i]=i; //n+1为哨兵
m=read();
LL u,v,w;
FOR(i,,m) {
w=read(),u=read(),v=read();
if(u>v) swap(u,v); if(w)
printf("%lld\n",Sum(v)-Sum(u-));
else
{
for(int j=find(u);j<=v;j=find(j+)) {
LL s=sqrt(a[j]);
Add(j,s-a[j]);
a[j]=s;
if(s==) {
p[j]=j+;
if(j==v) break;
}
}
}
}
return ;
}
实现2:
线段树+结点标记
【代码2】
//399ms
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long LL;
const int maxn = +; LL a[maxn],p[maxn];
int n,m; LL read() {
char c=getchar();
while(!isdigit(c)) c=getchar();
LL x=;
while(isdigit(c)) {
x=x*+c-'';
c=getchar();
}
return x;
} LL sumv[maxn];
bool f[maxn];
void build(int u,int L,int R) {
int lc=u*,rc=u*+;
if(L==R) {
sumv[u]=a[L];
}
else {
int M=L+(R-L)/;
build(lc,L,M);
build(rc,M+,R);
sumv[u]=sumv[lc]+sumv[rc];
}
}
int ya,yb;
void update(int u,int L,int R) {
int lc=u*,rc=u*+;
if(f[u]) return ;
if(L==R) {
sumv[u]=sqrt(sumv[u]);
if(sumv[u]==) f[u]=;
}
else {
int M=L+(R-L)/;
if(ya<=M) update(lc,L,M);
if(M<yb) update(rc,M+,R); sumv[u]=sumv[lc]+sumv[rc];
f[u]=f[lc]&&f[rc];
}
}
LL query(int u,int L,int R) {
int lc=u*,rc=u*+;
if(ya<=L && R<=yb) {
return sumv[u];
}
else {
int M=L+(R-L)/;
LL res=;
if(ya<=M) res+=query(lc,L,M);
if(M<yb) res+=query(rc,M+,R);
return res;
}
} int main() {
n=read();
FOR(i,,n) a[i]=read();
build(,,n);
m=read();
int w;
while(m--) {
w=read(),ya=read(),yb=read();
if(ya>yb) swap(ya,yb);
if(w) printf("%lld\n",query(,,n));
else update(,,n);
}
return ;
}
codevs2492 上帝造题的七分钟 2的更多相关文章
- codevs2492上帝造题的七分钟 2(线段树)
/* 区间修改 区间查询 可以用线段树搞 但是一般的标记下放对这个题好像不合适 只能改叶子 然后更新父亲(虽然跑的有点慢) 小优化:如果某个点是1 就不用再开方了 所以搞一个f[i]标记 i 这个点还 ...
- CodeVS2492 上帝造题的七分钟2(树状数组+并查集)
传送门 树状数组模板题.注意优化,假设某个数的值已经是1了的话.那么我们以后就不用对他进行操作了,这个能够用并查集实现. 这道题还有个坑的地方,给出查询区间端点的a,b,有可能a>b. #inc ...
- C++之路进阶——codevs2492(上帝造题的七分钟 2)
2492 上帝造题的七分钟 2 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description XLk觉得<上帝造题的七分钟&g ...
- 【BZOJ3211&3038】花神游历各国&上帝造题的七分钟2(CodeVS)
Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 ...
- 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...
- BZOJ3132: 上帝造题的七分钟
3132: 上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 483 Solved: 222[Submit][Status] Desc ...
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
- 「Poetize4」上帝造题的七分钟2
描述 Description "第一分钟,X说,要有数列,于是便给定了一个正整数数列.第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作.第三分钟,k说,要能查询, ...
- bzoj3038 上帝造题的七分钟2
Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对 ...
随机推荐
- 惠普 Compaq 6520s 无线开关打不开
问题描述:键盘上面的无线开关怎么按都打不开,始终是出于黄色的状态 解决方法:尝试恢复bios默认值测试: 开机不停点击F10进入bios,选择File选项,选择Restore Defaults-- ...
- angularjs 利用filter进行表单查询及分页查询
页面: <div> <input style="width:90%;margin-left:5px;margin-right:5px;" class=" ...
- 在window系统下配置login.sql
在window系统下配置login.sql 他的位置是登录用户的文件夹,我的win7系统位置是: C:\Users\Administrator 我的login.sql下载地址: http://file ...
- 把cygwin加入右键菜单
第一步:修改windows注册表 1·开始->运行(或者win键+R),输入REGEDIT,回车,打开注册表编辑器: 2·找到HKEY_CLASSES_ROOT\Directory\Backgr ...
- cocod2d-x 之 HelloWorld
cocos2d-x 2.2创建项目 进入cocos2d-x-2.2/tools/project-creator,运行命令 python create_project.py -project MyGam ...
- WdatePicker.js 日期时间插件
支持功能: 1.支持常规在input单击或获得焦点时调用,还支持使用其他的元素如:<img><div>等触发WdatePicker函数来调用弹出日期框 @1.input 调用: ...
- HDU 1069 Monkey and Banana(LIS最长上升子序列)
B - LIS Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descripti ...
- QLabel
The QLabel widget provides a text or image display. Content Setting Plain text Pass a QString to s ...
- SharePoint 2013 更新多个用户字段(Person or Group)
有时我们需要更新一个用户到Person or Group类型的字段, 当然这个属性允许设置多个用户, 要如何才能添加新的用户到该字段,同时还不影响原始存在的值. 这里我们需要了解 SPFieldUse ...
- 如何使用SplitContainer控件[转]
原文地址:http://yinzhihua2008.blog.163.com/blog/static/794306720120511150457/ 在Windows资源管理器中,当把鼠标指针移动到Tr ...