VJ-11 个人赛
bookshelf filling
二分,从右边的长度为b的书中选tt本,看上面剩下的空间能否摆下tt本。因为tt的值越小,越有可能摆下,所以满足二分的性质。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; int a,b,h; ll n,m; bool judge(ll tt) { ll cnt1=(n/b)*(h-a); ll cnt2=(((n%b+m-tt)/b)*(h-b)); if (cnt1+cnt2>=tt)return true; return false; } signed main() { int t; scanf("%d",&t); while (t--) { scanf("%d%d%lld%lld%d",&a,&b,&n,&m,&h); ll l=0,r=m-1; while (l<r) { ll mid=(l+r+1)>>1; if (judge(mid))l=mid; else r=mid-1; } printf("%lld\n",n+m-l); } return 0; }
L
#include <bits/stdc++.h> #define all(a) a.begin(),a.end() #define rep(i,a,b) for(int i=a;i<=b;i++) #define nrep(i,a,b) for(int i=a;i>=b;i--) using namespace std; using ll = unsigned long long ; const int N = 1e6+10 ; const ll P = 1331; char a[N],b[N]; ll u[N],ha1[N],ha2[N],ha3[N]; const ll mod = ULLONG_MAX; int n; ll mi(ll a,ll b,ll p){ ll r=1; while(b){ if(1&b)r=r*a%p; a=a*a%p; b>>=1; } return r; } int fan(int x,int y){ if(x<=y){ assert(y-x+1>0); return y-x+1; } else { assert(n-(x-y)+1>0); return n-(x-y)+1; } } ll ge(ll *ha,ll l,ll r){ return ha[r]-ha[l-1]*u[r-l+1]; } void solve() { scanf("%s",a+1); scanf("%s",b+1); n=strlen(a+1); for(int i=n+1;i<=2*n;i++) b[i]=b[i-n]; b[2*n+1]='\0'; ha1[0]=1; for(int i=1;i<=n*2;i++){ ha1[i]=ha1[i-1]*P+b[i]; } reverse(b+1,b+1+n); for(int i=n+1;i<=2*n;i++) b[i]=b[i-n]; ha2[0]=1; for(int i=1;i<=2*n;i++){ ha2[i]=ha2[i-1]*P+b[i]; } ha3[0]=1; for(int i=1;i<=n;i++){ ha3[i]=ha3[i-1]*P+a[i]; } int L,R; scanf("%d%d",&L,&R); map<int,bool>l,r; queue<pair<int,int>>q; l[1]=true; q.push({1,1}); while(!q.empty()){ pair<int,int> t=q.front();q.pop(); if(t.second&1){ if(!r.count(fan(t.first,L))){ r[fan(t.first,L)]=true; q.push({fan(t.first,L),t.second+1}); } if(!r.count(fan(t.first,R))){ r[fan(t.first,R)]=true; q.push({fan(t.first,R),t.second+1}); } }else{ if(!l.count(fan(t.first,L))){ l[fan(t.first,L)]=true; q.push({fan(t.first,L),t.second+1}); } if(!l.count(fan(t.first,R))){ l[fan(t.first,R)]=true; q.push({fan(t.first,R),t.second+1}); } } } for(auto &[t,val]:l){ if(ge(ha1,t,t+n-1)==ge(ha3,1,n)){ printf("yes\n"); return ; } } for(auto &[t,val]:r){ int u=n-t+1; if(ge(ha2,u,u+n-1)==ge(ha3,1,n)){ printf("yes\n"); return ; } } printf("no\n"); } int main() { u[0]=1; for(int i=1;i<N;i++) u[i]=u[i-1]*P; int t=1; cin>>t; while(t--){ solve(); } return 0; }