AtCoder Beginner Contest 400

AT_abc400_d [ABC400D] Takahashi the Wall Breaker

一次踢两步也转移一下,直接搜

E - Ringo's Favorite Numbers 3

看到1e12根号做法
\((p_1^ip_2^j)^2<=1e12\)也就是找\(p_1^ip_2^j<=1e6\)
枚举每个素数的每个次数,再枚举其他素数的每个次数
按顺序每个就只算了一遍
答案数量不超过1e6,所以状态数可行

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define int long long

const int V=1000010;
bool vis[V];
vector<int> primes;
vector<int> vec;
void init(){
    for(int i=2;i<V;i++){
        if(!vis[i]){
            primes.pb(i);
        }
         for(auto p:primes){
                if(p*i>=V)break;
                vis[p*i]=1;
                 if(i % p == 0) break; 
        }
    }
    //cout<<primes.size()<<'\n';
    //for(auto t:primes)cout<<t<<" ";

    for(int i=0;i<primes.size();i++){
       // cout<<"work"<<primes[i]<<'\n';
        for(int j=0;j<i;j++){
            int u=primes[i];int v=primes[j];
            if(u*v>1e6)break;
            while(u<=1e6){
                int t=u*v;
                while(t<=1e6){
                  //  cout<<"push"<<t<<" ";
                    vec.pb(t);
                    t*=v;
                }
                u*=primes[i];
            }
        }
    }
    //cout<<vec.size()<<'\n';
    sort(vec.begin(),vec.end());
    
}
void solve(){
    init();
int q;cin>>q;
while(q--){
    int x;cin>>x;
    int l=0;int r=vec.size()-1;
    while(l<r){
        int mid=(l+r+1)>>1;
        if(vec[mid]*vec[mid]<=x)l=mid;
        else r=mid-1;
    }
    cout<<vec[l]*vec[l]<<'\n';
}
}
signed main(){
    std::ios::sync_with_stdio(false);
    
    int T;T=1;
    while(T--){
        solve();
    }
}

AT_abc400_f [ABC400F] Happy Birthday! 3

区间涂色dp

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define pb push_back
#define ft first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define int long long

const int N=410;
int c[2*N],x[2*N];
int f[2*N][2*N];
void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>c[i];for(int i=1;i<=n;i++)c[i+n]=c[i];
for(int i=1;i<=n;i++)cin>>x[i];

for(int i=1;i<=2*n;i++)for(int j=i;j<=2*n;j++)f[i][j]=INF;
for(int i=1;i<=2*n;i++)f[i][i]=1+x[c[i]];
for(int len=2;len<=n;len++){
    for(int l=1,r=len;r<=2*n;l++,r++){
    f[l][r]=min(f[l][r],f[l][r-1]+1+x[c[r]]);
    for(int k=l;k+1<=r;k++){
        if(c[k]==c[r])f[l][r]=min(f[l][r],f[l][k]+r-k+f[k+1][r-1]);
    }
    }
}
int ans=INF;
for(int i=1,j=n;j<=2*n;i++,j++)ans=min(ans,f[i][j]);
cout<<ans<<'\n';
}
signed main(){
    std::ios::sync_with_stdio(false);
    int T;T=1;
    while(T--){
        solve();
    }
}
posted @ 2025-10-05 10:35  arin876  阅读(10)  评论(0)    收藏  举报