近年CSP第二题题解

第38次CSP认证第二题:机器人复健指南

80分题解:DFS

时间复杂度:\(O(8^k)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 110, MAX = 1e9, INF = -1e9;

    int n,k;
    int x,y;
    int g[N][N];
    int dx[8]={1,2,1,2,-1,-2,-1,-2};
    int dy[8]={2,1,-2,-1,2,1,-2,-1};
    int ans=0;

    void dfs(int a,int b,int num){
        g[a][b]=num;
        if(num==0)return ;

        for(int i=0;i<8;i++){
            int x0=a+dx[i];
            int y0=b+dy[i];
            if(x0>=1&&x0<=n&&y0>=1&&y0<=n){
                dfs(x0,y0,num-1);
            }
        }
        return ;
    }

    void solve(){
        cin>>n>>k>>x>>y;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                g[i][j]=-1;
            }
        }
        dfs(x,y,k);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(g[i][j]!=-1)ans++;
            }
        }
        cout<<ans<<endl;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

100分题解:DFS+剪枝

时间复杂度:\(O(n^2 k)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 110, MAX = 1e9, INF = -1e9;

    int n,k;
    int x,y;
    int g[N][N];
    int dx[8]={1,2,1,2,-1,-2,-1,-2};
    int dy[8]={2,1,-2,-1,2,1,-2,-1};
    int ans=0;

    void dfs(int a,int b,int num){
        g[a][b]=num;
        if(num==0)return ;

        for(int i=0;i<8;i++){
            int x0=a+dx[i];
            int y0=b+dy[i];
            if(x0>=1&&x0<=n&&y0>=1&&y0<=n&&g[x0][y0]<num-1){
                dfs(x0,y0,num-1);
            }
        }
        return ;
    }

    void solve(){
        cin>>n>>k>>x>>y;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                g[i][j]=-1;
            }
        }
        dfs(x,y,k);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(g[i][j]!=-1)ans++;
            }
        }
        cout<<ans<<endl;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第37次CSP认证第二题:机器人饲养指南

100分题解(1):完全背包(未优化)

时间复杂度:\(O(m^2 n)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 105, MAX = 1e9, INF = -1e12, M = 10005;

    int n,m;
    int w[N];
    int dp[N][M];
    void solve(){
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            cin>>w[i];
        }
        memset(dp,0,sizeof dp);
        for(int i=1;i<=m;i++){
            for(int j=0;j<=n;j++){
                for(int k=0;k*i<=j;k++){
                    dp[i][j]=max(dp[i][j],dp[i-1][j-k*i]+k*w[i]);
                }
            }
        }
        cout<<dp[m][n]<<endl;

    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

100分题解(2):完全背包(优化)

时间复杂度:\(O(mn)\)

#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
#define val(a) (a<'a' ? (a-'A'+'a') : a)
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;

typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef pair<long long, long long> PLL;
typedef priority_queue<int> PQ;
typedef priority_queue<int, vector<int>, greater<int>> Q;
const int N = 105, MAX = 1e9, INF = -1e12, M = 10005;

int n,m;
int w[N];
int dp[N][M];
void solve(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>w[i];
	}
	memset(dp,0,sizeof dp);
	for(int i=1;i<=m;i++){
		for(int j=0;j<=n;j++){
			dp[i][j]=dp[i-1][j];
			if(j>=i)dp[i][j]=max(dp[i][j],dp[i][j-i]+w[i]);
		}
	}
	cout<<dp[m][n]<<endl;
}

signed main()
{
    fast();
    
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

第36次CSP认证第二题:梦境巡查

80分题解(1):二分答案

时间复杂度:\(O(n^2log(MAX))\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 1e5+10, MAX = 1e9, INF = -1e9;

    int n;
    int a[N];
    int b[N];

    bool check(int m,int p){
        for(int i=1;i<=n;i++){
            m-=a[i-1];
            if(m<0)return false;
            m+=(i==p ? 0 : b[i]);
        }
        return m>=a[n];
    }

    void solve(){
        cin>>n;
        for(int i=0;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)cin>>b[i];
        for(int i=1;i<=n;i++){
            int l=0;int r=MAX;
            while(l<r){
                int mid=(l+r)>>1;
                if(check(mid,i))r=mid;
                else l=mid+1;
            }
            cout<<l<<" ";
        }
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

80分题解(2):前缀和

时间复杂度:\(O(n^2)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 1e5+10, MAX = 1e8, INF = -1e9;

    int n;
    int a[N];
    int b[N];
    int suma=0;int sumb=0;
    int key=0;

    void solve(){
        cin>>n;
        for(int i=0;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)cin>>b[i];
        b[0]=0;
        for(int i=1;i<=n;i++){
            key=b[i];b[i]=0;
            int suma=0;int sumb=0;
            int ans=0;
            for(int j=1;j<=n+1;j++){
                suma+=a[j-1];sumb+=b[j-1];
                ans=max(ans,suma-sumb);
            }
            b[i]=key;
            cout<<ans<<" ";
        }
        
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

100分题解:前缀和+后缀最大值

时间复杂度:\(O(n)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 1e5+10, MAX = 1e8, INF = -1e9;

    int n;
    int a[N];
    int b[N];
    int c[N];
    int e=0;
    int suma=0;int sumb=0;

    void solve(){
        cin>>n;
        for(int i=0;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)cin>>b[i];
        b[0]=0;
        for(int i=1;i<=n+1;i++){
            suma+=a[i-1];sumb+=b[i-1];
            c[i]=max(0ll,suma-sumb);
            e=max(e,c[i]);
        }
        stack<int> ans;
        for(int i=n+1;i>=1;i--){
            c[i]=max(c[i+1],c[i]);
            int x=max(e,c[i]+b[i-1]);
            x=min(suma,x);
            ans.push(x);
        }
        ans.pop();
        while(!ans.empty()){
            cout<<ans.top()<<" ";
            ans.pop();
        }
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第35次CSP认证第二题:字符串变换

80分题解:暴力哈希

时间复杂度:\(O(mnk)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    string s;
    string t;
    int n;
    int q;
    int e;
    map<char,char> f;

    void solve(){
        getline(cin,s);
        for(int i=0;i<=9;i++){
            f['0'+i]=(char)('0'+i);
        }
        for(int i=0;i<=25;i++){
            f['a'+i]=(char)('a'+i);
            f['A'+i]=(char)('A'+i);
        }
        f['#']='#';f[' ']=' ';
        cin>>n;
        cin.ignore();
        for(int i=1;i<=n;i++){
            getline(cin,t);
            f[t[1]]=t[2];
        }
        
        cin>>q;
        cin.ignore();
        while(q--){
            cin>>e;
            t=s;
            for(int i=0;i<t.size();i++){
                for(int j=1;j<=e;j++){
                    t[i]=f[t[i]];
                }
            }
            cout<<t<<endl;
        }
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

100分题解:循环

时间复杂度:\(O(mn)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    string s;
    string t;
    int n;
    int q;
    int e;
    map<char,char> f;
    map<char,vector<char>> mp;

    void solve(){
        getline(cin,s);
        for(int i=0;i<=9;i++){
            f['0'+i]=(char)('0'+i);
            mp['0'+i].pb((char)('0'+i));
        }
        for(int i=0;i<=25;i++){
            f['a'+i]=(char)('a'+i);
            f['A'+i]=(char)('A'+i);
            mp['a'+i].pb((char)('a'+i));
            mp['A'+i].pb((char)('A'+i));
        }
        f['#']='#';f[' ']=' ';
        mp['#'].pb('#');mp[' '].pb(' ');
        cin>>n;
        cin.ignore();
        for(int i=1;i<=n;i++){
            getline(cin,t);
            f[t[1]]=t[2];
            mp[t[1]].erase(mp[t[1]].begin());
            mp[t[1]].pb(t[2]);
        }
        for(auto &i:mp){
            char c=i.second[i.second.size()-1];
            while(c!=i.first){
                i.second.pb(f[c]);
                c=f[c];
            }
        }
        
        cin>>q;
        cin.ignore();
        while(q--){
            cin>>e;
            t=s;
            for(int i=0;i<t.size();i++){
                if(e%mp[t[i]].size()!=0)t[i]=mp[t[i]][e%mp[t[i]].size()-1];
            }
            cout<<t<<endl;
        }
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第34次CSP认证第二题:矩阵重塑(其二)

100分题解:矩阵一维压缩

时间复杂度:\(O(t+mn)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 1e4+10, MAX = 1e8, INF = -1e9;

    int a[N];
    int g[N][N];
    int m,n;
    int q;

    void f1(int x,int y){
        n=x;
        m=y;
    }

    void f2(){
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                g[i][j]=a[(j-1)*m+i];
            }
        }
        swap(m,n);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                a[(i-1)*m+j]=g[i][j];
            }
        }
    }

    void solve(){
        cin>>n>>m>>q;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[(i-1)*m+j];
            }
        }
        
        int op,x,y;
        while(q--){
            cin>>op>>x>>y;
            if(op==1)f1(x,y);
            else if(op==2)f2();
            else cout<<a[x*m+y+1]<<endl;//二维数组的一维压缩
        }
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第33次CSP认证第二题:相似度计算

100分题解:set

时间复杂度:\(O(nlogm)\) or \(O(mlogn)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int n,m;
    string s;
    set<string> sta;
    set<string> stb;

    void f(){
        for(int i=0;i<s.size();i++){
            s[i]=val(s[i]);
        }
    }

    void solve(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>s;
            f();
            sta.insert(s);
        }
        for(int i=1;i<=m;i++){
            cin>>s;
            f();
            stb.insert(s);
        }
        int num=0;
        for(auto i:sta){
            if(stb.find(i)!=stb.end()){
                num++;
            }
        }
        cout<<num<<endl;
        cout<<sta.size()+stb.size()-num<<endl;//容斥原理
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第32次CSP认证第二题:因子化简

100分题解:唯一分解定理,因子分解

时间复杂度:\(O(q\sqrt n)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 1e5+10, MAX = 1e8, INF = -1e9;

    int q;
    int n,k;
    vector<PII> v;

    void solve(){
        cin>>q;
        while(q--){
            cin>>n>>k;
            for(int i=2;i*i<=n;i++){
                int num=0;
                while(n%i==0){
                    num++;
                    n/=i;
                }
                v.pb({i,num});
            }
            if(n!=1)v.pb({n,1});
            int ans=1;
            for(auto i:v){
                if(i.second>=k)ans*=pow(i.first,i.second);
            }
            cout<<ans<<endl;
            v.clear();
        }
        return ;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第31次CSP认证第二题:坐标变换(其二)

80分题解:暴力模拟

时间复杂度:\(O(mn)\)

C++版

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<int,double> PID;//修改定义
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int n,q;
    int i,j;
    PID a[N];
    double x,y;


    void solve(){
        cin>>n>>q;
        for(int i=1;i<=n;i++){
            cin>>a[i].first>>a[i].second;
        }
        while(q--){
            cin>>i>>j>>x>>y;
            for(int k=i;k<=j;k++){
                if(a[k].first==1){
                    x*=a[k].second;
                    y*=a[k].second;
                }
                else{
                    double x0=x;
                    double y0=y;
                    x=x0*cos(a[k].second)-y0*sin(a[k].second);
                    y=x0*sin(a[k].second)+y0*cos(a[k].second);
                }
            }
            cout<<fixed<<setprecision(3)<<x<<" "<<y<< endl;//C++精度输出方式
        }
        return ;

    }

    signed main()
    {
        fast();//开启
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

C语言版:

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<int,double> PID;//修改定义
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int n,q;
    int i,j;
    PID a[N];
    double x,y;


    void solve(){
        cin>>n>>q;
        for(int i=1;i<=n;i++){
            scanf("%ld %lf",&a[i].first,&a[i].second);
        }
        while(q--){
            scanf("%ld %ld %lf %lf",&i,&j,&x,&y);
            for(int k=i;k<=j;k++){
                if(a[k].first==1){
                    x*=a[k].second;
                    y*=a[k].second;
                }
                else{
                    double x0=x;
                    double y0=y;
                    x=x0*cos(a[k].second)-y0*sin(a[k].second);
                    y=x0*sin(a[k].second)+y0*cos(a[k].second);
                }
            }
            printf("%.3lf %.3lf \n",x,y);//C语言版精度输出方式
        }
        return ;

    }

    signed main()
    {
        //fast();//关闭
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

100分题解:前缀和+前缀积

时间复杂度:\(O(m+n)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<int,char> PIC;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<int> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int n,q;
    int i,j;
    map<int,int> mpa;
    map<int,int> mpb;
    double x,y;
    vector<double> na;
    vector<double> nb;

    void solve(){
        cin>>n>>q;
        na.pb(1.0);nb.pb(0.0);
        for(int i=1;i<=n;i++){
            cin>>j>>x;
            if(j==1){
                na.pb(na[na.size()-1]*x);
            }
            else{
                nb.pb(nb[nb.size()-1]+x);
            }
            mpa[i]=na.size()-1;
            mpb[i]=nb.size()-1;
        }
        while(q--){
            cin>>i>>j>>x>>y;
            double d=na[mpa[j]]/na[mpa[i-1]];
            x*=d;
            y*=d;
            double x0=x;
            double y0=y;
            d=nb[mpb[j]]-nb[mpb[i-1]];
            x=x0*cos(d)-y0*sin(d);
            y=x0*sin(d)+y0*cos(d);
            cout<<fixed<<setprecision(3)<<x<<" "<<y<< endl;
        }
        return ;

    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第29次CSP认证第二题:垦田计划

100分题解:二分答案

时间复杂度:\(O(nlog(MAX(t)))\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<PII> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 1e5+10, MAX = 1e9, INF = -1e12, M = 10005;

    int n,m,k;
    int t[N],c[N];
    int maxs=-1;
    int losts=MAX;

    bool check(int mid){
        int e=0;
        for(int i=1;i<=n;i++){
            if(t[i]>=mid)e+=(t[i]-mid)*c[i];
        }
        return e<=m;
    }

    void solve(){
    	cin>>n>>m>>k;
    	for(int i=1;i<=n;i++){
    		cin>>t[i]>>c[i];
    		maxs=max(maxs,t[i]);
            losts=min(losts,t[i]);
    	}
    	int l=k;int r=maxs;
        while(l<r){
            int mid=(l+r)>>1;
            if(check(mid))r=mid;
            else l=mid+1;
        }
        cout<<l<<endl;
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

第25次CSP认证第二题:出行计划

100分题解:差分

时间复杂度:\(O(n)\)

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    #define val(a) (a<'a' ? (a-'A'+'a') : a)
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef pair<long long, long long> PLL;
    typedef priority_queue<PII> PQ;
    typedef priority_queue<int, vector<int>, greater<int>> Q;
    const int N = 1e6+10, MAX = 1e9, INF = -1e12, M = 10005;

    int n,m,k;
    int t,c;
    int b[N];
    int e;

    void solve(){
    	cin>>n>>m>>k;
        memset(b,0,sizeof b);
    	for(int i=1;i<=n;i++){
    		cin>>t>>c;
            int l=max(1ll,t-c+1);
            int r=t;
            b[l]++;b[r+1]--;
    	}
        for(int i=1;i<N;i++){
            b[i]+=b[i-1];
        }
        while(m--){
            cin>>e;
            cout<<b[e+k]<<endl;
        }

        
    	
    }

    signed main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }
posted @ 2025-03-15 21:31  Oaths  阅读(548)  评论(0)    收藏  举报