winter week5 day5

2024牛客寒假算法基础集训营6

A

思路:暴力

宇宙的终结

查看代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};

void solve() {
    vector<int>pri(105);
    vector<int>ans;
    for(int i=2;i<=100;++i){
        for(int j=2;j*j<=i;++j){
            if(i%j==0){
                pri[i]=1;
                break;
            }
        }
    }
    for(int i=2;i<=100;++i){
        for(int j=2;j<=100;++j){
            for(int z=2;z<=100;++z){
                if(i*j*z>100)continue;
                if(i==j||i==z||j==z)continue;
                if(!pri[i]&&!pri[j]&&!pri[z]){
                    ans.push_back(i*j*z);
                }
            }
        }
    }
    sort(ans.begin(),ans.end());
    int l,r;
    cin>>l>>r;
    auto it= std::lower_bound(ans.begin(), ans.end(),l);
    if(it!=ans.end()&&*it<=r)cout<<*it;
    else cout<<-1;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

B

爱恨的纠葛

思路:暴力

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};

void solve() {
    int n;
    cin>>n;
    vector<int>a(n),b(n);
    for(auto &v:a)cin>>v;
    for(auto &v:b)cin>>v;
    sort(a.begin(),a.end());
    int mi=3e9,p,tb;
    for(int i=0;i<n;++i){
        auto it= std::lower_bound(a.begin(), a.end(),b[i]);
        int mii=3e9,k;
        if(it!=a.end()){
            if(abs(*it-b[i])<mii)mii=abs(*it-b[i]),k=it-a.begin();
        }
        if(it!=a.begin()){
            it--;
            if(abs(*it-b[i])<mii)mii=abs(*it-b[i]),k=it-a.begin();
        }
        if(mii<mi){
            mi=mii,p=k,tb=i;
        }
    }
    vector<int>ans(n);
    for(int i=0,j=0;i<n;++i){
        if(j==p)j++;
        if(i==tb)ans[i]=p;
        else ans[i]=j++;
    }
    for(int i=0;i<n;++i)cout<<a[ans[i]]<<' ';
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

C

心绪的解剖

思路:暴力

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};

void solve() {
    vector<int>ve(200);
    ve[1]=0,ve[2]=1;
    int k=45;
    for(int i=3;i<=k;++i){
        ve[i]=ve[i-1]+ve[i-2];
    }
    map<int,vector<int>>mp;
    for(int i=1;i<=k;++i){
        for(int j=1;j<=k;++j){
            for(int z=1;z<=k;++z){
                vector<int>g(3);
                g[0]=ve[i],g[1]=ve[j],g[2]=ve[z];
                int c=g[0]+g[1]+g[2];
                if(c>1e9)continue;
                if(!mp.count(c))mp[c]=g;
            }
        }
    }
    int q,n;
    cin>>q;
    while(q--){
        cin>>n;
        if(mp.count(n)){
            vector<int>g=mp[n];
            for(auto v:g)cout<<v<<' ';
            cout<<'\n';
        }else cout<<-1<<'\n';
    }
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

D

友谊的套路

思路:两种情况

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};

void solve() {
    double p;
    cin>>p;
    double ans=pow(p,2)*pow(1-p,3);
    p=1-p;
    ans+=pow(p,2)*pow(1-p,3);
    cout<<fixed<<setprecision(6)<<ans;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

E

未来的预言

思路:模拟,提BOx的x被坑了wa了一发😅

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};

void solve() {
    string s,t;
    cin>>s>>t;
    s.erase(s.begin(),s.begin()+2);
    int k= stoi(s);
    int win=(k+1)/2;
    int cnt=0,r=0,p=0;
    for(int i=0;i<t.size();++i){
        cnt++;
        if(t[i]=='R')r++;
        else p++;
        if(r==win){
            win=-1;break;
        }
        if(p==win){
            win=-2;break;
        }
        if(i+1==k)break;
    }
    if(win==-1)cout<<"kou!";
    else if(win==-2)cout<<"yukari!";
    else cout<<"to be continued.";
    cout<<"\n"<<cnt;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

F

命运的抉择

思路:数不大,提取的质数因子也不多,将所有数按质数因子分类,并查集合并有同一因子的数,最后至少有两个集合即可

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
vector<int>fa(1e5+5);
int find(int x){
    if(x!=fa[x])fa[x]=find(fa[x]);
    return fa[x];
}

void solve() {
    int n;
    cin>>n;
    map<int,vector<int>>ve;
    vector<int>a(n+1);
    for(int i=1;i<=n;++i){
        cin>>a[i];
        int x=a[i];
        for(int j=2;j*j<=x;++j){
            if(a[i]%j==0){
                ve[j].push_back(i);
                while(x%j==0)x/=j;
            }
        }
        if(x>1)ve[x].push_back(i);
    }
    for(int i=1;i<=n;++i)fa[i]=i;
    for(auto [x,y]:ve){
//        cout<<x<<':'<<y[0]<<' ';
        for(int i=1;i<y.size();++i){
//            cout<<y[i]<<' ';
            int aa=find(y[i-1]),bb=find(y[i]);
            if(aa!=bb){
                fa[bb]=aa;
            }
        }
//        cout<<'\n';
    }
    set<int>se;
    int cnt=0,p=find(1);
    for(int i=1;i<=n;++i){
        int aa=find(i);
        if(aa==p)cnt++;
        se.insert(aa);
    }
    if(se.size()==1)cout<<-1<<' '<<-1<<'\n';
    else{
        cout<<cnt<<' '<<n-cnt<<'\n';
        for(int i=1;i<=n;++i){
            int aa=find(i);
            if(aa==p)cout<<a[i]<<' ';
        }cout<<'\n';
        for(int i=1;i<=n;++i){
            int aa=find(i);
            if(aa!=p)cout<<a[i]<<' ';
        }cout<<'\n';
    }
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

G

人生的起落

ε=(´ο`*)))唉,真服了又读叉题了,以为V的y也要相同,所以对于n=2k+1的情况用扩欧求的,交了好几发都wa人都傻了。y不相同的话就很简单了

思路:首先把那些s,n不够的情况判掉,剩下只有两种情况,n=2k+1:那就是abacada.......a,这里保证bcd...最小为1,剩下的s分配给a且a最大,若还剩下s则分给bcd...;n>2k+1:让前2k+1个位置为2121.......2,剩下的为c111111,用c和1来把剩下的s补完

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};


void solve() {
    int n,s,k;
    cin>>n>>s>>k;
    if(k==0){
        if(n>s){
            cout<<-1<<'\n';
            return ;
        }
        vector<int>ans(n+1);
        ans[1]=s-n+1;
        for(int i=2;i<=n;++i)ans[i]=1;
        for(int i=1;i<=n;++i)cout<<ans[i]<<' ';
        cout<<'\n';
        return ;
    }
    if(n>2*k+1){
        if(n+k+1>s)cout<<-1<<'\n';
        else{
            vector<int>ans(n+1);
            for(int i=1;i<=2*k+1;++i){
                if(i%2)ans[i]=2;
                else ans[i]=1;
            }
            ans[2*k+2]=s-n-k;
            for(int i=2*k+3;i<=n;++i)ans[i]=1;
            for(int i=1;i<=n;++i)cout<<ans[i]<<' ';
            cout<<'\n';
        }
    }else if(n==2*k+1){
        if(n+k+1>s){
            cout<<-1<<'\n';
            return ;
        }
        int a=(s-k)/(k+1),les=s-a*(k+1);
        if(a<=(les+k-1)/k){
            cout<<-1<<'\n';
            return ;
        }
        vector<int>ans(n+1);
        les-=k;
        for(int i=1;i<=n;++i){
            if(i%2)ans[i]=a;
            else{
                ans[i]=1+(les>0);
                les--;
            }
            cout<<ans[i]<<' ';
        }cout<<'\n';
    }else cout<<-1<<'\n';
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

I

时空的交织

sado(╥﹏╥)o,求非空区间和又坑了

思路:由式子可知,矩阵(xi,yi)到(xj,yj)的和为(axi+...+axj)*(byi+...+byj),那就是求a、b的非空区间和,由于有正负值,最大最小非空区间和都要求

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};

void solve() {
    int n,m;
    cin>>n>>m;
    vector<int>a(n),b(m);
    for(auto &v:a)cin>>v;
    for(auto &v:b)cin>>v;
    int ama=-INF,bma=-INF,ami=INF,bmi=INF;
    for(int i=0,ta=0,ti=0;i<n;++i){
        if(ta+a[i]>=0){
            ta+=a[i];
            ama=max(ama,ta);
        }
        else{
            ama=max(ama,a[i]);
            ta=0;
        }
        if(ti+a[i]<=0){
            ti+=a[i];
            ami=min(ami,ti);
        }
        else {
            ami=min(ami,a[i]);
            ti=0;
        }
    }
    for(int i=0,tb=0,ti=0;i<m;++i){
        if(tb+b[i]>=0){
            tb+=b[i];
            bma=max(bma,tb);
        }
        else{
            bma=max(bma,b[i]);
            tb=0;
        }
        if(ti+b[i]<=0){
            ti+=b[i];
            bmi=min(bmi,ti);
        }
        else{
            bmi=min(bmi,b[i]);
            ti=0;
        }
    }
//    cout<<ama<<' '<<ami<<'\n';
//    cout<<bma<<' '<<bmi<<'\n';
    int ans=max({ama * bma, ami * bmi,ama*bmi,ami*bma});
    cout<<ans;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

J

绝妙的平衡

思路:dfs。首先先判非法情况,那就是一节点R的子树除本身外的权值和%3为0,若不为0则一定可以通过对节点R赋值1或2使得整个子树%3为0

所以什么情况下节点R的子树除本身外的权值和%3一定为0呢

对于子节点R,此时的子节点的子树权值和%3一定是0,那么就不能更改子节点R的权值;

对于子节点W,则可对其权值进行更改。

所以无论节点的子树权值和%3为多少,如果存在子节点W,都可以通过对子节点W进行一次加1(1变2)或减1(2变1)使得节点的子树权值和%3不为0。

那非法情况就是存在一节点R,但是不存在其子节点W

对W赋值的话全为1或全为2都可以,因为遇到上面说的情况时(%3为0)其值都可修改

这里从叶子往根开始赋值

查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-9;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
vector<vector<int>>g;
vector<int>ve,to;
int n;
string s;
bool dfs(int u){
    bool ok=false;
    for(auto v:g[u]){
        if(s[v]=='W')to[u]=v,ok=true;
        if(!dfs(v))return 0;
    }
    if(s[u]=='R'&&!ok)return 0;
    ve.push_back(u);
    return 1;
}
void solve() {
    cin>>n>>s;
    g=vector<vector<int>>(n+1);
    vector<int>fa(n+1);
    to=vector<int>(n+1,-1);
    for(int i=2;i<=n;++i){
        int x;
        cin>>x;
        g[x].push_back(i);
        fa[i]=x;
    }
    s.insert(s.begin(),' ');
    if(dfs(1)){
        vector<int>sum(n+1),ans(n+1);
        for(auto v:ve){
            if(s[v]=='W'){
                ans[v]=2;
                sum[v]+=2;
                sum[fa[v]]+=sum[v];
            }else{
                if(sum[v]%3==0){
                    ans[to[v]]=1;
                    ans[v]=1;
                    sum[v]=0;
                }else if(sum[v]%3==1){
                    ans[v]=2;
                    sum[v]=0;
                }else if(sum[v]%3==2){
                    ans[v]=1;
                    sum[v]=0;
                }
            }
        }
        for(int i=1;i<=n;++i)cout<<ans[i];
    }else cout<<-1;

}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
//    init();
    while(t--){
        solve();
    }
    return 0;
}

 

posted @ 2024-02-23 19:51  bible_w  阅读(8)  评论(0编辑  收藏  举报