更新:

这是中文题目的链接:

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. jQuery知识点总结(第四天)

    前三天是jQuery的基础部分,选择器学好了.才能进行下一步的操作,如果前三天没学过没学好,不要跳着学.粗俗的话叫做,步子大了,容易扯着蛋.一步一个脚印,是最好的方式. 强调一下.有问题,不要憋着不讲 ...

  2. OpenGLES入门笔记二

    #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> #import <OpenGLES/ES2/gl.h& ...

  3. BZOJ1691: [Usaco2007 Dec]挑剔的美食家

    传送门: 一句话题解:贪心+treap 好几天前刚学的treap,然后真到了考treap又写不出来,这么辣鸡还搞什么OI 先按$A_i$递减排序,然后把$C_i$也递减排序,然后用一个指针指向$M$序 ...

  4. mysql_query()与mysql_real_query()

    mysql_query() cannot be used ” character, which mysql_query() interprets as the end of the statement ...

  5. Android学习笔记——TableLayout

    该工程的功能是实现在一个activity中显示一个表格 以下代码是MainActivity.java中的代码 package com.example.tablelayout; import andro ...

  6. 关于敏捷开发方法(Agile Software Development)的阅读笔记

    对“敏捷开发”(Agile Software Development)这个词,我是在这学期邹欣老师<现代程序设计>课上第一次听到的,刚听到时并不知道其具体指什么,只是从字面上直觉其意思应该 ...

  7. JavaScript 的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  8. js获取某个ID的class名称

    .HTML结构 <div id = "test" class="test_class">我的类名为test_class</div> &l ...

  9. Fork函数初识

    fork函数用于创建子进程,典型的调用一次,返回两次的函数.其中调用进程返回子进程的PID,而子进程则返回0.但是两个进程的执行顺序是不定的. fork函数调用完成以后父进程的虚拟存储空间被拷贝给了子 ...

  10. RabbitMQ 命令行

    用户命令 .添加用户 rabbitmqctl add_user username password .删除用户 rabbitmqctl delete_user username .修改密码 rabbi ...