BestCoder Round #16 Revenge of Segment Tree (树状数组)

今天第一次参加bc,虽然由于运动会耽误了时间,但还是开始做了题目。

第一道题恰巧是最近做的树状数组类型,nlogn 复杂度。规律推算很简单。一个长度的区间累加过程中会消掉中间部分,区间长度的改变会导致减掉加上的部分改变。减掉的是最前面k-1,加上后面n-k+1个

第二题一直没很好明白题意,虽然认为不难。

起初没有用long long 溢出了两次,o(︶︿︶)o 唉   以后看到取模之类的直接ll

#include<cstdio>
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<iterator>
using namespace std;
typedef __int64 ll;
#define N 10+447000
#define max(a,b) ((a)>(b)?(a):(b))
#define lowbit(x) (-x)&x
#define MOD 1000000007
int n,m;
ll a[N];
void update(int l,int n)
{
    while(l<N)
    {
        a[l]=(a[l]+n)%MOD;
        l+=lowbit(l);
    }
}
ll sum(int l)
{
    ll ans=0;
    while(l>0)
    {
        ans=(a[l]+ans)%MOD;
        l-=lowbit(l);
    }
    return ans;
}
int main()
{
    int i,k;
    int T;

    //freopen("in.txt","r",stdin);
    while(~scanf("%d", &T))while(T--)
    {
        memset(a,0,sizeof(a));
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&k);
            update(i,k);
        }
        ll ans=0;
        ll sub=0;
        ll add=0;
        for(k=1;k<=n;k++)
        {
            sub=(sum(k-1)+sub)%MOD;
            add=(sum(n-k+1)+add)%MOD;
            ans=(add-sub+ans+MOD)%MOD;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}
时间: 2024-10-05 23:51:21

BestCoder Round #16 Revenge of Segment Tree (树状数组)的相关文章

HDU5465/BestCoder Round #56 (div.2) 二维树状数组

Clarke and puzzle 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一个数c_{i, j}c?i,j??. aa想开挂,想知道如何打败bb. 他们要玩qq次游戏,每一次做一次操作: 1. 取出当中的一个子矩阵(x_1, y_1)-(x_2, y_2)(x?1??,y?1??)−(x?2??,y?2??)玩游戏.两个人轮流行动,每一次只能从这个子矩阵中的一个方格c_{i, j}c?i,j??中减

HDU 3333 Turing Tree 树状数组 离线查询

题意: 给你一个数列,然后有n个查询,问你给定区间中不同数字的和是多少. 思路还是比较难想的,起码对于蒟蒻我来说. 将区间按照先右端点,后左端点从小到大排序之后,对于每个查询,我只要维护每个数字出现的最后一次就可以了(这个结论稍微想一下就可以证明是正确的). 然后就是简单的点更新,区间求和问题了- #include <cstdio> #include <cstring> #include <iostream> #include <map> #include

codeforces round 512 F. Putting Boxes Together 树状数组维护区间加权平均数

F. Putting Boxes Together time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output There is an infinite line consisting of cells. There are nn boxes in some cells of this line. The ii-th box stan

HDOJ 5372 Segment Game 树状数组+离散化

因为这题的线段长度是递增的....所以: 题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端点. 再查询有多少个线段的右端点大于该线段右端点, 两者之差就是答案.用两个树状数组搞定.时间复杂度nlog Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 975    Accepted Submiss

HDU 5372 Segment Game 树状数组

链接 Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 273    Accepted Submission(s): 48 Problem Description Lillian is a clever girl so that she has lots of fans and often receives gi

HDU 3333 Turing Tree (树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4 #include <cstdlib> 5 #include <cstrin

hdu 3333 Turing Tree (树状数组+离线处理+离散化)

Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3981    Accepted Submission(s): 1349 Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems a

POJ 3321 Apple Tree (树状数组)

Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21191   Accepted: 6436 Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been

Binary Indexted Tree 树状数组入门

感谢http://www.cnblogs.com/xudong-bupt/p/3484080.html 树状数组(BIT)是能够完成下述操作的数据结构: 给定一初始值全为零的数列a1,a2a,a3...,an 1.给定i,计算a1+a2+...+ai 2.给定i和x,执行ai+=x BIT的结构: 数组bit[N] bit[1]=C1=A1;bit[2]=C2=C1+A2; BIT就是使用数组来维护上面所说的部分和 以1结尾的1,3,5,7长度为1 以1个0结尾的2,6长度为2 以两个0结尾的4