hihocode 1116 计算 (线段树)

题目链接:hihocode 1116 计算

中文题。

(待解决)还没弄明白为什么PushUp()怎么计算,神奇

#include <stdio.h>
#include <string.h>
#define LL long long
const LL kmod=10007;
const LL maxn=100010;
struct node{
	LL l,r;
	LL sum,all;
	LL ls,rs;
	LL mid(){
		return (l+r)>>1;
	}
};
struct node tree[maxn<<2];

void PushUp(LL rt){
	tree[rt].all=(tree[rt<<1].all*tree[rt<<1|1].all)%kmod;
	tree[rt].sum=((tree[rt<<1].sum+tree[rt<<1|1].sum)%kmod+(tree[rt<<1].rs*tree[rt<<1|1].ls)%kmod)%kmod;
	tree[rt].ls=(tree[rt<<1].ls+(tree[rt<<1].all*tree[rt<<1|1].ls)%kmod)%kmod;
	tree[rt].rs=(tree[rt<<1|1].rs+(tree[rt<<1|1].all*tree[rt<<1].rs)%kmod)%kmod;
}

void build(LL l,LL r,LL rt){
	tree[rt].l=l;
	tree[rt].r=r;
	if(l==r){
		return ;
	}
	LL m=tree[rt].mid();
	build(l,m,rt<<1);
	build(m+1,r,rt<<1|1);
}

void Update(LL p,LL add,LL rt){
	if(tree[rt].l==tree[rt].r){
		tree[rt].all=tree[rt].sum=add;
		tree[rt].rs=tree[rt].ls=add;
		return ;
	}
	LL m=tree[rt].mid();
	if(p<=m) Update(p,add,rt<<1);
	else Update(p,add,rt<<1|1);
	PushUp(rt);
}

int main()
{
	LL n,m,u,v;
	while(scanf("%lld%lld",&n,&m)!=EOF){
		memset(tree,0,sizeof tree);
		build(1,n,1);
		while(m--){
			scanf("%lld%lld",&u,&v);
			Update(u,v%kmod,1);
			printf("%lld\n",tree[1].sum);
		}
	}
return 0;
}
时间: 2025-01-11 19:10:24

hihocode 1116 计算 (线段树)的相关文章

hihoCoder - 1116 - 计算 (线段树)

计算 题目传送:#1116 : 计算 这里说下sum,pre,suf,ji数组的含义: sum:所求答案 pre:所有前缀积之和 suf:所有后缀积之和 ji:区间内所有数之积 以一个例子说明: 比如我们现在正在合并区间{3,4},{2,5} 而区间{3,4}所表示的 sum1=3 + 4 + 3 * 4 = 19 pre1 = 3 + 3 * 4 = 12 suf1 = 3 * 4 + 4 = 16 ji1 = 3 * 4 = 12 而区间{2,5} sum2 = 2 + 5 + 2 * 5

hihoCode 1078 : 线段树的区间修改

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段

HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 59891    Accepted Submission(s): 25331 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营 地,Derek和Tidy的任务

POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算

求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的,这样理论上是对的 要注意处理高度相同的线段,把底边优先处理(在代码里就是f标记为1的线段),因为若是一个矩形的底边和另一个矩形的上边重合,则这个轮廓肯定不能算 不过POJ和HDU的数据好像都比较弱,我没进行上面的细节处理也AC了,不过一个很简单的数据就会不对,所以还是要处理一下才是真正正确的代码 我

hdu 1116 敌兵布阵 线段树 区间求和 单点更新

线段树的基本知识可以先google一下,不是很难理解 线段树功能:update:单点增减 query:区间求和 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 using namespace std; const int MAXN = 50008; int sum[MAXN<<2]; void build(int l, int r, int rt)

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

[bzoj3932][CQOI2015]任务查询系统-题解[主席树][权值线段树]

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个 )的优先级之和是多少.特别的,如

51nod 1463 找朋友(线段树+离线处理)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1463 题意: 思路: 好题! 先对所有查询进行离线处理,按照右区间排序,因为k一共最多只有10个,所有在该区间内的B数组,每次枚举K值,通过这样的方式来得到另外一个B值.但是这样得到的B值它在B数组中的位置必须在当前数的左边.如下图:(j为当前数在B数组中的位置,pos为计算得到的另一个B值在数组中的位置) 这两个数的和记录在pos中,这里pos的位置必须在j的左边,假

BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3022 [题目大意] 给定n个球员,第i个球员年龄为AGEi,水平为SKILLi. 没有任何两个球员的水平相同.将这些球员按水平排序, 对于一次比赛,你需要选择若干个球员去比赛,但不能同时选择两个水平相邻的球员. m次询问,每次给定a和k,表示要在年龄不超过a的球员中选择不超过k个球员, 请计算skill和的最大值. [题解] 对于询问年龄的限制,我们可以通过扫描线来处理. 我们将所有