2022.07.08 暑假集训 个人排位赛

Posted 晁棠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022.07.08 暑假集训 个人排位赛相关的知识,希望对你有一定的参考价值。

2022.07.08 暑假集训 个人排位赛(三)

赛后反省

动态规划的敏感度不够,还是一直在错的方法死磕。然后另外一道题对于一些特征不太敏感,已经接近正解了,就差一步。

继续加油。

Problem A

出处

Codeforces-689D

题解

ST表+二分

利用ST表之后,枚举区间的左坐标。当右区间不断扩大的时候,最大值是一个递增序列,最小值是一个递减序列。所以用两次二分,来找到在两段序列中最大值和最小值相等的区间是否存在。

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

const int N = 1e6 + 6;
int n, T = 1;
int a[N][22];
int b[N][22];

int get_max(int x, int y) 
    int mid = log2(y - x + 1);
    return max(a[x][mid], a[y - (1 << mid) + 1][mid]);


int get_min(int x, int y) 
    int mid = log2(y - x + 1);
    return min(b[x][mid], b[y - (1 << mid) + 1][mid]);


bool check_L(int x, int y) 
    int minn = get_min(x, y);
    int maxn = get_max(x, y);
    if (maxn >= minn) return true;
    else return false;


bool check_R(int x, int y) 
    int minn = get_min(x, y);
    int maxn = get_max(x, y);
    if (maxn > minn) return true;
    else return false;



void ready()

    cin >> n;
    ffor(i, 1, n) 
        cin >> a[i][0];
    
    ffor(j, 1, 18) 
        ffor(i, 1, n) 
            a[i][j] = max(a[i][j - 1], a[i + (1 << (j - 1))][j - 1]);
        
    
    //mst(b,INF);
    ffor(i, 1, n) 
        cin >> b[i][0];
    
    ffor(j, 1, 18) 
        ffor(i, 1, n) 
            b[i][j] = min(b[i][j - 1], b[i + (1 << (j - 1))][j - 1]);
        
    
    int ans = 0;
    ffor(i, 1, n) 
        int L = 0, R = 0;
        int l = i, r = n, mid;
        while (l < r) 
            mid = l + r >> 1;
            if (check_L(i, mid)) 
                r = mid;
            
            else 
                l = mid + 1;
            
        
        L = l;
        l = i; r = n;
        while (l < r) 
            mid = l + r + 1>> 1;
            if (check_R(i, mid)) 
                r = mid - 1;
            
            else 
                l = mid;
            
        
        R = l;
       // cout << "i=" << i << ' ' << L << ' ' << R << '\\n';
        if (get_max(i, L) == get_min(i, R)) 
            ans += R - L + 1;
        
    
    cout << ans;



void work()




signed main()

    IOS;
    ready();
    //	cin>>T;
    while (T--) 
        work();
    
    return 0;






Problem B

出处

Codeforces-687C

题解

动态规划。

d p [ i ] [ j ] dp[i][j] dp[i][j]代表值为i时是否能被j给构造。如果能则为1,否为0。

如果 d p [ i ] [ j ] = 1 dp[i][j]=1 dp[i][j]=1,那么当加入一个新的值c时, d p [ i + c ] [ j ] = 1 dp[i+c][j]=1 dp[i+c][j]=1 d p [ i + c ] [ j + c ] = 1 dp[i+c][j+c]=1 dp[i+c][j+c]=1都成立。那么转移方程也得到了。

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm> 
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;


const int N = 505;
bool dp[N][N];
int n, T = 1, k;

void ready()

	cin >> n >> k;
	dp[0][0] = true;
	ffor(t, 1, n) 
		int c;
		cin >> c;
		rrep(i, k, c) 
			ffor(j, 0, k-c) 
				if (dp[i - c][j])
					dp[i][j] = dp[i][j + c] = true;
			
		
	



void work()

	int ans = 0;
	ffor(i, 0, k) ans += dp[k][i];
	cout << ans << '\\n';
	ffor(i, 0, k) 
		if (dp[k][i])
			cout << i << ' ';
	


signed main()

	IOS;
	//	cin>>T;
	while (T--) 
		ready();
		work();
	
	return 0;






Problem F

出处

Codeforces-702D

题解

思维题。

距离比较小,直接开车就到达。

如果k距离时,走路快过汽车走并且修车,那么先开车走k公里,剩下的路全都走路。

如果k距离时,走路慢过汽车走并修车,那么后面每个k公里都开车,直到剩下比k公里小的路程没走时,考虑一下修车再走快还是直接走路快,进行选择即可。

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

int n, T = 1;
int d,k,a,b,t;


void ready()

    cin>>d>>k>>a>>b>>t;
    if(d<=k)
        cout<<d*a;
        return;
    
    if(a*k+t>b*k)
        int ans=k*a;
        d-=k;
        ans+=d*b;
        cout<<ans;
        return;
    
    else
        int cnt=d/k;
        int ans=cnt*a*k + (cnt-1)*t;
        d=d%k;
        if(cnt==0) ans=0;
        if(a*d+t>=b*d)
            ans+=b*d;
        else
            ans+=a*d;
            if(cnt) ans+=t;
        
        cout<<ans;
    



void work()




signed main()

	IOS;
    ready();
	//	cin>>T;
	while (T--) 
		work();
	
	return 0;






Problem G

出处

Codeforces-1234A

题解

平均数,上进位。

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include 2022.07.08 暑假集训 个人排位赛

2022.07.15 暑假集训 个人排位赛

2022.07.13 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛