【线段树】 HDOJ 4027 Can you answer these queries?
来源:互联网 发布:王啸坤 长白山 知乎 编辑:程序博客网 时间:2024/06/02 08:51
想了好久的线段树,用到的思想好巧妙,因为最大是2的63次方,所以开了个6,7次的平方就全变成一了。。。。比较好写的一种方法是直接用不加lazy的线段树更新区间,然后加一个当sum=R-L+1就不更新的剪枝。。。。我的代码是每加一次开根就pushdown,达到7次以后就不更新了。。。
#include <iostream>#include <sstream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <climits>#define maxn 400005#define eps 1e-7#define mod 1000000007#define INF 99999999#define lowbit(x) (x&(-x))typedef long long LL;using namespace std;struct node{int mark, cnt;LL v;}segtree[maxn];LL num[maxn];int n, m;LL ans;int ql, qr;void build(int o, int L, int R){segtree[o].mark=0;segtree[o].cnt=0;if(L==R){segtree[o].v=num[L];return;}int mid=(R+L)/2;build(2*o, L, mid);build(2*o+1, mid+1, R);segtree[o].v=segtree[2*o].v+segtree[2*o+1].v;}void pushdown(int o, int L, int R){if(!segtree[o].mark || segtree[o].cnt>=6) return;if(L==R){segtree[o].cnt+=segtree[o].mark;segtree[o].v=sqrt(segtree[o].v);segtree[o].mark=0;return;}segtree[2*o].mark+=segtree[o].mark;segtree[2*o+1].mark+=segtree[o].mark;segtree[o].cnt+=segtree[o].mark;segtree[o].mark=0;int mid=(R+L)/2;pushdown(2*o, L, mid);pushdown(2*o+1, mid+1, R);segtree[o].v=segtree[2*o].v+segtree[2*o+1].v;}void query(int o, int L, int R){if(ql<=L && qr>=R){ans+=segtree[o].v;return;}int mid=(L+R)/2;if(ql<=mid) query(2*o, L, mid);if(qr>mid) query(2*o+1, mid+1, R);}void updata(int o, int L, int R){if(ql<=L && qr>=R){segtree[o].mark++;pushdown(o, L, R);return;}int mid=(L+R)/2;if(ql<=mid) updata(2*o, L, mid);if(qr>mid) updata(2*o+1, mid+1, R);segtree[o].v=segtree[2*o].v+segtree[2*o+1].v;}void solve(void){int k;while(m--){scanf("%d%d%d",&k,&ql,&qr);if(qr<ql) swap(qr, ql);if(k){ans=0;query(1, 1, n);printf("%I64d\n", ans);}else updata(1, 1, n);}}int main(void){int i, _=0;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++) scanf("%I64d",&num[i]);scanf("%d",&m);build(1, 1, n);printf("Case #%d:\n", ++_);solve();printf("\n");}return 0;}
0 0
- 【线段树】 HDOJ 4027 Can you answer these queries?
- Hdoj 4027 Can you answer these queries? 【线段树】
- HDOJ-4027 Can you answer these queries?
- Can you answer these queries?+线段树
- hdoj 4027 Can you answer these queries? 【线段树 区间减为平方 + 区间求和】
- HDOJ 4027 Can you answer these queries?(线段树+区间标记)
- hdoj 4027 Can you answer these queries?(线段树+灵活的区间更新)
- HDU 4027 Can you answer these queries? 【线段树】
- HDU 4027 Can you answer these queries 线段树
- hdu 4027(线段树)Can you answer these queries?
- HDU 4027 线段树 Can you answer these queries?
- hdu 4027 线段树 Can you answer these queries?
- HDU 4027 Can you answer these queries?(线段树)
- hdu 4027 Can you answer these queries? 线段树
- hdu 4027 Can you answer these queries? 线段树
- hdu-4027-Can you answer these queries?-线段树
- hdu 4027 Can you answer these queries? 线段树
- HDU 4027 Can you answer these queries? (线段树)
- DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016, SQLERRMC=3;
- aio,epoll,asio
- 餐饮外卖行业的特点盘点
- 处理机调度
- Android实战: 如何实现 图片分享菜单加入指定程序
- 【线段树】 HDOJ 4027 Can you answer these queries?
- [leetcode] Merge k Sorted Lists
- 关于Linux部署javaweb(2)
- 产品设计体会(5003)最好的资源:老板
- html学习笔记之meta 标签介绍
- Android实战: 如何实现 图片分享菜单加入指定程序
- Android中实现打开启动界面
- 鸟哥LINUX私房菜学习笔记(7)
- n个整数数组返回n-1个乘积最大值