当前位置: 首页 > news >正文

[Luogu P3527BZOJ 2527][Poi2011]Meteors(整体二分+BIT)

Description

给定一个环,每个节点有一个所属国家,k次事件,每次对[l,r]区间上的每个点点权加上一个值,求每个国家最早多少次操作之后所有点的点权和能达到一个值

Solution

整体二分,维护一个区间修改单点查询的树状数组来统计mid次操作后每个国家收集到的陨石

要判定最后也收集不够的国家,可以加一场1-m大小为INF的流星雨,如果ans==k+1输出"NIE"

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define INF 0x3f3f3f3f
#define MAXN 300005
using namespace std;
typedef long long LL;
int n,m,k,p[MAXN],id[MAXN],t[MAXN];
int x[MAXN],y[MAXN],A[MAXN],ans[MAXN],T=0;
LL c[MAXN];
bool vis[MAXN];
vector<int>a[MAXN];
int read()
{
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';c=getchar();
    }
    return x*f;
}
int lowbit(int x){return x&-x;}
void add(int pos,int x)
{
    while(pos<=m)
    c[pos]+=x,pos+=lowbit(pos);
}
LL query(int pos)
{
    LL res=0;
    while(pos>0)
    res+=c[pos],pos-=lowbit(pos);
    return res;
}
void insert(int pos,int f)
{
    if(x[pos]<=y[pos])
    add(x[pos],f*A[pos]),add(y[pos]+1,-f*A[pos]);
    else
    add(1,f*A[pos]),add(y[pos]+1,-f*A[pos]),add(x[pos],f*A[pos]);
}
void solve(int l,int r,int L,int R)
{
    if(L>R)return; 
    if(l==r)
    {
        for(int i=L;i<=R;i++)ans[id[i]]=l;
        return;
    }
    int Mid=(l+r)>>1;
    while(T<Mid)++T,insert(T,1);
    while(T>Mid)insert(T,-1),--T;
    int cnt=0,idx;
    LL res;
    for(int i=L;i<=R;i++)
    {
        res=0,idx=id[i];
        for(int j=0;j<a[idx].size();j++)
        {
            res+=query(a[idx][j]);
            if(res>=p[idx])break;
        }
        if(res>=p[idx])vis[idx]=1,cnt++;
        else vis[idx]=0;
    }
    int j=L,k=L+cnt;
    for(int i=L;i<=R;i++)
    if(vis[id[i]])t[j++]=id[i];
    else t[k++]=id[i];
    for(int i=L;i<=R;i++)id[i]=t[i];
    solve(l,Mid,L,L+cnt-1);
    solve(Mid+1,r,L+cnt,R);
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++)
    {
        int o=read();
        a[o].push_back(i);
    }
    for(int i=1;i<=n;i++)p[i]=read(),id[i]=i;
    k=read();
    for(int i=1;i<=k;i++)
    x[i]=read(),y[i]=read(),A[i]=read();
    x[++k]=1,y[k]=m,A[k]=INF; 
    solve(1,k,1,n);
    for(int i=1;i<=n;i++)
    if(ans[i]==k)printf("NIE\n");
    else printf("%d\n",ans[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/Zars19/p/6896895.html

相关文章:

  • 自动化测试之Selenium API 的用法1
  • hdu 5093 二分匹配
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Spring Boot基础教程——web应用开发-模板引擎
  • APPium-python实例(记录)
  • SpringBoot(Security)
  • 初学Sockets编程(二) 关于名称和地址族
  • HDU - 1166 敌兵布阵
  • Flask+腾讯云windows主机快速搭建微信公众号接口
  • 一、简单工厂模式
  • 微软将所有的Windows代码库迁移到Git
  • magento megatron主题加入中文
  • 对象不支持“abigimage”属性或方法
  • Hyper-v创建检查点(VM的快照功能)
  • dede程序打开install安装时出现dir
  • 【Leetcode】101. 对称二叉树
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 07.Android之多媒体问题
  • 78. Subsets
  • java概述
  • Leetcode 27 Remove Element
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • REST架构的思考
  • 从零搭建Koa2 Server
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 让你的分享飞起来——极光推出社会化分享组件
  • 什么软件可以剪辑音乐?
  • 使用agvtool更改app version/build
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 用mpvue开发微信小程序
  • 优秀架构师必须掌握的架构思维
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 回归生活:清理微信公众号
  • 容器镜像
  • 数据库巡检项
  • (c语言)strcpy函数用法
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)c52学习之旅-流水LED灯
  • (一)基于IDEA的JAVA基础12
  • (转)视频码率,帧率和分辨率的联系与区别
  • ./configure,make,make install的作用
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net和php怎么连接,php和apache之间如何连接
  • .NET企业级应用架构设计系列之应用服务器
  • :“Failed to access IIS metabase”解决方法
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [20171101]rman to destination.txt
  • [BeginCTF]真龙之力