传送门


比较板子的整体二分题目,时限有点紧注意常数

整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([mid+1,r]\)的询问中时间在\([l,mid]\)的流星操作的贡献

注意:可能存在某一段时间某一个国家的流星数量超过long long范围,应该当某个时候国家流星量和大于等于国家需求值时直接退出,这样可以避免这个问题。

#include<bits/stdc++.h>
#define INF 0x7fffffff
#define lowbit(x) ((x) & -(x))
using namespace std;

inline int read(){
    int a = 0;
    char c = getchar();
    while(!isdigit(c))
        c = getchar();
    while(isdigit(c)){
        a = a * 10 + c - 48;
        c = getchar();
    }
    return a;
}

const int MAXN = 3e5 + 10;
vector < int > bel[MAXN];
long long BIT[MAXN];
int qry[MAXN][2] , tp[2][MAXN][2] , mod[MAXN][3] , ans[MAXN];
int N , M , K;

inline void add(int p , int num){
    while(p <= M){
        BIT[p] += num;
        p += lowbit(p);
    }
}

inline long long get(int p){
    long long sum = 0;
    while(sum < 1e9 && p){
        sum += BIT[p];
        p -= lowbit(p);
    }
    return sum;
}

void solve(int ql , int qr , int l , int r){
    if(qr < ql)
        return;
    if(l == r){
        for(int i = ql ; i <= qr ; ++i)
            ans[qry[i][0]] = l;
        return;
    }
    int mid = (l + r) >> 1 , p0 = 0 , p1 = 0;
    for(int i = l ; i <= mid ; ++i){
        add(mod[i][1] + 1 , -mod[i][2]);
        add(mod[i][0] , mod[i][2]);
        if(mod[i][0] > mod[i][1])
            add(1 , mod[i][2]);
    }
    for(int i = ql ; i <= qr ; ++i){
        long long sum = 0;
        for(int j = 0 ; j < bel[qry[i][0]].size() && sum < qry[i][1] ; ++j)
            sum += get(bel[qry[i][0]][j]);
        if(sum >= qry[i][1]){
            tp[0][++p0][0] = qry[i][0];
            tp[0][p0][1] = qry[i][1];
        }
        else{
            tp[1][++p1][0] = qry[i][0];
            tp[1][p1][1] = qry[i][1] - sum;
        }
    }
    memcpy(qry + ql , tp[0] + 1 , sizeof(int) * p0 * 2);
    memcpy(qry + ql + p0 , tp[1] + 1 , sizeof(int) * p1 * 2);
    for(int i = l ; i <= mid ; ++i){
        add(mod[i][1] + 1 , mod[i][2]);
        add(mod[i][0] , -mod[i][2]);
        if(mod[i][0] > mod[i][1])
            add(1 , -mod[i][2]);
    }
    solve(ql , ql + p0 - 1 , l , mid);
    solve(ql + p0 , qr , mid + 1 , r);
}

signed main(){
    N = read();
    M = read();
    for(int i = 1 ; i <= M ; ++i)
        bel[read()].push_back(i);
    for(int i = 1 ; i <= N ; ++i){
        qry[i][0] = i;
        qry[i][1] = read();
    }
    K = read();
    for(int i = 1 ; i <= K ; ++i){
        mod[i][0] = read();
        mod[i][1] = read();
        mod[i][2] = read();
    }
    solve(1 , N , 1 , K + 1);
    for(int i = 1 ; i <= N ; ++i)
        if(ans[i] == K + 1)
            puts("NIE");
        else
            printf("%d\n" , ans[i]);
    return 0;
}

Luogu3527 POI2011 Meteors 整体二分、树状数组、差分的更多相关文章

  1. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  2. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  3. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

  4. BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)

    整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...

  5. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  6. bzoj 2527 Meteors - 整体二分 - 树状数组

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  7. BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)

    题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...

  8. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  9. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  10. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

随机推荐

  1. 关于input的焦点事件

    关于input的焦点事件 $(".scanf_integral").focus(function(){//获取焦点//获取焦点后触发的事件 }) $(".scanf_in ...

  2. python自动化报告的输出

    1.设计简单的用例 2.设计用例 以TestBaiduLinks.py命名 # coding:utf-8 from selenium import webdriver import unittest ...

  3. Linux常用命令大全(新手入门)

    系统信息:  arch 显示机器的处理器架构(1)  uname -m 显示机器的处理器架构(2)  uname -r 显示正在使用的内核版本  dmidecode -q 显示硬件系统部件 - (SM ...

  4. oracle 日期格式化 TO_CHAR (datetime) 修饰语和后缀

    Datetime Format Element Suffixes Suffix Meaning Example Element Example Value TH Ordinal Number DDTH ...

  5. RD340服务器安装windows2003系统

    RD340服务器安装windows2003系统云修网

  6. January 14th, 2018 Week 02nd Sunday

    Embrace your life, for we only live once. 拥抱你的生活,因为我们只能活一次. We just live once, so I would rather liv ...

  7. Alpha冲刺! Day8 - 砍柴

    Alpha冲刺! Day8 - 砍柴 今日已完成 晨瑶:写了部分gitkraken团队协作教程:讨论关于继承baseActivity因为需要参数无法通过override去实现函数,并且initData ...

  8. arcgis api for javascript中使用proxy.jsp

    当我们使用arcgis api for javascript 查询arcgis服务时,如果查询的参数很长时,通过get方式提交会查询不到结果,因为get方式提交的参数有长度限制,需要通过代理的方式使用 ...

  9. Codeforces gym 101343 A. On The Way to Lucky Plaza【概率+逆元+精度问题】

     2017 JUST Programming Contest 2.0 题目链接:http://codeforces.com/gym/101343/problem/A A. On The Way to ...

  10. socket 总结

    网络编程之进程:http://www.cnblogs.com/1a2a/p/7428759.html 网络编程之进阶:http://www.cnblogs.com/1a2a/p/7444446.htm ...