牛客周赛 Round 56
牛客周赛 Round 56
\(A\) 牛客 NC277678 面包店故事 \(AC\)
-
选择结构。
点击查看代码
int main() { int x,y,n; cin>>x>>y>>n; if(x+y<=n) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } return 0; }
\(B\) 牛客 NC277594 放课后故事 \(AC\)
-
顺序结构。
点击查看代码
int main() { ll n,m,k,x,sum=0,i; cin>>n>>m>>k; for(i=1;i<=n;i++) { cin>>x; sum+=x; } cout<<min(m+1,sum/k)<<endl; return 0; }
\(C\) 牛客 NC277217 异或故事 \(AC\)
-
考虑钦定一个数 \(b\) ,然后令 \(c=a \bigoplus b\) 。
-
不妨让 \(b,c \le a\) 那么 \(b=\operatorname{lowbit}(a)\) 是个不错的选择。
-
特判 \(2^{k}(k \in \mathbb{N})\) 的情况。
点击查看代码
int lowbit(int x) { return (x&(-x)); } int main() { int t,x,i; cin>>t; for(i=1;i<=t;i++) { cin>>x; if(x==1) { cout<<2<<" "<<(x^2)<<endl; } else { if(__builtin_popcount(x)==1) { cout<<1<<" "<<(x^1)<<endl; } else { cout<<lowbit(x)<<" "<<(x^lowbit(x))<<endl; } } } return 0; }
\(D\) 牛客 NC277596 构造故事 \(AC\)
-
排序后枚举相邻 \(3\) 个数判断即可。
点击查看代码
ll a[10010]; int main() { ll t,n,ans,i,j; cin>>t; for(j=1;j<=t;j++) { cin>>n; ans=-1; for(i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+1+n); for(i=n;i>=3;i--) { if(a[i-2]+a[i-1]>a[i]) { ans=max(ans,a[i-2]+a[i-1]+a[i]); } } cout<<ans<<endl; } return 0; }
\(E\) 牛客 NC277601 约会故事 \(AC\)
-
将时间转化成 \(4\) 位数后就是一个简单的小模拟了。
-
注意开心的起止时间不在同一天的情况。
点击查看代码
int happy[3000]; map<string,int>vis; char tmp[10]; string s; int val(char x) { return x-'0'; } int to(char s[]) { return val(s[1])*1000+val(s[2])*100+val(s[4])*10+val(s[5]); } int main() { int n,m,q,st,ed,x,i,j,k; cin>>n>>m; for(i=1;i<=n;i++) { cin>>(tmp+1); st=to(tmp); cin>>(tmp+1); ed=to(tmp); if(st==ed) { fill(happy+0,happy+2600,1); } else { if(st<ed) { fill(happy+st,happy+ed+1,1); } else { fill(happy+st,happy+2600,1); fill(happy+0,happy+ed+1,1); } } } for(i=1;i<=m;i++) { cin>>s; vis[s]=1; } cin>>q; for(i=1;i<=q;i++) { cin>>(tmp+1); x=to(tmp); cin>>(tmp+1); st=to(tmp); cin>>(tmp+1); ed=to(tmp); cin>>s; if(0<=x&&x<=159) { if(happy[x]==0) { cout<<"Loser xqq"<<endl; } else { if(st>ed||vis.find(s)==vis.end()) { cout<<"Joker xqq"<<endl; } else { cout<<"Winner xqq"<<endl; } } } else { cout<<"Loser xqq"<<endl; } } return 0; }
\(F\) 牛客 NC277160 不是烤串故事
-
考虑处理出 \(s\) 的正串、反串哈希。接着二分哈希 \(check\) 时判断是否需要和前面的拼起来。
-
多试几个模数,防止被卡。
点击查看代码
const ll mod=1000003579,base=13331; ll a[1000010],b[1000010],c[1000010],jc[1000010]; char s[1000010],ss[1000010],t[1000010]; void sx_hash(char s[],ll a[],ll len) { for(ll i=0;i<=len;i++) { a[i]=(i==0)?0:((a[i-1]*base%mod+s[i])%mod); } } ll ask_hash(ll a[],ll l,ll r) { return (a[r]-a[l-1]*jc[r-l+1]%mod+mod)%mod; } bool check(ll mid,ll i,ll n) { if(mid>i) { return (ask_hash(b,n-i+1,n)*jc[mid-i]%mod+ask_hash(a,i+1,mid))%mod==ask_hash(c,1,mid); } else { return ask_hash(b,n-i+1,n-i+mid)==ask_hash(c,1,mid); } } int main() { ll T,n,l,r,mid,ans,maxx,pos,i,j; cin>>T; for(i=0;i<=1000000;i++) { jc[i]=(i==0)?1:(jc[i-1]*base%mod); } for(j=1;j<=T;j++) { maxx=0; pos=1; cin>>n>>(s+1)>>(t+1); for(i=1;i<=n;i++) { ss[i]=s[n-i+1]; } sx_hash(s,a,n); sx_hash(ss,b,n); sx_hash(t,c,n); for(i=1;i<=n;i++) { l=1; r=n; ans=0; while(l<=r) { mid=(l+r)/2; if(check(mid,i,n)==true) { l=mid+1; ans=mid; } else { r=mid-1; } } if(ans>maxx) { maxx=ans; pos=i; } } cout<<maxx<<" "<<pos<<endl; } return 0; }
总结
- \(F\) 没立刻明白反转是什么意思,尝试 \(KMP,Trie\) 树,后缀数组无果。最后发现还得是二分哈希。
后记
- \(E\) 没明确说明开心的起止时间不在同一天时怎么处理,感觉和没说开心的开始时间与结束时间相等怎么处理一样恶劣。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18367051,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。