您的位置:首页 > 其它

hdu 5596

2015-12-12 23:19 337 查看

GTW likes math

由于是整数区间,直接枚举即可。时间复杂度O(T∗(r−l))O(T*(r-l))O(T∗(r−l))

注意a可以是0.

GTW likes gt

首先这道题有一个很显然的O(n∗logn)O(n*logn)O(n∗logn)的做法,直接区间加,求区间最大值即可。但是此题还有一个O(n)O(n)O(n)的做法。我们发现b1,b2,...,bxb_1,b_2,...,b_xb​1​​,b​2​​,...,b​x​​都加111就相当于bx+1,bx+2,...,bnb_{x+1},b_{x+2},...,b_nb​x+1​​,b​x+2​​,...,b​n​​都减111。然后我们可以倒着做,记一下最大值,如果遇到了修改操作,就把最大值减111,然后判断一下这个人会不会被消灭掉,然后再更新一下最大值。

代码:

#include <iostream>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<string>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
#define LL long long
const int maxn=50002;
int n,t;
struct point
{
int id,v;
}a[maxn];
int add[maxn];
int main()
{
int m;
cin>>t;
int c;
while(t--){
memset(add,0,sizeof(add));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].id,&a[i].v);
for(int i=0;i<m;i++){
scanf("%d",&c);
add[c]++;
}
int cnt=0;
for(int i=0;i<n;i++){
// if(add[i+1]){
a[i].v+=m-cnt;
cnt+=add[i+1];
//}
}
//  for(int i=0;i<n;i++)cout<<a[i].v<<endl;
int max1=-100000000,max0=-100000000;
for(int i=n-1;i>=0;i--){
if(a[i].id){
if(a[i].v<max0)n--;
max1=max(a[i].v,max1);
}
else{
if(a[i].v<max1)n--;
max0=max(a[i].v,max0);
}
}
printf("%d\n",n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: