更新:

这是中文题目的链接:

http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=659&pid=1001

这道题还可以用优先队列来做,优先队列的特性可以很好的返回两个队列中b最小的值。

下面说过了,c[i] += c[i-1]是来获得前缀和。前面的节点没发功增加一次,就相当于b[i]-1,b[i]-c[i-1]的值,就是到达第i时间是,b[i]相对的减少量。我们设置两个队列,根据需要,将b[i]-c[i-1]的值分别放入不同的队列中,例如,当取到0组的数时,将该b[i]-c[i-1]放入0组队列,同时和1组队列的最小值比较,若1组较小,则去掉该元素,直到存在大的为止。

 #include<stdio.h>
#include<queue>
#include<string.h>
#define maxn 50005
using namespace std;
struct node1{
int num;
friend bool operator<(node1 a,node1 b){
return b.num < a.num;
}
};
struct node2{
int group;
int b;
};
node2 a[maxn];
int c[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(c,,sizeof(c));
priority_queue<node1>q[];
scanf("%d%d",&n,&m);
for(int i = ;i<=n;i++){
scanf("%d%d",&a[i].group,&a[i].b);
}
for(int i = ;i<m;i++){
int time;
scanf("%d",&time);
c[time]++;
}
int ans = n;
node1 cur;
for(int i = ;i<=n;i++){
c[i] += c[i-];
if(a[i].group){
cur.num = a[i].b-c[i-];
q[].push(cur);
while(!q[].empty()&&q[].top().num<cur.num){
q[].pop();
ans--;
}
}else{
cur.num = a[i].b-c[i-];
q[].push(cur);
while(!q[].empty()&&q[].top().num<cur.num){
q[].pop();
ans--;
}
}
}
printf("%d\n",ans);
}
return ;
}

——————————————————我是分割线————————————————————————————————

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=5596

这道题可以很巧妙的用O(n)的时间复杂度做出来的。首先,当我们用一个数组c存储gt发功的时间时,以该时间为下标之前的b值都会加1,所以可以用c[i] += c[i-1],以获得当前节点之前,已累计法功多少次了,然后c[y]-c[x](y>x)就是以x为下标的gt,到y时间时,通过发功增加的量。

至于为什么要倒着处理呢,因为我们是要去掉小的元素,这样,我们只要从后往前,保存最大的元素,只要存在小于最大元素的,该元素就可以去掉了。

还有,max0、max1分别是1组的最大值和0组的最大值,以gt[i].b-c[i-1]-max0这个式子为例,我们这里假设x<y,max0 = gt[y].b-c[y-1],所以前面那个式子就可以化成gt[x].b-c[x-1]-gt[y].b-c[y-1] = gt[x].b-gt[y].b+c[y-1]-c[x-1],由我们前面的推导,c[y-1]-c[x-1]就是gt[x].b增加的量,这个值加上gt[x].b,如果减去gt[y].b小于0的话,说明该gt是要去掉的,同时要更新max1的值,以为此时处理的是0组的情况,保存最大的。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 50005
#define inf 0x3f3f3f3f
using namespace std;
struct node{
int group;
int b;
};
node gt[maxn];
int c[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(c,,sizeof(c));
scanf("%d%d",&n,&m);
for(int i = ;i<=n;i++){
scanf("%d%d",&gt[i].group,&gt[i].b);
}
for(int i = ;i<=m;i++){
int temp;
scanf("%d",&temp);
c[temp]++;
}
for(int i = ;i<=n;i++){
c[i] += c[i-];
}
int ans = n;
int max0 = -inf,max1 = -inf;
for(int i = n;i>;i--){
if(gt[i].group){
if(gt[i].b-c[i-]-max0<)
ans--;
max1 = max(max1,gt[i].b-c[i-]);
}else{
if(gt[i].b-c[i-]-max1<)
ans--;
max0 = max(max0,gt[i].b-c[i-]);
}
}
printf("%d\n",ans);
}
return ;
}

---恢复内容结束---

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=5596

这道题可以很巧妙的用O(n)的时间复杂度做出来的。首先,当我们用一个数组c存储gt发功的时间时,以该时间为下标之前的b值都会加1,所以可以用c[i] += c[i-1],以获得当前节点之前,已累计法功多少次了,然后c[y]-c[x](y>x)就是以x为下标的gt,到y时间时,通过发功增加的量。

至于为什么要倒着处理呢,因为我们是要去掉小的元素,这样,我们只要从后往前,保存最大的元素,只要存在小于最大元素的,该元素就可以去掉了。

还有,max0、max1分别是1组的最大值和0组的最大值,以gt[i].b-c[i-1]-max0这个式子为例,我们这里假设x<y,max0 = gt[y].b-c[y-1],所以前面那个式子就可以化成gt[x].b-c[x-1]-gt[y].b-c[y-1] = gt[x].b-gt[y].b+c[y-1]-c[x-1],由我们前面的推导,c[y-1]-c[x-1]就是gt[x].b增加的量,这个值加上gt[x].b,如果减去gt[y].b小于0的话,说明该gt是要去掉的,同时要更新max1的值,以为此时处理的是0组的情况,保存最大的。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 50005
#define inf 0x3f3f3f3f
using namespace std;
struct node{
int group;
int b;
};
node gt[maxn];
int c[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(c,,sizeof(c));
scanf("%d%d",&n,&m);
for(int i = ;i<=n;i++){
scanf("%d%d",&gt[i].group,&gt[i].b);
}
for(int i = ;i<=m;i++){
int temp;
scanf("%d",&temp);
c[temp]++;
}
for(int i = ;i<=n;i++){
c[i] += c[i-];
}
int ans = n;
int max0 = -inf,max1 = -inf;
for(int i = n;i>;i--){
if(gt[i].group){
if(gt[i].b-c[i-]-max0<)
ans--;
max1 = max(max1,gt[i].b-c[i-]);
}else{
if(gt[i].b-c[i-]-max1<)
ans--;
max0 = max(max0,gt[i].b-c[i-]);
}
}
printf("%d\n",ans);
}
return ;
}

HDU 5596(更新,两种方法)的更多相关文章

  1. WPF多线程UI更新——两种方法

    WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  2. 代码操作Word时,目录自动更新的两种方法

    最近的项目中有一个功能点为:根据分析数据库并生成报告.不过不是大数据.数据挖掘之类,报告的内容.组织方式都是事先固定下来的.实现的方式为,在普通word文档中插入书签制成模板,然后程序使用OpenXM ...

  3. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  4. HDU 1160 排序或者通过最短路两种方法解决

    题目大意: 给定一堆点,具有x,y两个值 找到一组最多的序列,保证点由前到后,x严格上升,y严格下降,并把最大的数目和这一组根据点的编号输出来 这里用两种方法来求解: 1. 我们可以一开始就将数组根据 ...

  5. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  6. Response.Redirect 打开新窗体的两种方法

    普通情况下,Response.Redirect 方法是在server端进行转向,因此,除非使用 Response.Write("<script>window.location=' ...

  7. HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good(转)

    Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...

  8. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

  9. Response.Redirect 打开这两种方法的一种新形式

    在一般情况下.Response.Redirect 该方法是在server年底转向,因此,除非 Response.Write("<script>window.location='h ...

  10. 合并BIN文件的两种方法(转)

    源:http://blog.chinaunix.net/uid-20745340-id-1878803.html 合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一 ...

随机推荐

  1. java Base64算法的使用

    Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...

  2. Nginx系列3之Nginx+tomcat

    preface 公司部分应用跑得的tomcat,众所周知,tcomat高并发性能很弱,所以在处理静态请求的时候,我们就把他抛给Nginx处理,而Tomcat专门处理动态请求.所以在这里说说Nginx+ ...

  3. ng-controller event data

    $emit只能向parent controller传递event与data $broadcast只能向child controller传递event与data $on用于接收event与data 例子 ...

  4. java编程思想-java中的并发(一)

    一.基本的线程机制 并发编程使我们可以将程序划分为多个分离的.独立运行的任务.通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动. 线程模型为编程带来了便利,它简化了在单一程序中同时jia ...

  5. 如何保存联系人到系统通讯录(android)

    1 效果演示: 2 代码演示:

  6. SQL Server 2012 学习笔记3 增查改删

    现在举例几个"增查改删"的语句 select * from UserInfor --查找所有字段 select username,UserId from UserInfor -- ...

  7. 深入揭秘HTTPS安全问题&连接建立全过程

    作者:[已重置]链接:https://zhuanlan.zhihu.com/p/22142170来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作为开发者必备的网络安全 ...

  8. 任务二:1、选择器 2、连接集中状态的顺序 3、浮动的用发和原理 4、盒模型在IE和Google等不同浏览器的区别与联系

    1.选择器类型 标签选择器,类选择器,ID选择器,组合选择器,伪类和伪元素,属性选择器,子选择器,同胞选择器, :not()选择器 1.同胞选择器 相邻同胞标签: h2 + p{ color:red; ...

  9. jQuery实现表格行的动态增加与删除 序号 从 1开始排列

    <table id="tab" border="1" width="60%" align="center" sty ...

  10. Oracle - 数据库的实例、表空间、用户、表之间关系

    完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...