今天做了两场比赛,一场是现场赛,一场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); } } }
简单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]); } }