牛客周赛补题录(完善中)

牛客竞赛30

D-小红整数操作

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<map>
#include <queue>
#include <set>
#include <vector>
#define ll long long
#define endl '\n' 
using namespace std;
void solve(){
	ll ans = 0;
	ll x,y,l,r;
	cin>>x>>y>>l>>r;
	ll d = __gcd(x,y);
	ll a = min(x/d,y/d),b = max(x/d,y/d);
	int v1 = l/a+(l%a!=0),v2 = r/b;
	if(v2<v1)cout<<0<<endl;
	else cout<<v2-v1+1<<endl; 
}
int main()
{
	ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
	 while(t--){
         solve();
     }
}				

E-小红树上染色

#include<bits/stdc++.h>
#define i64 long long
#define endl '\n' 
using namespace std;
//n个节点n-1条边,邻接表
vector<int> ve[100005];
i64 dp[100005][2];//0为白,1为红
void dfs(int now,int fa){
    dp[now][0] = 1;
    dp[now][1] = 1;
    for(auto it: ve[now]){
        if(it == fa)continue;
        dp[it][1] *= (dp[now][0]*dp[it][1])+dp[now][1]*dp[it][1];
        dp[it][0] *= dp[now][1]; 
        dfs(it,now);
    }
    
}
void solve(){
	int n,u,v;;
    cin>>n;
    for(int i = 1;i<=n;i++){
        cin>>u>>v;
        ve[u].push_back(v);
        ve[v].push_back(u);
    }
//     dp
    dfs(1,-1);
}
int main()
{
	ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
	 while(t--){
         solve();
     }
}				

牛客周赛31

D-小红数组操作_牛客周赛 Round 31 (nowcoder.com)

E-小红的子集取反_牛客周赛 Round 31 (nowcoder.com)(dp + 偏移量)

//1,-1,2
#include<bits/stdc++.h> 
using i64 = long long;
//第二层循环的意义,
void solve(){
	int dp[205][80005],a[205];//表示前i个使得选择若干元素乘以-1后和为j的数量
    //根据实际意义判断i,j的初始化
    int n;
    memset(dp,0x3f,sizeof(dp));
    std::cin>>n;
    for(int i = 1;i<=n;i++){
        std::cin>>a[i];
    }
    dp[0][40000] = 0;
    for(int i = 1;i<=n;i++){
        for(int j = )
    }
    for(int i =1;i<=n;i++){
        for(int j = 0;j<=80000;j++){
            if(a[i]+j>=0&&a[i]+j<=80000)dp[i][j] = std::min(dp[i-1][j],dp[i-1][j+a[j]]);
            if(j-a[i]>=0&&j-a[i]<=80000)dp[i][j] = std::min(dp[i-1][j],dp[i-1][j-a[j]]+1);
        }
    }
    std::cout<<dp[n][40000]<<'\n';
    
}
int main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}				

牛客情人节专场

E-时间银河_牛客2024年情人节比赛 (nowcoder.com)(每连续的400天就有97个闰年)

牛客周赛33

#C-小红的 01 串_牛客周赛 Round 33 (nowcoder.com)

#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
    cin >> s;
    int t = 0,ans = 0,temp = 0;
    int len = s.size();
    for(int i = 0;i < len;i++){
        if(s[i] == '0'){
            t++;
        }else{
            break;
        }
    }
    for(int i = t; i < len; i++){
        if(s[i] == '1'){
            temp++;
        }else{
            temp--;
        }
    }
    ans = temp;
    for(int i = t+1; i < len; i++){
        if(s[i] == '0')ans++;
        else ans--;
        temp = max(ans,temp);
    }
    cout << temp << '\n';
    return 0;
}

D-小红的数组清空_牛客周赛 Round 33 (nowcoder.com)(multiset和vector的妙用)

#include<bits/stdc++.h> 
using i64 = long long;
using namespace std; 
void solve(){
	int n,a[100005];
	cin>>n;
	
	multiset<int> s;
	
	for(int i = 1;i<=n;i++){
		int temp;
		cin>>temp;
		s.insert(temp); 
	}
	int ans = 0;
	
	while(!s.empty()){
		vector<int>del;
		for(int i = *s.begin();s.find(i) != s.end(); i++){
			del.push_back(i);
		}
		for(auto i : del){
			s.extract(i);
		}
		ans++;
	}
	
	cout<<ans<<'\n';

}
int main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}				

E-小红勇闯地下城_牛客周赛 Round 33 (nowcoder.com)(dijkstra——迪杰特斯拉模板)

#include<bits/stdc++.h> 
using i64 = long long;
using namespace std; 
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
struct node{
	int w;
	int x,y;
	bool operator<(const node &u) const
	{
		return w > u.w;
	}
};
int n, m, x;
int u, v, uu, vv;
void solve(){
	cin >> n >> m >> x;
	char mp[n+10][m+10];
	int dis[n+10][m+10];
	bool vis[n+10][m+10];
	memset(dis, 0x3f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	for(int i = 1;i<=n;i++)
		for(int j = 1;j<=m;j++)
			cin>>mp[i][j];
	
	for(int i = 1;i<=n;i++)
		for(int j = 1;j<=m;j++){
			if(mp[i][j] == 'T')
				uu = i,vv = j;
			if(mp[i][j] == 'S')
				u = i, v = j;
		} 
	priority_queue<node> q;
	q.push({0, u, v});
	dis[u][v] = 0;
	while (!q.empty()){
		node t = q.top();
		int x = t.x, y = t.y;
		int ddd = t.w;
		q.pop();
		if(vis[x][y])
			continue;
		vis[x][y] = 1;
		for(int g = 0; g<4; g++){
			int tx = x + dx[g], ty = y + dy[g];
			if(tx > n || tx < 1 || ty > m || ty < 1)
				continue;
			if(tx == uu && ty == vv){
				dis[uu][vv] = min(dis[uu][vv], dis[x][y]);
			}
			
			int D = ddd + mp[tx][ty] - '0';
			if(D < dis[tx][ty]){
				dis[tx][ty] = D;
				q.push({D, tx, ty});
			}
		}
	}
	if (dis[uu][vv] < x)
		cout<<"Yes"<<'\n';
	else
		cout<<"No"<<'\n';
}
int main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t ;
    cin>>t;
	while(t--){
		solve();
	}
}				

牛客竞赛34

E-小红的树形 dp

#include<bits/stdc++.h> 
using i64 = long long;
using namespace std; 
vector<int> ve[100005];
int n;
string p,s;
int flag1 = 0;//判断有没有d/p;
int vis[100005];
int temp = 0;
int flag2 = 0;//判断是否矛盾;
int flag3 = 0;
void dfs1(int now,int fa,int dis){
    if(flag2==1){
        return ;
    }
    if(dis%2==1){
        if(s[now]=='d'){
            s[now] = 'd';
        }else if(s[now]=='p'){
            flag2 = 1;
        }else if(s[now]=='?'){
            s[now] = 'd';
        }
    }else if(dis%2==0){
//         cout<<d[0]<<'\n';
        if(s[now]=='p'){
            s[now] = 'p';
        }else if(s[now]=='d'){
            flag2 = 1;
        }else if(s[now]=='?'){
            s[now] = 'p';
        }
    }
    for(auto i: ve[now]){
        if(i == fa)continue;
        if(!vis[i]){
            dis++;
            vis[i] = 1;
            dfs1(i,now,dis);
            dis--;
        }
    }
}
void dfs2(int now,int fa,int dis){
     if(flag3==1){
        return ;
    }
    if(dis%2==1){
        if(p[now]=='p'){
            p[now] = 'p';
        }else if(p[now]=='d'){
            flag3 = 1;
        }else if(p[now]=='?'){
            p[now] = 'p';
        }
    }else if(dis%2==0){
//         cout<<d[0]<<'\n';
        if(p[now]=='d'){
            s[now] = 'd';
        }else if(p[now]=='p'){
            flag3 = 1;
        }else if(p[now]=='?'){
            p[now] = 'd';
        }
    }
    for(auto i: ve[now]){
        if(i == fa)continue;
        if(!vis[i]){
            dis++;
            vis[i] = 1;
            dfs2(i,now,dis);
            dis--;
        }
    }
}
void solve(){
    cin>>n;
    cin>>s;
    s = " " + s;
    p = s;
    for(int i = 0;i<n-1;i++){
        int u,v;
        cin>>u>>v;
        ve[u].push_back(v);
        ve[v].push_back(u);
    }
    if(s[1] == '?'){
        memset(vis,0,sizeof(vis));
        vis[1] = 1;
        dfs1(1,-1,0);
        if(flag2==0){
            for(int i = 1;i<s.size();i++)cout<<s[i];
            return ;
        }
        memset(vis,0,sizeof(vis));
        vis[1] = 1;
        dfs2(1,-1,0);
        if(flag3==0){
            for(int i = 1;i<p.size();i++)cout<<p[i];
            return;
        }
    }else if(s[1]=='p'){
        memset(vis,0,sizeof(vis));
        vis[1] = 1;
        dfs1(1,-1,0);
        if(flag2==0){
            for(int i = 1;i<s.size();i++)cout<<s[i];
            return ;
        }
    }else if(s[1]=='d'){
        memset(vis,0,sizeof(vis));
        vis[1] = 1;
        dfs2(1,-1,0);
        if(flag3==0){
            for(int i = 1;i<p.size();i++)cout<<p[i];
            return ;
        }
    }
    cout<<"-1"<<'\n'; 
}
int main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}				

F-思维构造题

#include<bits/stdc++.h> 
using i64 = long long;
using namespace std; 
void solve(){
	int n,m,x;
    cin>>n>>m>>x;
    int a[n+5][m+5];
    memset(a,0,sizeof(a));
    if(x%4==0&&x>2){
        a[0][0] = a[1][0] = a[1][1] = a[0][1] = x/4;
        for(int i = 0;i<n;i++){
            for(int j = 0;j<m;j++){
                cout<<a[i][j]<<" ";
            }
            cout<<'\n';
        }
    }else if(x%4==2&&x>2){
//         cout<<"t"<<'\n';
        x-=6;
        a[0][0] = a[1][0] = a[1][1] = a[0][1] = x/4;
        a[1][2] = a[1][3] = a[2][2] = a[2][1] = a[3][1]  = a[3][3] = 1;
        for(int i = 0;i<n;i++){
            for(int j = 0;j<m;j++){
                cout<<a[i][j]<<" ";
            }
            cout<<'\n';
        }
    }else{
        cout<<"-1"<<'\n';
    }
}
int main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}				

牛客竞赛35

D-小红的排列构造

#include<bits/stdc++.h> 
using i64 = long long;
using namespace std; 
void solve(){
	int n,a[100005];
    cin>>n;
    int flag[100005];
    int j = 1;
    memset(flag,0,sizeof(flag));
    for(int i = 1;i<=n;i++){
        cin>>a[i];
        if(a[i]<=n)flag[a[i]] = 1;
    }
    vector<pair<int,int>>v;
    for(int i = 1;i<=n;i++){
        if(a[i]<=n&&flag[a[i]]==1){
            flag[a[i]] = 2;
            continue;
        }else{
            while(flag[j]!=0)j++;
            v.push_back({i,j});
            flag[j] = 1;
        }
    }
    cout<<v.size()<<'\n';
    for(auto j:v){
        cout<<j.first<<" "<<j.second<<'\n';
    }
}
int main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}				

E-无向图的构造

#include<bits/stdc++.h> 
#define int long long
using namespace std; 
const int maxn = 2e5+7;
void solve(){
	int n,m;
	cin>>n>>m;
	vector<int>v[maxn];
    int maxx = 0;
    //点和边的性质,m<n-1不行
    for(int i = 1;i<=n;i++){
        int key;
        cin>>key;
        v[key].push_back(i);
        maxx = max(maxx,key);
    }
    if(m<n-1){
        cout<<"-1"<<'\n';
        return ;
    }
    vector<pair<int,int>>ve;//存边的
    for(int i = 1;i<=maxx;i++){
        if(v[i].empty()){
            cout<<"-1"<<'\n';
            return ;
        }else{
            for(auto j:v[i]){
                ve.push_back({v[i-1][0],j});
            }
        }
    }
    if(ve.size()<m){
        for(int i = 1;i<=maxx;i++){
            for(int j = 0;j<v[i].size();j++){
                for(int k = j+1;k<v[i].size();k++){
                    ve.push_back({v[i][j],v[i][k]});
                    if(ve.size()>=m)break;
                }
                if(ve.size()>=m)break;
            }
        }
        for(int i = 1;i<=maxx;i++){
            for(int j = 1;j<v[i].size();j++){
                for(auto k:v[i+1]){
                    ve.push_back({v[i][j],k});
                    if(ve.size()>=m)break;
                }
                if(ve.size()>=m)break;
            }
            if(ve.size()>=m)break;
        }
    }
    if(ve.size()<m){
        cout<<"-1"<<'\n';
    }else{
        for(auto j:ve){
            cout<<j.first<<" "<<j.second<<'\n';
        }
    }
}
signed main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
	return 0;
}
 

牛客竞赛36

C-小红的白色字符

思维题

#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    string s;
    cin >> s;
    int cnt = 0;
    for (int i = 1; i < s.size(); i++)
    {
        if(isupper(s[i])){
            cnt++;
            i++;
        }
    }
    cout << cnt;
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

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

牛客竞赛38

E-小苯的等比数列

#include<bits/stdc++.h> 
#define int long long
using namespace std; 
void solve(){
	int n;
    cin>>n;
    int maxn = 0;
    int a[302020];
    int mp[302020];
    int ans = 0;
    for(int i = 1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]++;
        ans = max(ans,mp[a[i]]);
    }
    for(int i = 2;pow(i,ans)<4e5;i++){
        for(int j = 1;j<=n;j++){
            int k = a[j];
            int cnt = 0;
           while(k<=2e5&&mp[k]>0){
               cnt++;
               k*=i;   
           }
            ans = max(ans,cnt);
        }
    }
    cout<<ans<<'\n';
}
signed main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}			
//找规律,数学,dfs,bfs	

F-小苯的回文询问

#include<bits/stdc++.h> 
#define int long long
using namespace std; 
int n,q;
int a[100005],la[100005];
struct node{
    int l,r;
    int mx;
};
node tr[404040];
void pushup(int rt){
    tr[rt].mx = max(tr[rt*2].mx,tr[rt*2+1].mx);
}
void build(int rt,int l,int r){
    if(l==r){
        tr[rt] = {l,r,la[l]};
    }else{
        tr[rt] = {l,r};
        int mid = (l+r)>>1;
        build(rt*2,l,mid);
        build(rt*2+1,mid+1,r);
        pushup(rt);
    }
}
int ask(int rt,int l,int r){
    if(tr[rt].l>=l&&tr[rt].r<=r){
        return tr[rt].mx;
    }
    int mid = (tr[rt].l+tr[rt].r)>>1;
    int ans = 0;
    if(l<=mid){
        ans = max(ans,ask(rt*2,l,r));
    }
    if(r>mid){
        ans = max(ans,ask(rt*2+1,l,r));
    }
    return ans;
}
void solve(){
    map<int,int>mp;
    cin>>n>>q;
    
    for(int i = 1;i<=n;i++){
        cin>>a[i];
        if(mp.count(a[i])){
            la[i] = mp[a[i]];
        }
        mp[a[i]] = i;
    }
    for(int i = n;i;i--){
        if(la[i]==i-1){
            la[i] = la[la[i]];
        }
    }
    build(1,1,n);
    while(q--){
        int l,r;
        cin>>l>>r;
        if(ask(1,l,r)>=l){
            cout<<"YES"<<'\n';
        }else{
            cout<<"NO"<<'\n';
        }
    }
}
signed main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}			
//找规律,数学,dfs,bfs	

牛客竞赛-39

在纸上模拟一遍过程。

B-小红不想做鸽巢原理

#include<bits/stdc++.h> 
#define int long long
using namespace std; 
void solve(){
	int n,k;
	cin>>n>>k;   
    int a[1005005];
    int sum = 0;
    for(int i = 1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    sum%=k;
    int ans = 0;
    sort(a+1,a+1+n);
    if(sum==0){
        cout<<0<<'\n';
        return ;
    }
    for(int i = n;i>=1;i--){
        if(sum>a[i]){
            sum-=a[i];
            ans++;
        }else{
            cout<<ans+1<<'\n';
            return ;
        }
    }
    
}
signed main()
{
	std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
	while(t--){
		solve();
	}
}			

D-小红不想做完全背包 (hard)

E-小红不想做莫比乌斯反演杜教筛求因子和的前缀和

牛客竞赛-39

D-小红升装备

完全背包

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f 
#define mod 998244353
#define N 310
int att[N];
int price[N];
int cost[N];
int up[N];
int lv[N];
int n, x;
int dp[N];
void solve()
{
    cin >> n >> x;
    for (int i = 1; i <= n; i++)
    {
        cin >> att[i] >> price[i] >> cost[i] >> up[i] >> lv[i];
    }
	memset(dp, 0, sizeof(dp)); // Initialize dp array with 0
    for (int i = 1; i <= n; i++)
    {
        for (int j = x; j >= 1; j--)
        {
            for (int k = 0; k <= lv[i] && price[i] + k * cost[i] <= j; k++)
            {
                dp[j] = max(dp[j], dp[j - price[i] - k * cost[i]] + att[i] + k * up[i] );
            }
        }
    }
    cout << dp[x];
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

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

E-小红的矩阵划分

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值