BZOJ 3922 Karin的弹幕

400题留念。

话说这题真是的。。。浪费表情。

算了一下复杂度最好的都要n√nlogn啊。。。这个7w闹哪样。

然而看了一眼题解,按5分。

wtf我还以为有高论啊。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 70050
using namespace std;
int n,m,a[maxn],tab[maxn][6],bel[maxn][6],root[6],ls[maxn<<5],rs[maxn<<5],mx[maxn<<5],tot=0;
int type,x,y;
void build(int &now,int left,int right,int type)
{
    now=++tot;
    if (left==right) {mx[now]=a[bel[left][type]];return;}
    int mid=(left+right)>>1;
    build(ls[now],left,mid,type);
    build(rs[now],mid+1,right,type);
    mx[now]=max(mx[ls[now]],mx[rs[now]]);
}
void modify(int now,int left,int right,int pos,int val)
{
    if (left==right) {mx[now]=val;return;}
    int mid=(left+right)>>1;
    if (pos<=mid) modify(ls[now],left,mid,pos,val);
    else modify(rs[now],mid+1,right,pos,val);
    mx[now]=max(mx[ls[now]],mx[rs[now]]);
}
int ask(int now,int left,int right,int l,int r)
{
    if ((left==l) && (right==r)) return mx[now];
    int mid=(left+right)>>1;
    if (r<=mid) return ask(ls[now],left,mid,l,r);
    else if (l>=mid+1) return ask(rs[now],mid+1,right,l,r);
    else return max(ask(ls[now],left,mid,l,mid),ask(rs[now],mid+1,right,mid+1,r));
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    for (int i=1;i<=5;i++)
    {
        int tot=0;
        for (int j=1;j<=i;j++)
        {
            int now=j;tot++;tab[now][i]=tot;bel[tot][i]=now;
            while (now+i<=n)
            {
                now+=i;tot++;
                tab[now][i]=tot;bel[tot][i]=now;
            }
        }
    }
    for (int i=1;i<=5;i++) build(root[i],1,n,i);
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&type,&x,&y);
        if (!type)
        {
            a[x]+=y;
            for (int j=1;j<=5;j++) modify(root[j],1,n,tab[x][j],a[x]);
        }
        else
        {
            if (y<=5)
            {
                int now=n;
                while (now%y!=x%y) now--;
                printf("%d\n",ask(root[y],1,n,tab[x][y],tab[now][y]));
            }
            else
            {
                int ans=a[x];
                while (x+y<=n) {x+=y;ans=max(ans,a[x]);}
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}
时间: 2024-10-10 14:43:58

BZOJ 3922 Karin的弹幕的相关文章

BZOJ 3922 Karin的弹幕 线段树

题目大意 给出一个序列,支持单点修改,每次查询一个位置成等差数列中所有数的最大值. 思路 等差数列如果公差很大的话,那么整个数列中的数并不会很多:但是如果公差很小,我们就可以用线段树来乱搞.具体方法是对于每个公差维护一个线段树,按照对这个公差取模的值来进行划分.这样询问的时候就在一块了. 具体看代码. CODE #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <iost

【线段树】bzoj3922 Karin的弹幕

设置一个值K. d<=K:建立多组线段树:d>K:暴力. 最优时间复杂度的伪计算: O(n*K*logn(建树)+m*logn(询问类型1)+m*n/K(询问类型2)+m*K*logn(修改)). 求此函数最小值,易得,当K=sqrt(m/logn)时, 时间复杂度:O(m*sqrt(m*logn)). 空间复杂度:O(n*sqrt(m/logn)). 当然,这个计算显然不完全合理,而且,由于使用STL的vector的原因,导致实际建树要慢得多,因此K取得小一些更加合适(跑几组数据自己看看就行

【BZOJ3922】Karin的弹幕 线段树&amp;暴力

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44978599"); } 题解: 我们对每个等差数列维护一棵线段树. 比如等差为 5 , n 为 17 ,则线段树内节点顺序为: 1,6,11,16,2,7,12,17,3,8,13,4,9,14,5,10,15. 然后查询的时候到对

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

jQuery实现评论弹幕、弹幕漂浮、滚动代码

1.html代码和jquery代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>document</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&g

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列