COGS 1361. 树
★ 输入文件:treed.in 输出文件:treed.out 简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
在一个凉爽的夏夜,xth和rabbit来到花园里砍树。为啥米要砍树呢?是这样滴,小菜儿的儿子窄森要出生了。Xth这个做伯伯的自然要做点什么。于是他决定带着rabbit去收集一些木材,给窄森做一个婴儿车……(xth早就梦想着要天天打菜儿他儿窄森的小pp,到时候在婴儿车里安装一个电子遥控手臂,轻轻一按,啪啪啪……"乌卡卡——"xth邪恶滴笑了,"不要告诉rabbit,她会说我缺德的……"xth如是说)。
花园里共有n棵树。为了花园的整体形象,rabbit要求xth只能在m个区域砍伐,我们可以将这m个区域看成m个区间,树的间距相等,都是1,我们将每个区间设为[x,y]。那么长度为k的区间中就有k棵树。树木的高度不等。现在xth想测量一下,每个区间树木砍伐后所得的木材量是多少,而且每次测量后他都会砍下标号为(x+y)/2的那棵作为纪念。以方便他安排人手。(同一个区间的树木可以重复砍伐,我们认为被砍过的树木高度为0)
每棵树的木材量=树的高度∗3.14(注意是3.14不是π)
【输入格式】
第一行,一个整数n。
第二行,共n个整数,表示每棵树的高度。
第三行,一个整数m,表示共m个区间。
以下m行,每个区间[x,y]的左右端点x,y。
【输出格式】
共m行,每行一个数,表示每个区间的木材量。
结果精确到小数点后两位。
【输入样例】
5
1 2 3 4 5
2
1 4
2 4
【输出样例】
31.40
21.98
【数据规模】
对于30%的数据,有n≤5000,m≤5000;
对于100%的数据,有n≤200000,m≤200000;
【样例解释】
第一次砍[1,4]的树后,森林变为:1 0 3 4 5
1 线段树
区间查询
单点修改
#include <cstdio>
#define Max 200000
const double pi=3.14; struct NodeTypeTree{
int l,r,dis;
};
struct NodeTypeTree tr[Max<<];
int n,m;
inline void tree_up(int k)
{
tr[k].dis=tr[k<<].dis+tr[k<<|].dis;
}
void build(int k,int l,int r)
{
tr[k].l=l;tr[k].r=r;
if(l==r)
{
scanf("%d",&tr[k].dis);
return;
}
int mid=(l+r)>>;
build(k<<,l,mid);build(k<<|,mid+,r);
tree_up(k);
}
int section_query(int k,int l,int r)
{
if(tr[k].l==l&&tr[k].r==r) return tr[k].dis;
int mid=(tr[k].l+tr[k].r)>>;
if(l>mid) return section_query(k<<|,l,r);
else if(r<=mid) return section_query(k<<,l,r);
else return section_query(k<<,l,mid)+section_query(k<<|,mid+,r);
}
void single_delete(int k,int t)
{
if(tr[k].l==tr[k].r)
{
tr[k].dis=;
return;
}
int mid=(tr[k].l+tr[k].r)>>;
if(mid>=t) single_delete(k<<,t);
else single_delete(k<<|,t);
tree_up(k);
}
int main()
{
freopen("treed.in","r",stdin);
freopen("treed.out","w",stdout);
scanf("%d",&n);
build(,,n);
scanf("%d",&m);
for(int x,y;m--;)
{
scanf("%d%d",&x,&y);
printf("%.2lf\n",section_query(,x,y)*pi);
single_delete(,(x+y)>>);
}
return ;
}
2 树状数组
跑的飞快
#include <ctype.h>
#include <cstdio>
#define N 200005
const double PI = 3.14; inline int lowbit(int x) {return x&(-x);}
int a[N],n,m,tag[N];
inline void Read(int &x)
{
bool f=;
register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar()) if(ch=='-') f=;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
x=f?-x:x;
}
inline void update(int x,int y)
{
for(;x<=n;x+=lowbit(x))
tag[x]+=y;
}
inline int ask(int x)
{
int ans=;
for(;x;x-=lowbit(x)) ans+=tag[x];
return ans;
}
int Main()
{
freopen("treed.in","r",stdin);
freopen("treed.out","w",stdout);
Read(n);
for(int i=;i<=n;i++)
{
Read(a[i]);
update(i,a[i]);
}
Read(m);
for(int x,y;m--;)
{
Read(x);
Read(y);
printf("%.2lf\n",(ask(y)-ask(x-))*PI);
int mid=(x+y)>>;
update(mid,-a[mid]);
a[mid]=;
}
return ;
}
int sb=Main();
int main(int argc,char *argv[]) {;}
COGS 1361. 树的更多相关文章
- cogs 1361. 树 线段树
1361. 树 ★ 输入文件:treed.in 输出文件:treed.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 在一个凉爽的夏夜,xth和rabbit来到 ...
- cogs 2039. 树的统计
2039. 树的统计 ★★ 输入文件:counttree.in 输出文件:counttree.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 关于树的统计问题有 ...
- 5.27 Test
1.COGS.2039. 树的统计 思路: 各种方法. 代码: 1.遍历树1 时间 0.314 s 平均内存 2.96 MB #include<cstdio> using name ...
- Cogs 1583. [POJ3237]树的维护 LCT,树链剖分
题目:http://cojs.tk/cogs/problem/problem.php?pid=1583 1583. [POJ3237]树的维护 ★★★☆ 输入文件:maintaintree.in ...
- Cogs 1672. [SPOJ375 QTREE]难存的情缘 LCT,树链剖分,填坑计划
题目:http://cojs.tk/cogs/problem/problem.php?pid=1672 1672. [SPOJ375 QTREE]难存的情缘 ★★★☆ 输入文件:qtree.in ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- COGS 2638. 数列操作ψ 线段树
传送门 : COGS 2638. 数列操作ψ 线段树 这道题让我们维护区间最大值,以及维护区间and,or一个数 我们考虑用线段树进行维护,这时候我们就要用到吉司机线段树啦 QAQ 由于发现若干次an ...
- cogs 2554. [福利]可持久化线段树
题目链接 cogs 2554. [福利]可持久化线段树 题解 没有 代码 #include<cstdio> #include<cstring> #include<algo ...
- COGS 1583. [POJ3237]树的维护
二次联通门 : COGS 1583. [POJ3237]树的维护 /* COGS 1583. [POJ3237]树的维护 树链剖分 + 边权化点权 线段树 单点修改 + 区间取相反数 + 查询区间最大 ...
随机推荐
- [laravel]phpunit
step1.install phpunit composer.json require中增加 "phpunit/phpunit":"4.0.*" 执行 comp ...
- c/c++内存机制(一)(原)
一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效. (2)堆(Heap):由程 ...
- UVA 11174 Stand in a Line 树上计数
UVA 11174 考虑每个人(t)的所有子女,在全排列中,t可以和他的任意子女交换位置构成新的排列,所以全排列n!/所有人的子女数连乘 即是答案 当然由于有MOD 要求逆. #include & ...
- public void与public static void区别
我们换个简单易懂的说法,这两句的区别就在于,能不能直接用类名访问. 很好理解的不是吗? 假如,我有一个类,如下图所示: 接下来先实例化一个对象,ca,你会发现它不仅可以访问普通的方法,也可以访问静态的 ...
- qq截图原理
屏幕截图实现的大体思想是:发起截图时,将当前窗口的图像保存到内存中,然后弹出一个置顶的全屏窗口,将保存的桌面图片绘制到这个全屏窗口上:初始时绘制的是灰化的桌面图像,选择截图区域后,则将选中的区域绘制成 ...
- SCUT - 290 - PARCO的因数游戏 - 博弈论
https://scut.online/p/290 一个 N 个数的取数游戏,Kaildls 和 Parco 轮流操作,每次操作从 N 个数中取一个数 y 并把他变成 y-x(满足 x | y 且x ...
- iOS后台模式BackgroundMode
概述 iOS平台提供给应用特殊的后台服务,应用在后台时仍被允许能执行一会. 后台模式 UIBackgroundModes Xcode Modes 1. audio -> Audio.Airpla ...
- C++笔试题库之编程、问答题 100~150道
101. winsock建立连接的主要实现步骤? 答: 服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接, accept()发现有客户端连 ...
- hdoj2795【未完待续】
题意: 给你一个矩形h*w(h,w都是1e9),然后给你n个询问,每个询问带一个1*wi矩形,问你这个给定矩形能放在第几行(从1-h下来).如果最终放不下了,就输出-1. 比如案例: 3 5 5 2 ...
- WIN7 64位操作系统 无法找到Access驱动
为了更充分的利用硬件资源,我想很多人都开使用64位操作系统了,同时你可以也发现了在64位操作系统上ODBC的驱动找不到了,所以ODBC的东西都没法用了. 因为2007以前版本的Office只有32位版 ...