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;
}

 

posted @ 2022-06-10 20:12  好腻友Π  阅读(59)  评论(0)    收藏  举报