第五周题解

第 🖐🏻 周

一、SMU Summer 2024 Team Round 2

题面:contest(codeforces.com)

E - 签到题

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k,l;
int a[N];
 
signed main(){
    cin>>n;
    string s;
    cin>>s;
    map<char,int>v;
    for(int i=0;i<n;i++){
        v[s[i]]++;
    }
    int min1=INT_MAX;
    v['S']+=v['s'];
    v['H']+=v['h'];
    v['A']+=v['a'];
    v['N']+=v['n'];
    v['G']+=v['g'];
    v['I']+=v['i'];
    v['A']/=2;
    v['H']/=2;
    for(auto ed:v){
        if(ed.first=='S'||ed.first=='H'||ed.first=='N'||ed.first=='G'||ed.first=='A'||ed.first=='I') min1=min(min1,ed.second);
    }
    cout<<min1<<endl;
}

J - 主要考察素数筛 , 这里我用的是欧拉筛

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e6 + 10;

/*---------------------------------------------------------------*/
int prime[N];
bool vis[N];
void eular(int n)
{
    int cnt = 0;
    for(int i = 2 ; i <= n ; i++)
    {
        if(!vis[i]) prime[cnt++]=i;
        for(int j = 0 ; j < cnt ; j++)
        {
            if(i * prime[j] > n) break;
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0) break;

        }
    }
}
void solve() {
    int n;
    cin>>n;
    vector<int> a(n + 1) , b(n + 1);
    int k = 0;
    for(int i = 1 ; i <= n ; i++){
        cin >> a[i];
        b[i] = b[i-1] + a[i];
        if(vis[a[i]] == 1) k=1;
    }
    if(k==1){
        cout << 0 << endl;
        return;
    }
    if(!vis[a[0]] and n==1){
        cout << -1 << endl;
        return;
    }
    int min1 = LLONG_MAX;
    for(int i = 0 ;i < n ; i++){
        for(int j = i ; j <= n ; j++){
            if(vis[b[j] - b[i]] == 1){
                min1 = min(min1,j-i-1);
            }
        }
    }
    if(min1 == LLONG_MAX) cout << -1 << endl;
    else cout << min1 << endl;
}
signed main()
{
    IOS
    int t = 1;
    eular(1000000);
    cin >> t;
    while (t--) solve();
    return 0;
}

A - 一开始还以为是规律题,结果不是,队友写的

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=5e5 + 10;
const int N=2e6+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
int a[105][105];
void solve() {
	int n,m;
	cin>>n>>m;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=m;j++){
			for(int i1=0;i1<=n;i1++){
				for(int j1=0;j1<=m;j1++){
					if(i==i1 and j==j1){
						continue;
					}	
					int x1=i,y1=j,x2=i1,y2=j1;
					int d1=(x2-x1),d2=(y2-y1);
					int x3=x2+d2,y3=y2-d1;
					int x4=x1+d2,y4=y1-d1;
					if(x3>=0 and x3<=n and y3>=0 and y3<=m and x4>=0 and x4<=n and y4>=0 and y4<=m){
						a[x1][y1]++;
						a[x2][y2]++;
						a[x3][y3]++;
						a[x4][y4]++;
					}
				}
			}
		}
	}
	
	for(int i=0;i<=n;i++){
		for(int j=0;j<=m;j++){
			cout<<a[i][j]/4<<" ";
		}
		cout<<endl;
	}
}
signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
//	cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

M - 思维题吧,也有一点数学 , 主要是要确定青蛙能跳的地方 , 队友三分写的 , 赛时我写的跳哪些的地方没有实现 , 赛后改了一下

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e6 + 10;

/*---------------------------------------------------------------*/

signed main(){
    int n;
    cin >> n;
    int m = ceil(sqrt(n));
    cout << n - m << endl;
    int a = n - m;
    for(int i = 0 ; i < n - 1 ; i++){
        if(a > 0 and i % m != m - 1){
            a--;
            cout << i + 1 << " " << i + 2 << endl;
        }

    }
    for(int i = 0 ; i < n - m ; i++){
        cout << i + 1 << " " << i + m + 1 << endl;
    }
}

二、河南萌新联赛2024第(四)场:河南理工大学

B-小雷的神奇电脑(nowcoder.com)

贪心

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 10;

/*---------------------------------------------------------------*/
int qmi(int a,int b){
   int res = 1;
   while (b)
   {
       if (b & 1) res = (res * a);
       a = (a * a);
       b >>= 1;
   }
   return res;
}    // 快速幂
void solve(){
    int n , m;
    cin >> n >> m;
    vector<int> a(n + 1);
    for(int i = 1 ; i <= n ; i++) cin >> a[i];
    sort(a.begin() + 1 , a.end());
    vector<int> s;
    for(int i = 2 ; i <= n ; i++) s.push_back(a[i] ^ a[i - 1]);
    sort(s.begin() , s.end());
    cout << (s[0] ^ (qmi(2,m) - 1)) << endl;
}
signed main(){
    int t = 1 ;
    //cin >> t;
    while(t--) solve();
}

C-岗位分配(nowcoder.com)

排列组合

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e+6 + 10;

/*---------------------------------------------------------------*/
int f[N];
int pow(int x,int y){ //快速幂
    int ans = 1;
    for(int i = y ; i ; i >>= 1 ,x = x * x % mod) if(i & 1) ans = ans * x % mod;
    return ans;
}
int C(int n,int m){ //求组合数
    if(m>n) return 0;
    return ((f[n] * pow(f[m],mod - 2)) % mod * pow(f[n-m],mod - 2) % mod);
}

void solve(){
    int n , m , sum = 0;
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i++) {
        int x;
        cin >> x;
        sum += x;
    }
    cout << C(m + n - sum , n) % mod << endl;
}
signed main(){
    int t = 1 ;
    f[0]=1;
    for(int i = 1 ;i <= N ; i++) f[i] = (f[i-1] * i) % mod;
    //cin >> t;
    while(t--) solve();
}

D-简单的素数(nowcoder.com)

签到

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e8 + 10;

/*---------------------------------------------------------------*/

void solve(){
    int n;
    cin >> n;
    for(int i = 2 ; i <= n / i ; i++){
        if(n % i ==0) {
            cout << "No" << endl;
            return;
        }
    }
    cout << "Yes" << endl;
}
signed main(){
    int t;
    cin >> t;
    while(t--) solve();
}

E-AND(nowcoder.com)

先用欧拉筛筛出质数,然后二分查找,区间内的质数个数即为 r - l + 1 , 因为质数只有2为偶数,所以区间包含2时,答案为质数个数 - 2,不包含2就是0.

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e8 + 10;

/*---------------------------------------------------------------*/
int prime[N];
bool vis[N];
int cnt;
void eular(int n)
{
    for(int i = 2 ; i <= n ; i++)
    {
        if(!vis[i]) prime[cnt++] = i;
        for(int j = 0 ; j < cnt ; j++)
        {
            if(i * prime[j] > n) break;
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0) break;
        }
    }
}

void solve(){
    int l , r;
    cin >> l >> r;
    int ans ,l1 = 0 , r1 = cnt - 1, l2 = 0 , r2 = r1;
    while(l1 < r1){
        int mid = (l1 + r1) >> 1;
        if(prime[mid] >= l) r1 = mid;
        else l1 = mid + 1;
    }
    while(l2 < r2){
        int mid = (l2 + r2) >> 1;
        if(prime[mid] >= r) r2 = mid;
        else l2 = mid + 1;
    }
    if(prime[l2] > r) l2--;
    ans = l2 - l1 + 1;
    cout << ans << " ";
    if(l > 2 || ans == 1) cout << 0 << endl;
    else cout << ans - 2 << endl;
}
signed main(){
    eular(1e8);
    int O_O;
    cin >> O_O;
    while(O_O--) solve();
}

F-小雷的算式(nowcoder.com)

签到

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e8 + 10;

/*---------------------------------------------------------------*/



void solve(){
    string s , c;
    cin >> s;
    int len = s.size();
    vector<int> a;
    for(int i = 0 ; i < len ; i ++) {
        if(s[i] == '+') {
            if(c.size()) a.push_back(stoi(c)),c.clear();
        }else c += s[i];
    }
    if(c.size()) a.push_back(stoi(c)),c.clear();
    sort(a.begin() , a.end() , greater<int>());
    int ans = 0;
    for(int i = 0 ; i < a.size() ; i++){
        if(i != a.size() - 1) cout << a[i] << "+";
        else  cout << a[i] << endl;
        ans += a[i];
    }
    cout << ans << endl;
}
signed main(){
    int t = 1;
    //cin >> t;
    while(t--) solve();
}

H-聪明且狡猾的恶魔(nowcoder.com)

签到题,只不过最开始被数据搞了

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e8 + 10;

/*---------------------------------------------------------------*/

int n = 0 , x = 0 , n1 , x1;
int ans = 0;
void solve(){
    cin >> x1 >> n1;
    x += x1;
    n = max(n , n1);
}
signed main(){
    int t = 1 ;
    cin >> t;
    while(t--) solve();
    cout << x - (n - 1) / 2 << endl;
}

 I-马拉松(nowcoder.com)

题读错了,一开始以为是遍历一棵树,没想到是dfs把路径跑一遍,标记走过的地方,最后结果是经过两个点的路径数相乘

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 3e5 + 10;

/*---------------------------------------------------------------*/

int n , x , y , ans;
vector<int> G[N];
bool vis[N] , pass[N];
int sum[N];
int dfs(int  a){
    vis[a] = 1;
    sum[a] = 1;
    if(a == x) pass[a] = 1;
    for(auto i : G[a]){
        if(!vis[i]){
            sum[a] += dfs(i);
            if(pass[i]) pass[a] = 1;
        }
    }
    return sum[a];
}
void solve(){
    cin >> n >> x >> y;
    for(int i = 1 ; i < n ; i++) {
        int f , s;
        cin >> f >> s;
        G[f].push_back(s);
        G[s].push_back(f);
    }
    dfs(y);
    int temp;
    for(auto i : G[y]){
        if(pass[i]){
            temp = sum[y] - sum[i];
        }
    }
    cout << temp * sum[x] << endl;
}
signed main(){
    int O_O = 1;
    //cin >> O_O;
    while(O_O--) solve();
}

K-比赛(nowcoder.com)

树状数组,维护当前数字左边比他大的,右边比他小的,减去相等的,就是答案

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e4 + 10;

/*---------------------------------------------------------------*/
int n,a[N],b[N],c[N],d[N];
int b1[N],c1[N],d1[N];
int t[100005];
void change(int x,int num){
    for(int i = x ; i <= 1e5 ; i += lowbit(i)) t[i] += num;
}
int query(int x){
    int sum = 0;
    for(int i = x ; i > 0 ; i -= lowbit(i)) sum += t[i];
    return sum;
}
void solve(){
    for(int  i = 1 ; i <= 1e5 ; i++) t[i] = 0;
    cin >> n;
    for(int i = 1 ; i <= n ; i++) {
        cin >> a[i];
        b[i] = query(a[i]);
        c[i] = query(1e5) - query(a[i] - 1);
        d[i] = query(a[i]) - query(a[i] - 1);
        change(a[i],1);
    }
    for(int  i = 1 ; i <= 1e5 ; i++) t[i] = 0;
    int ans = 0;
    for(int i = n ; i >= 1 ; i--){
        b1[i] = query(a[i]);
        c1[i] = query(1e5) - query(a[i] - 1);
        d1[i] = query(a[i]) - query(a[i] - 1);
        change(a[i],1);
        ans += (b1[i] * c[i] + c1[i] * b[i] - d1[i] * d[i]);
    }
    cout << ans << endl;
}

signed main(){
    int O_O;
    cin >> O_O;
    while(O_O--) solve();
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值