HDU4027

题意:操作指令为0时,对区间[x,y]之间的数字进行开平方;指令为1的时候,对区间[x,y]之间的数字求和并输出;

思路:线段树处理就OK了,但是64位内的数最多开8次平方就为1了(开始不信,试了试之后orz.......),所以在开平方的时候加一下限制条件使开平方操作提前结束没必要的操作就可以了,不然会超时。

代码中的这句:en - st + 1 == evil[rt]表示区间st到en中所有的数都是1,所以可以提前结束了。

代码:

/*
Time:2018/8/20
Author:sykai1
Funtion:solve HDU 4027
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 0x3f3f3f3f using namespace std;
typedef long long ll;
typedef pair<double, int> P;
const int maxn = 2e5 + ;
ll evil[maxn * ];
int n; void Build(int rt, int st, int en)
{
if (st == en)
{
scanf("%I64d", &evil[rt]);
return;
} int mid = (st + en) / ;
Build(rt << , st, mid);
Build(rt << | , mid + , en);
evil[rt] = evil[rt << ] + evil[rt << | ];
} void Add(int rt, int x, int y, int st, int en)
{
if (st == en)
{
evil[rt] = (ll)sqrt(evil[rt]);
return;
}
if (en - st + == evil[rt])
{
//printf("GG %d\n",evil[rt]);
return;
} int mid = (st + en) / ;
if (y <= mid)
Add(rt << , x, y, st, mid);
else if (x > mid)
Add(rt << | , x, y, mid + , en);
else
{
Add(rt << , x, mid, st, mid);
Add(rt << | , mid + , y, mid + , en);
}
evil[rt] = evil[rt << ] + evil[rt << | ];
} ll query(int rt, int x, int y, int st, int en)
{
ll res = ;
if (x == st && y == en)
return evil[rt];
int mid = (st + en) / ; if (y <= mid)
res = query(rt << , x, y, st, mid);
else if (x > mid)
res = query(rt << | , x, y, mid + , en);
else
{
res = query(rt << , x, mid, st, mid);
res += query(rt << | , mid + , y, mid + , en);
}
return res;
} int main()
{
int cnt = ;
while (scanf("%d", &n) != EOF)
{
printf("Case #%d:\n", ++cnt);
Build(, , n);
int q, op, x, y;
scanf("%d", &q);
for (int i = ; i < q; i++)
{
scanf("%d%d%d", &op, &x, &y);
if (x > y) swap(x, y);
if (op == )
Add(, x, y, , n);
else
{
printf("%lld\n", query(, x, y, , n));
}
}
printf("\n");
}
return ;
}

最新文章

  1. CRM 2016 子表单中N:1关系 字段要求与新建时的关系
  2. js017-错误处理与调试
  3. decimalFormat(&quot;#&quot;,&quot;##0.00&quot;) java
  4. Ubuntu 设置简单密码,复杂度太高
  5. 处理Selection对象和Range对象——Word VBA中重要的两个对象
  6. Android定时器功能实现方法
  7. 在win2003上安装配置win 服务 遇到的问题
  8. 网络NSURLSession
  9. offset,client,scroll,style相关笔记
  10. php表单提交 图片、音乐、视频、文字,四种类型共同提交到数据库
  11. hdu 3342 拓扑排序 水
  12. gdb core 调试多线程
  13. 【LeetCode每天一题】Rotate List(旋转链表)
  14. linux文件打包并发送到其他服务器
  15. 细说PHP中strlen和mb_strlen的区别(转)
  16. R-Sys.time计算程序运行时间
  17. H2O.ai初步使用
  18. hive-2.3.3安装
  19. spring aop的两种写法aspect和advisor
  20. 通过http流发送post请求

热门文章

  1. hdoj 4925 Apple tree 【最小割】
  2. VCL源码修改立即生效
  3. centos上装eclipse步骤
  4. UVA 1476 - Error Curves(三分法)
  5. tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】
  6. hdu 4587(枚举+割顶)
  7. CF 1016 C —— 思路
  8. C++11系列-什么是C++11
  9. thinkphp vender
  10. roundabout旋转幻灯