bestcoder 20 A,B

  今天做了两场比赛,一场是现场赛,一场bc,bc的第一题感觉超级水,可是就是不过,赛后才发现原来是自己看错题意了。第二题线段数没写出来,赛后写了一下,发现pushdown写错了,尼玛,还是做的题少呀。。。。。。

A题就是输出选票最多的并且id最小的   i的id就是i

比如  5    1 3 3 2 2  输出是2   

就一直卡在这了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[1100];
int b[1100];
int main(){
    int t;
    int n;
    while(scanf("%d",&t)==1){
    while(t--){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            b[a[i]]++;
        }
        int maxx=-1;
        int k;
        for(int i=1;i<=n;i++)
            if(b[i]>maxx){
                k=i;
                maxx=b[i];
                b[i]=0;
            }
        printf("%d\n",k);
    }
    }
}

b题就是成端更新后求最大值。。。

简单hash一下就好

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxx  200010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[maxx<<2];
int num[maxx<<2];
int cnt;
int add[maxx<<2];
int hash[maxx<<2];
int a[maxx],b[maxx];
void pushup(int rt){
  sum[rt]=max(sum[rt<<1|1],sum[rt<<1]);
}

void pushdown(int rt){
  if(add[rt]){
   add[rt<<1]+=add[rt];
   add[rt<<1|1]+=add[rt];
   sum[rt<<1]+=add[rt];
   sum[rt<<1|1]+=add[rt];
   add[rt]=0;
  }
}
void update(int L,int R ,int c,int l,int r,int rt){
   if(L<=l&&R>=r){
    add[rt]+=c;
    sum[rt]+=c;
    return ;
   }
   pushdown(rt);
   int m=(l+r)>>1;
   if(L<=m) update(L,R,c,lson);
   if(R>m) update(L,R,c,rson);
   pushup(rt);
}
int cheak(int aa,int nn,int num[]){
    int l=0,r=nn-1;
    while(l<=r){
        int m=(l+r)>>1;
        if(num[m]==aa)  return m;
        if(num[m]<aa)  l=m+1;
        else r=m;
    }
    return -1;
}
int main(){
   int T,n;
   scanf("%d",&T);
   while(T--){
     scanf("%d",&n);
     int m=0;
     for(int i=0;i<n;i++){
        scanf("%d%d",&a[i],&b[i]);
        num[m++]=a[i];
        num[m++]=b[i];
     }
     sort(num,num+m);
    // for(int i=0;i<m;i++)
    //    printf("%d %d\n",i,num[i]);
     int h=1;
     for(int i=1;i<m;i++){
        if(num[i]!=num[i-1])
            num[h++]=num[i];
     }
     //puts("--------------");
    // for(int i=0;i<h;i++)
   //     printf("%d %d\n",i,num[i]);
     memset(sum,0,sizeof(sum));
     memset(hash,0,sizeof(hash));
     memset(add,0,sizeof(add));
     for(int i=0;i<n;i++){
        int l=cheak(a[i],h,num);
        int r=cheak(b[i],h,num);
        update(l,r,1,0,h,1);
     }
     printf("%d\n",sum[1]);
   }
}



你可能感兴趣的:(bestcoder 20 A,B)