头条两道编程
#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
#字节跳动#