对于一个所选任务集合,如果对于任意时刻$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;
}

  

BZOJ4068 : [Ctsc2015]app的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  3. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  4. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  5. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  6. SQLSERVER走起 APP隆重推出

    SQLSERVER走起 APP隆重推出 为方便大家查看本微信公众以前推送的文章,QQ群里面的某位SQLSERVER重度爱好者开发了<SQLSERVER走起>的APP 以供大家一起交流 网页 ...

  7. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  8. 搞个这样的APP要多久?

    这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...

  9. app开发外包注意事项,2017最新资讯

    我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...

随机推荐

  1. Linux内核之数据双链表

    导读 Linux 内核中自己实现了双向链表,可以在 include/linux/list.h 找到定义.我们将会首先从双向链表数据结构开始介绍内核里的数据结构.为什么?因为它在内核里使用的很广泛,你只 ...

  2. 安装 openSUSE Leap 42.1 之后要做的 8 件事

    导读 openSUSE Leap 确实是个巨大的飞跃,它允许用户运行一个和 SUSE Linux 企业版拥有同样基因的发行版.和其它系统一样,为了实现最佳的使用效果,在使用它之前需要做些优化设置. 下 ...

  3. Unity3D Optimizing Graphics Performance for iOS

    原地址:http://blog.sina.com.cn/s/blog_72b936d801013ptr.html icense Comparisons http://unity3d.com/unity ...

  4. 将服务器上的myql数据库导入本地数据库

    文章是从我的个人博客上粘贴过来的, 大家也可以访问 www.iwangzheng.com 首先登录到服务器上,进入文件夹,我们这边的是m-cms $mysqldump -uroot mos > ...

  5. 通过IIS调试ASP.NET项目

    当我们使用Visual Studio调试的时候,通常我们会选择VS自带的ASP.NET Developerment Server(也是默认选项),当第一次调试的时候(按F5或Ctrl+F5不调试直接打 ...

  6. C# 浅谈接口的优势

    总结了一下接口的小优势,可以便于新手理解为什么要用接口,用接口有什么好处. 1.接口的定义: 关键字:interface,接口名一般大写I开头,接口中定义方法,但是不实现方法 interface IB ...

  7. 基础知识《五》---Java多线程的常见陷阱

    1.在构造函数中启动线程 我在很多代码中都看到这样的问题,在构造函数中启动一个线程,类似这样: public class A{ public A(){ this.x=1; this.y=2; this ...

  8. sqlite 使用记录

    2014年8月13日 18:20:52 SQLite中创建自增字段: 简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加. 从 SQLite 的 2.3.4 版本开始,如 ...

  9. Enum:Smallest Difference(POJ 2718)

    最小的差别 题目大意:输入一串数字,问你数字的组合方式,你可以随意用这些数字组合(无重复)来组合成一些整数(第一位不能为0),然后问你组合出来的整数的差最小是多少? 这一题可以用枚举的方法去做,这里我 ...

  10. DP:Sumsets(POJ 2229)

     数的集合问题 题目大意:给定你一个整数m,你只能用2的k次幂来组合这个数,问你有多少种组合方式? 这一题一看,天啦太简单了,完全背包?是不是? 不过的确这一题可以用完全背包来想,但是交题绝对是TLE ...