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

浙公网安备 33010602011771号