对于一个所选任务集合,如果对于任意时刻$i$,$i$前面所选任务数都不超过i的话,那么这些任务可以全选。

维护一棵线段树$T$,第$i$个位置一开始为$i$,每使用一个任务,$[t,T]$都要减$1$。

插入一个任务:

首先查询$[t,T]$的区间内第一个$0$的位置,记为$k$。

如果没有$0$,那么可以直接加入这个任务。

否则要么不用这个任务,要么拿这个任务去替换$t$在$[1,k]$里价值最小的任务。

删除一个任务:

如果没有使用,那么直接删除。

否则$[t,T]$都要加$1$,然后找到最后一个$0$的位置$k$。

那么要在备用任务集合中取出$t$在$[k+1,T]$里价值最大的任务,加入答案。

于是再按$t$用两棵线段树分别维护两个集合即可。

时间复杂度$O(Q\log T)$。

#include<cstdio>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
typedef pair<int,int>P;
const int N=300010,M=1050000;
int n,m,x,y,z,g[N],nxt[N],ed,cnt;char ch;long long ans;map<P,int>id;
struct E{int t,p,u;E(){}E(int _t,int _p){t=_t,p=_p,u=0;}}e[N];
inline int getid(int x,int y){int t=id[P(x,y)],p=g[t];g[t]=nxt[g[t]];return p;
}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int v[M],tag[M];
inline void add1(int x,int p){v[x]+=p,tag[x]+=p;}
inline void pb(int x){if(tag[x])add1(x<<1,tag[x]),add1(x<<1|1,tag[x]),tag[x]=0;}
inline void up(int x){v[x]=min(v[x<<1],v[x<<1|1]);}
void build(int x,int a,int b){v[x]=a;if(a==b)return;int mid=(a+b)>>1;build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
void add(int x,int a,int b,int c,int d,int p){if(c<=a&&b<=d){add1(x,p);return;}pb(x);int mid=(a+b)>>1;if(c<=mid)add(x<<1,a,mid,c,d,p);if(d>mid)add(x<<1|1,mid+1,b,c,d,p);up(x);
}
int left(int x,int a,int b,int c,int d){if(v[x])return 0;if(a==b)return a;pb(x);int mid=(a+b)>>1,t=0;if(c<=mid)t=left(x<<1,a,mid,c,d);if(!t&&d>mid)t=left(x<<1|1,mid+1,b,c,d);up(x);return t;
}
int right(int x,int a,int b,int c,int d){if(v[x])return 0;if(a==b)return a;pb(x);int mid=(a+b)>>1,t=0;if(d>mid)t=right(x<<1|1,mid+1,b,c,d);if(!t&&c<=mid)t=right(x<<1,a,mid,c,d);up(x);return t;
}
struct SegmentTree{
set<P>A[N];int cnt[N],mi[M],ma[M];
inline int umax(int a,int b){if(!a)return b;if(!b)return a;return e[a].p>e[b].p?a:b;
}
inline int umin(int a,int b){if(!a)return b;if(!b)return a;return e[a].p<e[b].p?a:b;
}
void add(int x,int a,int b,int c,int p){if(a==b){cnt[a]++;A[a].insert(P(e[p].p,p));mi[x]=A[a].begin()->second;ma[x]=A[a].rbegin()->second;return;}int mid=(a+b)>>1;if(c<=mid)add(x<<1,a,mid,c,p);else add(x<<1|1,mid+1,b,c,p);mi[x]=umin(mi[x<<1],mi[x<<1|1]);ma[x]=umax(ma[x<<1],ma[x<<1|1]);
}
void del(int x,int a,int b,int c,int p){if(a==b){cnt[a]--;A[a].erase(P(e[p].p,p));if(cnt[a]){mi[x]=A[a].begin()->second;ma[x]=A[a].rbegin()->second;}else mi[x]=ma[x]=0;return;}int mid=(a+b)>>1;if(c<=mid)del(x<<1,a,mid,c,p);else del(x<<1|1,mid+1,b,c,p);mi[x]=umin(mi[x<<1],mi[x<<1|1]);ma[x]=umax(ma[x<<1],ma[x<<1|1]);
}
int askmin(int x,int a,int b,int c,int d){if(c<=a&&b<=d)return mi[x];int mid=(a+b)>>1,t=0;if(c<=mid)t=askmin(x<<1,a,mid,c,d);if(d>mid)t=umin(t,askmin(x<<1|1,mid+1,b,c,d));return t;
}
int askmax(int x,int a,int b,int c,int d){if(c<=a&&b<=d)return ma[x];int mid=(a+b)>>1,t=0;if(c<=mid)t=askmax(x<<1,a,mid,c,d);if(d>mid)t=umax(t,askmax(x<<1|1,mid+1,b,c,d));return t;
}
}T1,T2;
inline void addtask(int x){int t=e[x].t,k=left(1,1,n,t,n);if(!k){add(1,1,n,t,n,-1);T1.add(1,1,n,t,x);e[x].u=1;ans+=e[x].p;}else{int y=T1.askmin(1,1,n,1,k);if(e[y].p<e[x].p){add(1,1,n,e[y].t,n,1);T1.del(1,1,n,e[y].t,y);T2.add(1,1,n,e[y].t,y);e[y].u=0;add(1,1,n,t,n,-1);T1.add(1,1,n,t,x);e[x].u=1;ans+=e[x].p-e[y].p;}else T2.add(1,1,n,t,x);}
}
inline void deltask(int x){if(!e[x].u)T2.del(1,1,n,e[x].t,x);else{ans-=e[x].p;add(1,1,n,e[x].t,n,1);T1.del(1,1,n,e[x].t,x);int k=right(1,1,n,1,n),y=T2.askmax(1,1,n,k+1,n);if(y){add(1,1,n,e[y].t,n,-1);T2.del(1,1,n,e[y].t,y);T1.add(1,1,n,e[y].t,y);e[y].u=1;ans+=e[y].p;}}
}
int main(){read(n),read(m),build(1,1,n);while(m--){while((ch=getchar())!='A'&&ch!='D');read(x),read(y);if(ch=='A'){e[++ed]=E(x,y);if(!id[P(x,y)])z=id[P(x,y)]=++cnt;else z=id[P(x,y)];nxt[ed]=g[z],g[z]=ed;addtask(ed);}else deltask(getid(x,y));printf("%lld\n",ans);}return 0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/5170412.html

BZOJ4068 : [Ctsc2015]app相关推荐

  1. 听课整理--whx_day3~day4(天坑)

    武爷爷太强了,讲的课信息量大的可以,而且因为时间原因不很详细(当然自己菜是原罪),姑且整理一下这两天的内容 DAY1 分布式计算(?) 应该是一种拆式子让互不干扰的技巧,是借了点思想吧(大概) 题目有 ...

  2. 对于有关东方的题目的整理。。

    东方赛高 此为总贴 收录以东方project为背景的题目. 模拟赛套题...(25道)无数据,有题面:二次联通门 1. luogu P3345 [ZJOI2015]幻想乡战略游戏 动态点分治(暴力水过 ...

  3. app如何打开了request url_手机日历app内如何打开节日提醒功能?支持提前提醒节日的云便签...

    我们一年中要度过的节日有很多,除了法定节假日之外,还有其他的很多节日,例如西方传来的圣诞节.万圣节,国际性的节日例如父亲节.母亲节等,还有一些传统节日例如小寒.冬至.腊八等,这些都是不放假的. 有时候 ...

  4. 基于Android和SpringBoot的购物App

    (Shopping)购物应用商城 本软件使用Android和SpringBoot.JavaWeb技术实现:并结合百度LBS平台的SDK.支付宝App支付客户端SDK.MobTech的ShareSDK: ...

  5. Xcode couldn‘t find any iOS App Development provisioning profiles matching ‘com.example.***‘

    在更新完iOS14.3后,Xcode真机调试时报错,无法进行真机测试: 报以下错误: No profiles for 'com.example.software.Login' were found: ...

  6. App性能分析数据监控

    App性能分析数据监控 APP的性能监控包括: CPU 占用率.内存使用情况.网络状况监控.启动时闪退.卡顿.FPS.使用时崩溃.耗电量监控.流量监控等等. 文中所有代码都已同步到github中,有兴 ...

  7. Docker App应用

    Docker App应用 这是一个实验特性. 实验性功能提供了对未来产品功能的早期访问.这些特性仅用于测试和反馈,因为它们可能在没有警告的情况下在不同版本之间更改,或者可以从将来的版本中完全删除.在生 ...

  8. Android App的启动过程

    1.点击桌面App图标时,Launcher的startActivity()方法,通过Binder通信,调用SystemServer进程中AMS服务的startActivity方法,发起启动请求 2.S ...

  9. python 爬取手机app的信息

    我们在爬取手机APP上面的数据的时候,都会借助Fidder来爬取.今天就教大家如何爬取手机APP上面的数据. Python学习资料或者需要代码.视频加Python学习群:516107834 环境配置 ...

最新文章

  1. 自定义窗体设计器-控件测试
  2. java实现逾期提醒_信用卡逾期后的5个阶段 你都知道吗?
  3. 技术宅的乐趣!网友编写出《流浪地球》“春节十二响”C语言源码
  4. 用Navicat for Mysql导入.sql文件
  5. webstorm运行的端口在哪看_webstorm(10.0.2)的端口号修改
  6. 官方教程:Apache Kylin和Superset集成,使用开源组件,完美打造OLAP系统
  7. 获取高德地图POI数据
  8. 有关计算机组成原理知识的论文,计算机组成原理课程相关论文
  9. SwitchHosts-一款实用的host地址切换工具
  10. 民情二维码:居民诉求一个码收集
  11. 微型计算机三部分基本组成,微型计算机的基本组成-电脑自学网
  12. Qt创建桌面快捷方式
  13. pycharm双击打不开,无响应,下列第二种方法我亲测有效
  14. 在智能家居音箱领域上的音频功放芯片IC
  15. android https cer证书转换BKS
  16. 掘金chrome插件安装失败怎么办?
  17. 面试云计算工程师岗位经常被问到的40个问题
  18. 数据增强——对文件夹中的图片进行读取、数据增强,保存操作
  19. 英语发音规则---V字母
  20. GDPR: Impact to Your Data Management Landscape: Part 1

热门文章

  1. 洛谷P2347 砝码称重 某一年noip提高组原题
  2. mysql 5.6 binlog组提交
  3. Win10 IIS本地部署网站运行时图片和样式不正常?
  4. Linux下Chromium使用flash的办法
  5. 陶哲轩实分析 定理 13.1.5
  6. DAL调用SP时出现的异常处理
  7. java bean转map
  8. PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilder
  9. ubuntu18.04安装mysql数据库
  10. python xgboost安装_win7 64 python2 xgboost安装