传送门


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

整体二分的过程中将时间在\([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. call/apply以及this指向的理解

    javascript是面向对象的语言,Function也是一种对象,有自己的属性和方法.call和apply就是js函数自带方法,挂在Fucntion.prototype上. 一般调用某函数时,直接“ ...

  2. web测试之界面测试

    所谓界面测试就是指,布局是否合理.整体风格是否一致.各个控件的放置位置是否符合客户使用习惯,此外还要测试界面操作便捷性.导航简单易懂性,页面元素的可用性,界面中文字是否正确,命名是否统一,页面是否美观 ...

  3. 2.网络编程-udp

    # 使用套接字发送udp数据import socket s = socket.socket(socket.AF_INET, SOCK_DGRAM) s.sendto(b"hello" ...

  4. mybatis学习系列--逆向工程简单使用及mybatis原理

    2逆向工程简单测试(68-70) SqlSessionFactory sqlSessionFactory=getSqlSessionFactory(); SqlSession session = sq ...

  5. [20170615]执行dbms_sqldiag.dump_trace看执行计划.txt

    [20170615]执行dbms_sqldiag.dump_trace看执行计划.txt --//上午在想查看10053执行计划时使用包时出现如下提示: SCOTT@book> @ &r ...

  6. 洗礼灵魂,修炼python(53)--爬虫篇—urllib模块

    urllib 1.简介: urllib 模块是python的最基础的爬虫模块,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如 ...

  7. Python3 下实现 腾讯人工智能API 调用

    1.背景 a.鹅厂近期发布了自己的人工智能 api,包括身份证ocr.名片ocr.文本分析等一堆API,因为前期项目用到图形OCR,遂实现试用了一下,发现准确率还不错,放出来给大家共享一下. b.基于 ...

  8. cx_Oracle读取Oracle数据库中文乱码问题解决

    在使用cx_Oracle模块读取Oracle数据库中的中文记录时,返回值皆为?,后google得此佳文,遂问题得以解决,特此记之. Oracle数据库版本是10g,字符集是AL32UTF8. 编写的p ...

  9. JQuery 获取多个select标签option的text内容

    根据option的id属性,修改text值 $("#sel_div .select_class option[id='-选择省-']").text(data.province).a ...

  10. 阿里八八β阶段Scrum(1/5)

    今日进度 叶文滔: 修改了α阶段遗留的部分界面BUG,比如状态栏白底等 张岳: 修复用户模块信息修改返回失败的BUG 林炜鸿: 重构了添加事件的代码,增加可修改的特性 黄梅玲: 绘制了新的日程显示格界 ...