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