传送门


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

整体二分的过程中将时间在\([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;
}

最新文章

  1. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
  2. css文件 引用后不起作用
  3. web安全之sql注入联合查询
  4. 函数调用方式__stdcall、__cdel
  5. Linux jstack命令详解
  6. 南阳理工ACM——106背包问题
  7. highcharts 柱状图
  8. unity介绍
  9. setWillNotDraw和setFillViewport
  10. MVC验证13-2个属性至少输入一项
  11. json文件报expected name at 1 1错误
  12. sql存储过程——名称 ****不是有效的标识符
  13. 简单三段式状态机实验3-Sequence Detect(序列检测)
  14. java 的数据类型及其所占的字节数
  15. Solve Error: &quot;errcode&quot;: 48001, &quot;errmsg&quot;: &quot;api unauthorized hint&quot;
  16. Python练手例子(5)
  17. [转] 一张图理解prototype、proto和constructor的三角关系
  18. TCP连接数过多问题
  19. 如何修改 FastAdmin 弹窗大小?
  20. 【Error】:svnrdump: E130003: The XML response contains invalid XML

热门文章

  1. 【读书笔记】iOS-设计简单的Frenzic式益智游戏
  2. 导入数据到MongoDB中
  3. 接口自动化&#160;基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]
  4. idea 自动换行
  5. JavaScript大杂烩10 - 理解DOM
  6. eclipse下载教程
  7. 分享MYSQL中的各种高可用技术
  8. SOAP REST
  9. 【公众号系列】在SAP里查看条件记录的方法
  10. const int *p 和int * const p 的区别