头条两道编程

#include<bits/stdc++.h> using namespace std; const int maxn=1e4+5; typedef long long ll; int n,m,c; vector<int> g[maxn*2]; int main(){     ios::sync_with_stdio(0),cin.tie(0);     //freopen("in","r",stdin);     cin>>n>>m>>c;     int cnt,val;     for(int i=0;i<n;++i){         cin>>cnt;         for(int j=0;j<cnt;++j){             cin>>val;             g[i].push_back(val);         }         g[n+i]=g[i];     }     ll last=0,res=0;     for(int i=0;i<m;++i){         for(auto v: g[i])             if(last&(1LL<<v))                 res|=1LL<<v;             else                 last|=1LL<<v;     }     n<<=1;     for(int i=m;i<n;++i){         for(auto v:g[i-m])             last^=1LL<<v;         //cout<<last<<endl;         for(auto v:g[i])             if(last&(1LL<<v))                 res|=1LL<<v;             else                 last|=1LL<<v;     }     cnt=0;     for(int i=1;i<=c;++i)         if(res&(1LL<<i))             ++cnt;     cout<<cnt<<endl;     return 0; }
//记得做过这道题,hdu 4417 //开始想写分块或者莫队,看这个好写,就写了这个 #include<bits/stdc++.h> using namespace std; const int maxn=3e5+5; int n,q; int a[maxn]; vector<int> v[maxn<<2]; typedef vector<int>::iterator VIT; void build(int rt,int l,int r){ for(int i=l;i<=r;++i) v[rt].push_back(a[i]); sort(v[rt].begin(),v[rt].end()); if(l==r)return ; int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); } int ql,qr,k; int query(int rt,int l,int r){ if(ql<=l&&r<=qr){ VIT it=upper_bound(v[rt].begin(),v[rt].end(),k); return it-v[rt].begin(); } int mid=(l+r)>>1; int res=0; if(ql<=mid) res+=query(rt<<1,l,mid); if(mid<qr) res+=query(rt<<1|1,mid+1,r); return res; } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d",a+i); scanf("%d",&q); build(1,1,n); for(int i=0;i<q;++i){ scanf("%d%d%d",&ql,&qr,&k); int res=query(1,1,n);--k; printf("%d\n",res-query(1,1,n)); } return 0; } 第三个不会,出现次数最多的字符个数max 可过0.85 max-1 0.05 max-2 0.1


#字节跳动#
全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务