hdu 5596

来源:互联网 发布:viscosity mac 怎么用 编辑:程序博客网 时间:2024/06/07 19:01

GTW likes math

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

注意a可以是0.

GTW likes gt

首先这道题有一个很显然的O(n∗logn)O(n*logn)O(nlogn)的做法,直接区间加,求区间最大值即可。但是此题还有一个O(n)O(n)O(n)的做法。我们发现b1,b2,...,bxb_1,b_2,...,b_xb1,b2,...,bx都加111就相当于bx+1,bx+2,...,bnb_{x+1},b_{x+2},...,b_nbx+1,bx+2,...,bn都减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 longconst 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;}


0 0
原创粉丝点击