第四周题解

第 👋 - 👆 周

一、睿抗训练(武汉工程大学202GPLT选拔赛)

比赛链接 :🔗(我是链接)

签到题就不赘述了

C-L1-3 Pokémon_武汉工程大学2020GPLT选拔赛(nowcoder.com)

有点卡细节,闪光卡的概率为1%,那么非闪光卡的概率则为99%

#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 = 1e5 + 10;
 
/*------------------------------------------------------------------*/
signed main(){
    double a[10];
    for(int i=0;i<7;i++){
        string s;
        cin>>s;
        s.pop_back();
        a[i]=stod(s);
    }
    int c,f;
    cin>>c>>f;
    if(f) cout<<fixed<<setprecision(2)<<a[c]*0.01<<'%'<<endl;
    else cout<<fixed<<setprecision(2)<<a[c]*0.99<<'%'<<endl;
}

F-L1-6 分鸽子_武汉工程大学2020GPLT选拔赛(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 = 1e5 + 10;

/*-----------------------------------------*/
int a[100005],n,m;
bool check(int x){
    if(x==0) return 0;
    int num=0;
    for(int i = 1 ; i <=n ; i++) num+=a[i]/x;
    return num>=m;
}
signed main(){
    cin>>n>>m;
    for(int i = 1 ; i <= n ; i++) cin>>a[i];
    int l=0,r=1e18,ans=0;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)) ans=mid,l=mid+1;
        else r=mid-1;
    }
    cout<<ans<<endl;
}

G-L1-7 拼接梯子_武汉工程大学2020GPLT选拔赛(nowcoder.com)

思路:位运算题,把要拼接的梯子按位分解,输出最高位,如果是奇数则无法分

#include<bits/stdc++.h>
using namespace std;
#define ll 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 = 1e5 + 10;

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

signed main(){
    ll n,m;
    cin>>n>>m;
    if(m % 2 == 1) cout<<"No";
    else {
        string s;
        while(m){
            if(m % 2 == 1) s='1'+s;
            else s='0'+s;
            m/=2;
        }
        //cout<<s<<endl;
        int len=s.size();
        len--;
        ll a=((ll)1<<len);
        if(len<=n){
            cout<<"Yes"<<endl;
            cout<<a;
        }else cout<<"No";
    }
}

H-L1-8 幻想乡炼金学_武汉工程大学2020GPLT选拔赛(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 = 1e5 + 10;

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

vector<string> a[166];
int b[166];
signed main(){
    string s,c,h;
    getline(cin,s);
    bool f = 0;
    int cnt = 0;
    for(int i = 0 ; i < s.size() ; i++){
        if(s[i] == ' ') continue;
        if(!islower(s[i]) and c.size()){
            a[cnt].push_back(c);
            if(!f) cnt++;
            c.clear();
        }
        if(isupper(s[i])) c = s[i];
        else if(islower(s[i])) c += s[i];
        else if(s[i] == '(') f = 1;
        else if(s[i] == ')') f = 0 , cnt++;
        else if(s[i] == '{'){
            int num=0;
            i++;    
            while(s[i] != '}'){
                if(s[i] == ' '){
                    i++;
                    continue;
                }
                else num = num * 10 + s[i] - '0';
                i++;
            }
            b[cnt-1] = num;
        }
    }
    if(c.size()) a[cnt++].push_back(c);
    for(int i = 0 ; i < cnt ; i++) if(!b[i]) b[i] = 1;
    for(int i = 0 ; i < cnt ; i++){
        for(int j = 0 ; j < a[i].size() ; j++){
            for(int k = 0 ; k < b[i] ; k++){
                cout<<a[i][j];
            }
        }
    }
}

 I-L2-1 特殊的沉重球_武汉工程大学2020GPLT选拔赛(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 = 1e9 + 7;
const int N = 1e5 + 10;
 
/*-----------------------------------------------------------------*/
int n,w,ans;
int c[25],a[25];
void dfs(int k , int res){
    if(res >= ans) return;
    if(k >= n){
        ans = min(ans , res);
        return;
    }
    for(int i = 0 ; i <= res ; i++){
        if(a[i] + c[k] <= w){
            a[i] += c[k];
            dfs(k+1 , res);
            a[i] -= c[k];
        }
    }
    a[res+1] += c[k];
    dfs(k+1 , res+1);
    a[res+1] -= c[k];
}
signed main(){
    ans=INT_MAX;
    cin >> n >> w;
    for(int i = 0 ;i < n ; i++) cin >> c[i];
    sort(c  , c + n  , greater<int>());
    dfs(0,0);
    cout << ans + 1 << endl;
}

二、SMU Summer 2024 Team Round 1

Problem - C - Codeforces

思路:比较恶心的一道题,一直在想怎么模拟撒谎的人,可是没想到其实撒谎的人最多就一个

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5+7;
const int mod = 998244353;
int n, m, k;
int a[N];

void sovle(){
    cin>>n>>k;
    int sum=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    if(sum==k) cout<<n<<endl;
    else cout<<n-1<<endl;
}

signed main()
{	
    ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
    int t = 1;
    //cin>>t;
    while (t--){
        sovle();
    }

    return 0;
}

J (codeforces.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 = 25555;

/*-----------------------------------------------------------------*/
string w[13] = {"1p","9p","1s","9s","1m","9m","1z","2z","3z","4z","5z","6z","7z"};
map<string,int> mp;
void solve(){
    mp.clear();
    vector<string> a;
    string s,c;
    cin >> s;
    int len = s.size();
    for(int i = 0 ; i < len ; i++){
        if(c.size() == 2){
            a.push_back(c);
            c.clear();
        }
        c += s[i];
    }
    a.push_back(c);
    for(int i = 0 ; i < a.size() ; i++) mp[a[i]]++;
    int num = 0,cnt = 0;
    for(auto x:mp){
        if(x.second==2) num++;
    }
    for(int i = 0 ; i < 13 ; i++){
        if(mp[w[i]]) cnt++;
    }
    if(cnt == 13) {
        cout << "Thirteen Orphans" << endl;
    }else if(num == 7){
        cout<< "7 Pairs" << endl;
    }else {
        cout << "Otherwise" <<endl;
    }
}
signed main(){
    int t;
    cin >> t;
    while(t--) solve();
}

Problem - L - Codeforces

思路:把各个时间段开的门存进一个数组里,map记录,然后遍历map,全部dijsktra跑一遍,可惜赛时dijsktra写拉了,没过😭

#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 = 1e5 + 10;

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

int n,m,k,T;
int a[N],dist[20][N];
bool vis[N];
struct b{
    int p,l,r;
}door[20];
struct edge{
    int v,w;
    bool operator< (const edge&x) const{
        return x.w < w;
    }
};
vector<edge> P[N];
void dijkstra(int s){
    priority_queue<edge> q;
    for(int i = 1 ; i <= n ; i++){
        dist[s][i] = INT_MAX;
        vis[i] = false;
    }
    q.push({door[s].p,0});
    dist[s][door[s].p] = 0;
    while(!q.empty()){
        edge x = q.top();
        q.pop();
        if(vis[x.v]) continue;
        vis[x.v] = true;
        for(auto y:P[x.v]){
            if(dist[s][x.v] + y.w < dist[s][y.v]){
                dist[s][y.v] = dist[s][x.v] + y.w;
                q.push({y.v,dist[s][y.v]});
            }
        }
    }
}
map<vector<int>,int> mp;
vector<int> num[N];
signed main(){
    cin >> n >> m >> k >> T;
    for(int i = 1 ; i <= n ; i++) cin >> a[i];
    for(int i = 1 ; i <= k ; i++) cin >> door[i].p >> door[i].l >> door[i].r;
    for(int i = 1 ; i <= m ; i++){
        int u,v,w;
        cin >> u >> v >> w;
        P[u].push_back({v,w});
        P[v].push_back({u,w});
    }
    for(int i = 1 ; i <= k ; i++) dijkstra(i);
    for(int i = 1 ; i <= T ; i++){
        for(int j = 1 ; j <= k ; j++){
            if(door[j].l <= i && door[j].r >= i){
                num[i].push_back(j);
            }
        }
        mp.insert(mk(num[i],0));
    }

    for(auto& x:mp){
        for(int i = 1 ; i <= n ; i++){
            int ans = LLONG_MAX;
            vector<int> open = x.first;
            for(auto& j : open){
                ans = min(dist[j][i]*a[i],ans);
            }
            x.second += ans;
        }
    }
    for(int i = 1 ; i <= T ; i++){
        if(num[i].empty()) cout << "-1" <<endl;
        else cout << mp[num[i]] <<endl;
    }
}

三、河南萌新联赛2024第(三)场:河南大学 

B-正则表达式_河南萌新联赛2024第(三)场:河南大学 (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 = 1e5 + 10;

/*-----------------------------------------------------------------*/
signed main(){
    int t = 0,ans = 0;
    cin >> t;
    while(t--){
        string s,c;
        cin >> s;
        bool f = 0;
        int sum = 0;
        int len = s.size();
        for(int i = 0 ; i < len ; i++){
            if(s[i] == '.') {
                sum = stoi(c);
                if(sum < 0 or sum >= 256){
                    f = 1;
                    break;
                }
                c.clear();
            }
            else c += s[i];
        }
        sum = stoi(c);
        if(sum >= 256 or sum < 0) f=1;
        if(!f) ans++;
    }
    cout << ans <<endl;
}

 C-Circle_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

算是一道数学题吧,一开始把5画错了wa了1发,分的区域其实就是n * n - n + 2

#include<bits/stdc++.h>
using namespace std;
long long t,n;
int main(){
    cin>>t;
    while(t--){
        cin>>n;
        if(n==0) cout<<1<<' ';
        else cout<<n*n-n+2<<' ';    
    }
    return 0;
}

E-区间_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

正解线段树🌲,还没学;不过这题数据水了,暴力竟然能过

贴个官解的代码吧

#include<bits/stdc++.h>
using namespace std;
template<class info>
struct segmenttree {
	vector<info>tree;
	int n;
	segmenttree(int n) {
		this->n = n;
		tree.resize(4 * n + 10);
	}
	void modify(int i, int st, int ed, int pos, const info u) {
		if (st == ed) {
			tree[i] = u;
			return;
		}
		int mid = (st + ed) / 2;
		if (pos <= mid)modify(i * 2, st, mid, pos, u);
		if (pos > mid)modify(i * 2 + 1, mid + 1, ed, pos, u);
		tree[i] = tree[i * 2] + tree[i * 2 + 1];
	}
	info ask(int i, int st, int ed, int l, int r) {
		if (st >= l && ed <= r) {
			return tree[i];
		}
		int mid = (st + ed) / 2;
		info u;
		if (l <= mid && r > mid) {
			u = ask(i * 2, st, mid, l, mid) + ask(i * 2 + 1, mid + 1, ed, mid + 1, r);
		}
		else if (r <= mid)u = ask(i * 2, st, mid, l, r);
		else if (l > mid)u = ask(i * 2 + 1, mid + 1, ed, l, r);
		return u;
	}
	info ask(int l, int r) {
		return ask(1, 1, n, l, r);
	}
	void modify(int pos, info u) {
		modify(1, 1, n, pos, u);
	}
};
struct info {
	int l, r, lpos, rpos;
	int ans;
};
info operator+(const info& ls, const info& rs) {
	info u;
	u.r = rs.r; u.l = ls.l;
	u.ans = max(ls.ans, rs.ans);
	if (ls.lpos == 0 && rs.lpos == 0) {
		u.ans = max(u.ans, u.r - u.l + 1);
		u.lpos = 0; u.rpos = 0;
	}
	else if (ls.lpos == 0 && rs.lpos) {
		u.ans = max(u.ans, ls.r - ls.l + 1 + rs.lpos - rs.l);
		u.lpos = rs.lpos;
		u.rpos = rs.rpos;
	}
	else if (ls.lpos && rs.lpos == 0) {
		u.ans = max(u.ans, ls.r - ls.rpos + rs.r - rs.l + 1);
		u.lpos = ls.lpos;
		u.rpos = ls.rpos;
	}
	else {
		u.ans = max(u.ans,rs.lpos-ls.rpos-1);
		u.lpos = ls.lpos;
		u.rpos = rs.rpos;
	}
	return u;
}
int main() {
	int n;
	cin >> n;
	int q; cin >> q;
	segmenttree<info>seg(n);
	for (int i = 1; i <= n; i++) {
		seg.modify(i, info{ i,i,0,0,1 });
	}
	for (int i = 1; i <= q; i++) {
		int op; cin >> op;
		if (op == 1) {
			int x; cin >> x;
			if (seg.ask(x, x).lpos == 0) {
				seg.modify(x, info{ x,x,x,x,0 });
			}
			else {
				seg.modify(x, info{ x,x,0,0,1});
			}
		}
		else {
			int l, r; cin >> l >> r;
			cout << seg.ask(l, r).ans << "\n";
		}
	}
	return 0;
}

F-累加器_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:位运算,找到规律就行,每个1的位可以为前面贡献2^{n},然后每位的变化就是y + 1位上贡献的,就可以得出答案

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<string,string>
#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 = 1e5 + 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;
}   // kuai su mi
void solve(){
    int x,y,x1,ans=0;
    cin >> x >> y;
    string s,c;
    x1 = x;
    while(x1){
        if(x1 % 2) s = s + '1';
        else s = s + '0';
        x1 /= 2;
    }
    x1 = x + y;
    while(x1){
        if(x1 % 2) c =  c + '1';
        else c =  c + '0';
        x1 /= 2;
    }
    ans += y;
    for(int i = 1 ; i < c.size() ; i++){
        if(i <= s.size() and s[i-1] == '1') y += qmi(2,i-1);
        ans += y / qmi(2,i);
    }
 
    cout << ans << endl;
}
signed main(){
    int t;
    cin >> t;
    while(t--) solve();
}

G-求值_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:将给定公式变形,z = n - x - y ,然后再固定一个x,三分查找y就能得出答案

#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 = 1e6 + 10;

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

void solve(){
    int a,b,c,n,w;
    cin >> a >> b >> c >> n >> w;
    int ans = 1e18;
    auto check = [&](int x,int y){
        return abs((x * a) + (y * b) + (n - x - y) * c - w);
    };
    for(int i = 0 ; i <= n ; i++){
        int l = 0 , r = n - i;
        while(l <= r){
            int mid1 = l + (r - l) / 3;
            int mid2 = r - (r - l) / 3;
            ans = min(ans,min(check(i,mid1),check(i,mid2)));
            if(check(i,mid1) > check(i,mid2)) l = mid1 + 1;
            else r = mid2 - 1;
        }
    }
    cout << ans << endl;
}

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

 I-游戏_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:dijsktra最短路,先从1开始跑一遍,看能否到达 k 拿到钥匙 或者 到达 n ,如果都无法到达就输出 -1 , 能到达 k 的话还要从 k 跑一遍dijsktra

#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 = 2e5 + 10;

/*-----------------------------------------------------------------*/
int n,m,k;
struct edge{
    int v,w,d;
};
vector<edge> G[N];
int dist[N];
bool vis[N];
void dijstra1(int x){
    for(int i = 1 ; i <= n ; i++){
        dist[i] = LLONG_MAX;
        vis[i] = 0;
    }
    priority_queue<PII , vector<PII> , greater<PII> > q;
    q.push(mk(0,x));
    dist[x] = 0;
    while(q.size()){
        auto v = q.top();
        q.pop();
        if(vis[v.second]) continue;
        vis[v.second] = 1;
        for(auto y : G[v.second]){
            //cout << y.v << " : " << dist[y.v] << " " << v.second << " " << v.first << endl;
            if(y.d == 0) continue;
            if(dist[v.second] + y.w < dist[y.v]){
                dist[y.v] = dist[v.second] + y.w;
                q.push(mk(dist[y.v],y.v));
                //cout << y.v << " : " << dist[y.v] << " " << v.second << " " << v.first << endl;
            }
        }
    }
}
void dijstra2(int x){
    for(int i = 1 ; i <= n ; i++){
        vis[i] = 0;
    }
    priority_queue<PII , vector<PII> , greater<PII> > q;
    q.push(mk(dist[x],x));
    while(q.size()){
        auto v = q.top();
        q.pop();
        if(vis[v.second]) continue;
        vis[v.second] = 1;
        for(auto y : G[v.second]){
            if(dist[v.second] + y.w < dist[y.v]){
                dist[y.v] = dist[v.second] + y.w;
                q.push(mk(dist[y.v],y.v));
                //cout << y.v << " : " << dist[y.v] << " " << v.second << " " << v.first << endl;
            }
        }
    }
}
signed main(){

    cin >> n >> m >> k;
    for(int i = 1 ; i <= m ; i++){
        int a,b,c,d;
        cin >> a >> b >> c >> d;
        G[a].push_back({b,c,d});
        G[b].push_back({a,c,d});
    }
//    for(int i = 1 ; i <= n ; i++){
//        for(auto x : G[i]){
//            cout << i << " : " << x.v << " " << x.w << " " << x.d <<endl;
//        }
//        cout << endl;
//    }
    dijstra1(1);
    if(dist[k] == LLONG_MAX and dist[n] == LLONG_MAX){
        cout << -1 << endl;
        return 0;
    }
    if(dist[k] != LLONG_MAX) dijstra2(k);
    cout << dist[n] << endl;
}

J-keillempkill学姐の卷积_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:比较麻烦的模拟,按照题意写就行

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<string,string>
#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 = 1e5 + 10;

/*-----------------------------------------------------------------*/
int a[25][25],b[25][25];
signed main(){
    int n,m;
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i++){
        for(int j = 1 ; j <= n ; j++){
            cin >> a[i][j];
        }
    }
    for(int i = 1 ; i <= m ; i++){
        for(int j = 1 ; j <= m ; j++){
            cin >> b[i][j];
        }
    }
    vector<int> c;
    int sum = 0;
    for(int i = 1 ; i <= m ; i++){
        for(int k = 1 ; k <= m ; k++){
            if(i + n - 1<= m and k + n - 1<= m){
                sum = 0;
                int x = 1 , y = 1;
                for(int j = i ; x <= n ; j++,x++){
                    for(int l = k ; y <= n ; l++,y++){
                        //cout << x << " " << y << " " << j << " " << l << endl;
                        sum += a[x][y] * b[j][l];
                    }
                    y = 1;
                }
                c.push_back(sum);
            }
        }
    }
    //cout << c.size() << endl;
    int x = 0;
    for(int i = 1 ; i <= m - n + 1 ; i++){
        for(int j = 1 ; j <= m - n + 1 ; j++){
            cout<<c[x]<<" ";
            x++;
        }
        cout << endl;
    }
}

L-SSH_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

又是恶心的字符串模拟,用几个map就能写出来

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<string,string>
#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 = 1e5 + 10;

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

int n,m,q;
map<string,string> mp;
map<string,vector<string>> mp2,mp3;
signed main(){
    cin >> m >> n >> q;
    for(int i = 1 ; i <= m ; i++){
        string s,c;
        cin >> s >> c;
        mp[s] = c;
    }
    for(int i = 1 ; i <= n ; i++){
        string s,c,h;
        int k,t;
        cin >> s >> k;
        for(int j = 1 ; j <= k ; j++){
            cin >> c >> t;
            mp2[s].push_back(c);
            for(int l = 1 ; l <= t ; l++){
                cin >> h;
                mp3[c].push_back(mp[h]);
            }
        }
    }

    while(q--){
        string s,c,h;
        cin >> s >> c >> h;
        bool ok1=0,ok2=0;
        for(auto x:mp2[c]){
            if(x == s){
                ok1 = 1;
                break;
            }
        }
        for(auto x : mp3[s]){
            if(x == h){
                ok2 = 1;
                break;
            }
        }
        if(ok1 and ok2) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}

四、睿抗训练(上海理工大学2022GPLT选拔赛)

 A-A+B Problem(GPLT)上海理工大学校内选拔赛(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 = 1e6 + 10;

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

void solve(){
    int n,sum = 0;
    cin >> n;
    vector<int> a(n+1),b(n+1);
    for(int i = 1 ; i <= n ; i++){
        cin >> a[i];
        b[i] = a[i];
    }
    sort(b.begin() + 1,b.end(),greater<int>());
    for(int i = 1 ; i <= n ; i++){
        if(a[i] == b[1]) cout << a[i] + b[2] << " ";
        else cout << a[i] + b[1] << " ";
    }
}
signed main(){
    IOS;
    int t = 1;
    //cin >> t;
    while(t--) solve();
}

B-Komorebi的数学课_2022年(GPLT)上海理工大学校内选拔赛 (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 = 1e6 + 10;

/*-----------------------------------------------------------------*/
int n;
int qmi(int a,int b){
   int res = 1;
   while (b)
   {
       if (b & 1) res = (res * a) % (n + 2);
       a = (a * a) % (n + 2);
       b >>= 1;
   }
   return res % (n + 2);
}   // kuai su mi
void solve(){
    cin >> n;
    cout << qmi(n,n)%(n + 2);
}
signed main(){
    IOS;
    int t = 1;
    //cin >> t;
    while(t--) solve();
}

C-次佛锅_2022年(GPLT)上海理工大学校内选拔赛(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 = 1e6 + 10;

/*-----------------------------------------------------------------*/
map<string,int> mp;
void solve(){
    string s,c,h;
    getline(cin,s);
    int len = s.size();
    for(int i = 0 ; i < len ; i++){
        if(s[i] == ' '){
            if(c.size() and h.size()) mp[c] += stoi(h) , c.clear() , h.clear();
            else continue;
        }
        else if(isalpha(s[i])) c += s[i];
        else if(isalnum(s[i])) h += s[i];
    }
    if(c.size() and h.size()) mp[c] += stoi(h) , c.clear() , h.clear();
    int q;
    cin >> q;
    while(q--){
        cin >> s;
        cout << mp[s] << endl;
    }
}
signed main(){
    IOS;
    int t = 1;
    //cin >> t;
    while(t--) solve();
}

D-Setsuna的K数列_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)

思路:一开始没发现什么规律,就按他的大小排了一下序,结果发现就是和二进制位有关,二进制位上是1的就加上 k^{n} 

#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 = 1e6 + 10;

/*-----------------------------------------------------------------*/
int qmi(int a,int b){
   int res = 1;
   while (b)
   {
       if (b & 1) res = (res * a) % mod;
       a = (a * a) % mod;
       b >>= 1;
   }
   return res % mod;
}   // kuai su mi
void solve(){
    int n,k,ans = 0;
    cin >> n >> k;
    string s;
    while(n){
        if(n % 2) s += '1';
        else s += '0';
        n /= 2;
    }
    //cout << s << endl;
    for(int i = 0 ; i < s.size() ; i++){
        if(s[i] == '1') ans += qmi(k,i);
        ans %= mod;
    }
    cout << ans % mod << endl;
}
signed main(){
    IOS;
    int t = 1;
    //cin >> t;
    while(t--) solve();
}

E-Wiki下象棋_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)

赛时BFS写拉了,硬控2个小时。赛后重写了一遍就过了,感觉很板,就是特殊情况要判一下

#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 = 1e6 + 10;

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

int dx[8] = {-2,-2,-1,-1,1,1,2,2};
int dy[8] = {-1,1,-2,2,-2,2,-1,1};
int dp1[305][305];
int dp2[305][305];
int vis1[305][305];
int vis2[305][305];
int n,m,k,a,b,c,d;
int bfs1(int x,int y){
    priority_queue<PII , vector<PII> , greater<PII> > q;
    q.push(mk(x,y));
    dp1[x][y] = 0;
    while(q.size()){
        auto [tx,ty] = q.top();
        q.pop();
        if(tx == c and ty == d) return dp1[tx][ty];
        for(int i = 0 ; i < 8 ; i++){
            int nx = tx + dx[i];
            int ny = ty + dy[i];
            if(nx <= 0 or nx > n or ny <= 0 or ny > m or vis1[nx][ny] or vis2[nx][ny]) continue;
            dp1[nx][ny] = dp1[tx][ty] + 1 ;
            if(nx == c and ny == d) return dp1[nx][ny];
            q.push({nx,ny});
            vis1[nx][ny] = 1;
        }
    }
    return -1;
}
int bfs2(int x,int y){
    memset(vis1,0,sizeof vis1);
    priority_queue<PII , vector<PII> , greater<PII> > q;
    q.push(mk(x,y));
    dp2[x][y] = 0;
    while(q.size()){
        auto [tx,ty] = q.top();
        q.pop();
        if(tx == c and ty == d) return dp2[tx][ty];
        for(int i = 0 ; i < 8 ; i++){
            if(vis2[tx-1][ty] and (i == 0 or i == 1)) continue;
            if(vis2[tx][ty-1] and (i == 2 or i == 4)) continue;
            if(vis2[tx][ty+1] and (i == 3 or i == 5)) continue;
            if(vis2[tx+1][ty] and (i == 6 or i == 7)) continue;
            int nx = tx + dx[i];
            int ny = ty + dy[i];
            if(nx <= 0 or nx > n or ny <= 0 or ny > m or vis1[nx][ny] or vis2[nx][ny]) continue;
            dp2[nx][ny] = dp2[tx][ty] + 1 ;
            if(nx == c and ny == d) return dp2[nx][ny];
            q.push({nx,ny});
            vis1[nx][ny] = 1;
            
        }
    }
    return -1;
}
void solve(){
    cin >> n >> m >> k >> a >> b >> c >> d;
    for(int i = 1 ; i <= k ; i++){
        int x,y;
        cin >> x >> y;
        vis2[x][y] = 1;
    }
    if(a == c && b == d){
        cout << 0 << " " << 0 << endl;
        return;
    }
    cout << bfs1(a,b) << " " << bfs2(a,b) << endl;
}
signed main(){
    IOS;
    int t = 1;
    cin >> t;
    while(t--) solve();
}

F-黄金律法_2022(GPLT)上海理工大学校内选拔赛 (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 = 1e6 + 10;

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

void solve(){
    int n,ans = 0;
    cin >> n;
    vector<int> w(n+1),m(n+1);
    for(int i = 1 ; i <= n ; i++) cin >> w[i];
    for(int i = 1 ; i <= n ; i++) cin >> m[i];
    sort(w.begin()+1,w.end(),greater<int>());
    sort(m.begin()+1,m.end());
    for(int i = 1 ; i <= n ; i++){
        ans += w[i]*m[i];
    }
    cout << ans << endl;
} 
signed main(){
    IOS;
    int t = 1;
    cin >> t;
    while(t--) solve();
}

G-天气预报_2022年(GPLT)上海理工大学校内选拔赛(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 = 1e6 + 10;

/*-----------------------------------------------------------------*/
int num1[N],num2[N];
int n,a,b,ans;
bool check(int l,int r){
    if(num1[r] - num1[l-1] >= a and num2[r] - num2[l-1] >= b) return 1;
    else return 0;
}
signed main(){
    cin >> n >> a >> b;
    string s;
    cin >> s;
    s = " " + s;
    for(int i = 1 ; i <= n ; i++){
        num1[i] = num1[i-1];
        num2[i] = num2[i-1];
        if(s[i] == '1') num2[i]++;
        else num1[i]++;
    }
    for(int i = 1 ; i <= n ; i++){
        int l = i , r = n;
        while(l < r){
            int mid = (l + r) >> 1;
            if(check(i,mid)) r = mid;
            else l = mid + 1;
        }
        if(check(i,l)) ans += n - l + 1;
    }
    cout << ans << endl;
}

J-史东薇尔城_2022年(GPLT)上海理工大学校内选拔赛 (nowcoder.com)

 dijsktra 从 1 到每个点,后续如果是从1出发答案就是dist[y],不是的话就是先从x 到 1 (dist[x]).   再从1 到 y dist[y]   

#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 = 1e5 + 10;

/*-----------------------------------------------------------------*/
struct edge{
    int v,w;
};
vector<edge> G[N];
int dist1[N],dist2[N];
bool vis[N];
void dijsktra1(int x){
    memset(dist1, 0x3f3f3f3f , sizeof dist1);
    memset(vis , 0 , sizeof vis);
    priority_queue<PII , vector<PII> , greater<PII> > q;
    q.push({0,x});
    dist1[x] = 0;
    while(q.size()){
        auto t = q.top();
        q.pop();
        if(vis[t.second]) continue;
        vis[t.second] = 1;
        for(auto ed : G[t.second]){
            if(dist1[t.second] + ed.w < dist1[ed.v]){
                dist1[ed.v] = dist1[t.second] + ed.w;
                //cout << ed.v << " " << dist[ed.v] << endl;
                q.push({dist1[ed.v],ed.v});
            }
        }
    }
}
void dijsktra2(int x){
    memset(dist2, 0x3f3f3f3f , sizeof dist2);
    memset(vis , 0 , sizeof vis);
    priority_queue<PII , vector<PII> , greater<PII> > q;
    q.push({0,x});
    dist2[x] = 0;
    while(q.size()){
        auto t = q.top();
        q.pop();
        if(vis[t.second]) continue;
        vis[t.second] = 1;
        for(auto ed : G[t.second]){
            if(dist2[t.second] + ed.w < dist2[ed.v]){
                dist2[ed.v] = dist2[t.second] + ed.w;
                //cout << ed.v << " " << dist[ed.v] << endl;
                q.push({dist2[ed.v],ed.v});
            }
        }
    }
}
signed main(){
    IOS;
    int n,m;
    cin >> n >> m;
    for(int i = 1 ; i <= m ; i++){
        int u,v,w;
        cin >> u >> v >> w;
        G[u].push_back({v,w});
        G[v].push_back({u,w});
    }
    int q;
    cin >> q;
    dijsktra1(1);
    while(q--){
        int x , y;
        cin >> x >> y;
        if(x != 1){
            dijsktra2(x);
            cout << dist1[y] + dist2[1] << endl;
        } 
        else {
            cout << dist1[y] << endl;
        }
    }
}

 L-剪绳子_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)

一直在磕E导致这个简单的没写,官解说的并查集?其实一个set 的lower_bound就解决了

#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 = 1e6 + 10;

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

signed main(){
    int q;
    cin >> q;
    set<double> st;
    st.insert(0.0);
    st.insert(10.0);
    while(q--){
        char op;
        double f;
        cin >> op >> f;
        if(op == 'C') st.insert(f);
        else{
            auto x = st.lower_bound(f);
            double z,y;
            if(f == 0) z = *x , y = *(++x);
            else y = *x , z = *(--x);
            cout << fixed << setprecision(5) << y - z << endl;
        }
    }
}

五、暑假友谊赛3 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值