0
点赞
收藏
分享

微信扫一扫

2022牛客寒假算法基础集训营4 ABCDEFGHIJKL

文章目录


比赛链接


A R

题目链接
题意:

题解:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N], p[N];
signed main() {
    int n, k;
    cin>>n>>k;
    string s;
    cin>>s;
    s=s+"P";
    int cnt=0;
    a[0]=-1;
	for (int i=0; i<=n; i++) {
		if(s[i]=='P') a[++cnt]=i;
	} 
	int ans=0; 
	for(int j=1; j<=cnt; j++) { 
		int cntt=0;
		p[0]=0;
		for (int i=a[j-1]+1; i<a[j]; i++) {
			if (s[i]=='R') p[++cntt]=i+1-a[j-1]-1;
			if(cntt>=k) ans+=p[cntt-k+1];
		} 
	}
	cout<<ans<<endl;
    return 0;
}

B 进制

题目链接
题意:

题解:

#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=1e5+5;
const int M=1e9+7;
int a[N];
int b[13][N];
int n, q;
int p[13][N];
int maxx[4*N];
int sum[13][4*N];
ll ksm(ll a,ll p){ll res=1;while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res;}
void pushup(int id) {
    maxx[id] = max(maxx[id << 1], maxx[id << 1 | 1]);
}
void build(int id, int l, int r) {
    if (l == r) {
        maxx[id] = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
    pushup(id);
}
void update(int id, int l, int r, int x, int v) {
    if (l == r) {
        maxx[id] = v;
        return;
    }
    int mid = (l + r) >> 1;
    if (x <= mid) {
        update(id << 1, l, mid, x, v);
    } else {
        update(id << 1 | 1, mid + 1, r, x, v);
    }
    pushup(id);
}
int query(int id, int l, int r, int x, int y) {
    if(x<=l&&r<=y) {
        return maxx[id];
    }
    int mid=(l+r)>>1;
    int ans=0;
    if(x<=mid) {
        ans=max(ans, query(id<<1, l, mid, x, y));
    }
    if(y>mid) {
        ans=max(ans, query(id<<1|1, mid+1, r, x, y));
    }
    return ans;
}
void pushup1(int id, int jin) {
    sum[jin][id] = (sum[jin][id << 1]+sum[jin][id << 1 | 1])%M;
}
void build1(int id, int l, int r, int jin) {
    if (l == r) {
        sum[jin][id] = b[jin][l]%M;
        return;
    }
    int mid = (l + r) >> 1;
    build1(id << 1, l, mid, jin);
    build1(id << 1 | 1, mid + 1, r, jin);
    pushup1(id, jin);
}
void update1(int id, int l, int r, int x, int v, int jin) {
    if (l == r) {
        sum[jin][id] = v%M;
        return;
    }
    int mid = (l + r) >> 1;
    if (x <= mid) {
        update1(id << 1, l, mid, x, v,jin);
    } else {
        update1(id << 1 | 1, mid + 1, r, x, v,jin);
    }
    pushup1(id, jin);
}
int query1(int id, int l, int r, int x, int y,int jin) {
    if(x<=l&&r<=y) {
        return sum[jin][id]%M;
    }
    int mid=(l+r)>>1;
    int ans=0;
    if(x<=mid) {
        ans=ans%M+query1(id<<1, l, mid, x, y,jin)%M;
    }
    if(y>mid) {
        ans=ans%M+query1(id<<1|1, mid+1, r, x, y,jin)%M;
    }
    ans%=M;
    return ans;
}
signed main() {
    cin>>n>>q;
    string s;
    cin>>s;
    s='.'+s;
    for(int i=n; i>=1; i--) {
        a[i]=(s[i]-'0');
    }
    for(int i=n; i>=1; i--) {
        for(int j=2; j<=10; j++) {
                b[j][i]=a[i]*ksm(j, n-i)%M;
                //cout<<i<<" "<<j<<" "<<b[j][i]<<endl;
        }
    }
    build(1, 1, n);
    for(int i=2; i<=10; i++) build1(1, 1, n, i);
    //cout<<"$$$"<<query1(1,1,n,1 ,3, 10)<<endl;
    while(q--) {
        int op, x, y;
        cin>>op>>x>>y;
        if(op==1) {
            update(1, 1, n, x, y);
            for(int i=2; i<=10; i++) update1(1, 1, n, x, y*ksm(i, n-x), i);
        }else {
            int dang=query(1, 1, n, x, y);
            if(dang==0) cout<<0<<endl;
            else {
                dang++;
                cout<<query1(1,1,n,x, y,dang)%M*ksm(ksm(dang, n-y), M-2)%M<<endl;
            }
        }
    }
    return 0;
}

C 蓝彗星

题目链接
题意:
题解:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N], b[N], c[N];
signed main() {
    int n, t;
    cin>>n>>t;
    string s;
    cin>>s;
    s='.'+s;
    for(int i=1; i<=n; i++) {
        int x; cin>>x;
        if(s[i]=='B') b[x]++, b[x+t]--;
        else c[x]++, c[x+t]--;
    }
    for(int i=1; i<=N; i++) {
        b[i]+=b[i-1];
        c[i]+=c[i-1];
        //cout<<i<<" "<<b[i]<<" "<<c[i]<<endl;
    }
    int ans=0;
    for(int i=1; i<=N; i++) {
        if(b[i]&&!c[i]) ans++;
    }
    cout<<ans<<endl;
    return 0;
}

D 雪色光晕

题目链接
题意:

题解:

#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=2e5+5;
const int M=1e9+7;
double dis(double xx, double yy, double x1, double y2) {
    return sqrt((xx-x1)*(xx-x1)+(yy-y2)*(yy-y2));
}
double Pd(double x, double y, double x1, double y1, double x2, double y2){
    double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
    if (cross <= 0) return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
    double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
    if (cross >= d2) return sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
    double r = cross / d2;
    double px = x1 + (x2 - x1) * r;
    double py = y1 + (y2 - y1) * r;
    return sqrt((x - px) * (x - px) + (py - y) * (py - y));
}
signed main() {
    int n;
    cin>>n;
    double x0, y0, X, Y;
    cin>>x0>>y0>>X>>Y;
    double minn=dis(x0,y0,X,Y);
    for(int i=1; i<=n; i++) {
        double x, y;
        cin>>x>>y;
        minn=min(minn, Pd(X, Y, x0,y0, x0+x, y0+y));
        x0+=x;
        y0+=y;
    }
    cout<<fixed<<setprecision(8)<<minn<<endl;
    return 0;
}

E 真假签到题

题目链接
题意:

题解:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5; 
signed main() {
   int x;
   cin>>x;
   cout<<x<<endl;
    return 0;
}

F 小红的记谱法

题目链接
题意:

题解:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N], b[N], c[N];
map<char, int> mp;
signed main() {
    string pp="CDEFGAB";
    for(int i=0; i<pp.size(); i++) mp[pp[i]]=i+1;
    string s;
    cin>>s;
    int n=s.size();
    int p=0;
    for(int i=0; i<n; i++) {
       // cout<<i<<" "<<p<<endl;
        if(s[i]=='<') p++;
        else if(s[i]=='>') p--;
        else {
            //cout<<i<<" "<<p<<endl;
            cout<<mp[s[i]];
            if(p==0) continue;
            else if(p>0) {
                for(int j=1; j<=p; j++) cout<<'.';
            }else for(int j=1; j<=-p; j++) cout<<'*';
        }
    }
    cout<<endl;
    return 0;
}

G 子序列权值乘积

题目链接

题意:

题解:

#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=2e5+5;
const int M=1e9+7;
const int MM=1e9+6;
int a[N], b[N];
int dp[1005][1005];
ll ksm(ll a,ll p){ll res=1;while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res%M;}
ll ksmm(ll a,ll p){ll res=1;while(p){if(p&1){res=res*a%MM;}a=a*a%MM;p>>=1;}return res%MM;}
signed main() {
    int n;
    cin>>n;
    for(int i=1; i<=n; i++) cin>>a[i];
    sort(a+1, a+1+n); 
    int ans=1;
    for(int i=1; i<=n; i++) {
        int b=ksmm(2, i-1)+ksmm(2, n-i);
        ans=ans%M*ksm(a[i], b)%M;
        ans%=M;
    }
    cout<<ans%M<<endl;
    return 0;
}

H 真真真真真签到题

题目链接

题意:

题解:

#include<bits/stdc++.h>
#define ihnt long long
using namespace std;
const int N=2e5+5; 
signed main() {
   double x;
   cin>>x;
   cout<<fixed<<setprecision(7)<<x/sqrt(3)*2*x/sqrt(3)*2*x/sqrt(3)*2<<endl;
    return 0;
}

I 爆炸的符卡洋洋洒洒

题目链接

#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=2e5+5;
const int M=1e9+7;
int a[N], b[N];
int dp[1005][1005];
signed main() {
    int n, k;
    cin>>n>>k;
    for(int i=1; i<=n; i++) {
        cin>>a[i]>>b[i];
        a[i]%=k;
    }
    for(int i=1; i<=n; i++) {
        for(int j=k-1; j>=0; j--) {
            int p=(j-a[i]+k)%k;
            dp[j][i]=max(dp[j][i-1], dp[j][i]); 
            if(dp[p][i-1]||p==0)dp[j][i]=max(dp[p][i-1]+b[i], dp[j][i]);  
        }
    }
    int maxx=dp[0][n];
    if(maxx<=0) cout<<-1<<endl;
    else cout<<maxx<<endl;
    return 0;
}

J 区间合数的最小公倍数

题目链接

#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=2e5+5;
const int M=1e9+7;
int p[N];
bool check[N],vis[N];
int n, m;
void init() {
    int t;
    check[1]=true;
    for(int i=2;i<=n;i++){
        if(!check[i])p[++p[0]]=i;
        for(int j=1;j<=p[0];j++){
            t=i*p[j];
            if(t>n)break;
            check[t]=true;
            if(i%p[j]==0)break;
        }
    }
}
ll ksm(ll a,ll p){ll res=1;while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res;}
int mp[N];
signed main() {
    n=30001;
    init();
    int l, r;
    cin>>l>>r;
    bool q=0; 
    for(int i=l; i<=r; i++) {
        int num=i;
        int m=0;
        for(int j=1; j<=p[0]; j++) {
            while(num%p[j]==0) {
                num/=p[j];
                m++;
            }
        }
        if(m>=2) q=1;
        else continue; 
        num=i;
        for(int j=1; j<=p[0]; j++) {
            int sum=0;
            while(num%p[j]==0) {
                num/=p[j];
                sum++;
            }
            mp[p[j]]=max(sum, mp[p[j]]);
        }

    }
    if(!q) {
        cout<<-1<<endl;
        return 0;
    }
    int ans=1;
    for(int i=1; i<=p[0]; i++) { 
        ans=ans*ksm(p[i], mp[p[i]])%M;
        ans%=M;
    }
    cout<<ans<<endl;
    return 0;
}

K 小红的真真假假签到题题

题目链接

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
signed main() {
    int x;
    cin>>x;
    string s;
    while(x) {
        s=char('0'+x%2)+s;
        x/=2;
    }
    s=s+s;
    int ans=0;
    int p=1;
    for(int i=0; i<s.size(); i++) {
        ans=ans*2+(s[i]-'0');
    }
    cout<<ans<<endl;
    return 0;
}

L 在这冷漠的世界里光光哭哭【待补】

题目链接


总结

Qwq

举报

相关推荐

0 条评论