BZOJ4068 : [Ctsc2015]app

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Log4j配置文件

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的&#xff0c;它可接keyvalue格式的设置或xml格式的设置信息。通过配置&#xff0c;可以创建出Log4J的运行环境。 配置文件 Log4J配置文件的基本格式如下&#xff1a; #配置根Logger log4j.rootLog…

LeetCode 2226. 每个小孩最多能分到多少糖果(二分查找)

文章目录1. 题目2. 解题1. 题目 给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 &#xff0c;但 无法 再将两堆合并到一起。 另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩&am…

指令系统——数据寻址(3)——堆栈寻址(详解)

一、总览 二、堆栈寻址 堆栈寻址&#xff1a;操作数存放在堆栈中&#xff0c;隐含使用堆栈指针&#xff08;SP&#xff09;作为操作数地址。堆栈是存储器&#xff08;或专用寄存器组&#xff09;中一块特定的按“后进先出&#xff08;LIFO&#xff09;” 原则管理的存储区&…

POJ1061 青蛙的约会(线性同余方程)

线性同余方程$ ax \equiv b \pmod n$可以用扩展欧几里得算法求解。 这一题假设青蛙们跳t次后相遇&#xff0c;则可列方程&#xff1a; $$ MtX \equiv NtY \pmod L$$ $$ (M-N)t \equiv Y-X \pmod L$$ 于是就构造出一个线性同余方程&#xff0c;即可对t求解&#xff0c;解出最小非…

指令系统 CISC和RISC(详解)

一、总览 二、CISC CISC:Complex Instruction Set Computer设计思路&#xff1a;一条指令完成一个复杂的基本功能。代表&#xff1a;86架构&#xff0c;主要用于笔记本、台式机等。 80-20规律&#xff1a;典型程序中80%的语句仅仅使用处理机中20%的指令 三、RISC RISC:Reduc…

LeetCode 2231. 按奇偶性交换后的最大数字

文章目录1. 题目2. 解题1. 题目 给你一个正整数 num 。你可以交换 num 中 奇偶性 相同的任意两位数字&#xff08;即&#xff0c;都是奇数或者偶数&#xff09;。 返回交换 任意 次之后 num 的 最大 可能值。 示例 1&#xff1a; 输入&#xff1a;num 1234 输出&#xff1a…

亲密接触Redis-第一天

引言nosql&#xff0c;大规模分布式缓存遍天下&#xff0c;Internet的时代在中国由其走得前沿&#xff0c;这一切归功于我国特色的电商。因此nosql、大数据技术在中国应用的比国外还要前沿。从这一章开始我们将开始进入到真正的SOA、PAAS、SAAS、互联网的领域&#xff0c;因此每…

Ajax 编程基础(一)

一、Ajax 基础 传统网站中存在的问题&#xff1a; 网速慢的情况下&#xff0c;页面加载时间长&#xff0c;用户只能等待表单提交后&#xff0c;如果一项内容不合格&#xff0c;需要重新填写所有表单内容页面跳转&#xff0c;重新加载页面&#xff0c;造成资源浪费&#xff0c…

读 大数据 有感

Form--> 大数据:正在到来的数据革命,以及它如何改变政府、商业与我们的生活 平装 – 2013年4月1日 涂子沛 (作者) 最小数据集(Minimum Data Set,MDS)最小数据集的概念起源于美国的医疗领域,用来统一医疗账单.最小数据集是指通过收集最少的数据,最好地掌握一个研究对象所具有…

LeetCode 2232. 向表达式添加括号后的最小结果

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 expression &#xff0c;格式为 "<num1><num2>" &#xff0c;其中 <num1> 和 <num2> 表示正整数。 请你向 expression 中添加一对括号&#xff0c;使得在添加之后&#xff0…

一、服务端开发基础(搭建Web服务器、网络基础概念、请求响应流程、配置Apache、静态网站与动态网站)

一、建立你的第一个网站&#xff08;目标&#xff09; 前端开发 最终还是属于 Web 开发 中的一个分支&#xff0c;想要成为一名合格的前端开发人员&#xff0c;就必须要 充分理解Web 的概念。 构建一个专业的网站是一项巨大的工作&#xff01;对于新手我们应该从小事做起&#…

新年初六

儿子回老家第一天&#xff0c;生活变得很不规律&#xff0c;晚上刷夜看电影&#xff0c;早上睡到自然醒&#xff0c;小美明天开始上班&#xff0c;今天还能陪她放松一天&#xff0c;明天一个人在家休息一天之后初八开启新的工作模式。 全天宅在家里&#xff0c;正好把爸妈积攒…

LeetCode 2233. K 次增加后的最大乘积(优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个非负整数数组 nums 和一个整数 k 。每次操作&#xff0c;你可以选择 nums 中 任一 元素并将它 增加 1 。 请你返回 至多 k 次操作后&#xff0c;能得到的 nums的 最大乘积 。由于答案可能很大&#xff0c;请你将答案对 10^9 7 取余后…

Packet Tracer 5.0 建构 CCNA 实验攻略——配置单区域 OSPF

一、拓扑结构如下&#xff1a; 二、分别为PC0、PC1配置IP地址&#xff0c;子网掩码和默认网关。 三、分别为路由器0、路由器1和路由器2各个接口配置IP地址和子网掩码&#xff0c;并将路由器的开关打开。 注意&#xff1a;可以通过命令show ip route 来查看路由表信息 路由器1和…

NSBundle

bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBundle. 1、获取bundle (NSBundle *)mainBundle; //app的目录 NSBundle *file [NSBundle mainBundle]; NSLog(&…

Packet Tracer 5.0 建构 CCNA 实验攻略——路由器实现 Vlan 间通信

一、网络拓扑结构如下&#xff1a; 二、为六台PC分别配置IP地址、子网掩码和默认网关 其余五台PC的配置与上图类似。 三、为路由器0创建g0/0.1逻辑子接口和g0/0.2逻辑子接口&#xff0c;并 设置g0/0.1逻辑子接口可以接受VLAN id 为10的802.1q帧&#xff0c;并且可将IP数据报封…

9.ARM寻址方式

9.ARM寻址方式 1.立即数寻址 立即数寻址&#xff0c;是一种特殊的寻址方式&#xff0c;操作数本身就是在指令中给出。只有取出指令就取到了操作数。这个操作数就称为立即数&#xff0c;对应的寻址方式就是立即数寻址方式。例如&#xff1a; ADD R0,R1,#0X45;这汇编的意思&…

LeetCode LCP 51. 烹饪料理(状态枚举)

文章目录1. 题目2. 解题1. 题目 欢迎各位勇者来到力扣城&#xff0c;城内设有烹饪锅供勇者制作料理&#xff0c;为自己恢复状态。 勇者背包内共有编号为 0 ~ 4 的五种食材&#xff0c;其中 meterials[j] 表示第 j 种食材的数量。 通过这些食材可以制作若干料理&#xff0c;co…

Packet Tracer实验——使用三层交换机实现vlan间的通信(详解)

一、网络拓扑结构如下 实验目的&#xff1a;通过划分vlan实现了隔离广播域&#xff0c;同时还能实现vlan间的单播通信 二、为6台PC配置IP地址、子网掩码和默认网关 三、分别为2个vlan接口配置ip地址和子网掩码 四、为vlan10、vlan20分配ip地址和子网掩码&#xff0c;并命名为…

git 发布android 系统版本 修改版本型号 查看指定文件的修改记录

修改系统版本型号 pizza/build/tools/buildinfo.sh ro.build.bootdisplay.id device/rockchip/rk30sdk/rk30sdk.mk PRODUCT_MODEL : 查看指定文件的修改 git log --prettyoneline rk30sdk.mk 或者直接 git log 文件名 &#xff08;如git log PhoneWindowManager.java) git show…