首页 > 其他分享 >牛客小白月赛86

牛客小白月赛86

时间:2024-01-29 13:12:35浏览次数:32  
标签:连通 int long 牛客 2000 小白月赛 做法 86 define

B 水平考试

======

等价于两个集合 \(S, T\) 判断 \(S\) 中是否存在 \(T\) 中所不包含的元素。

  • 若存在则输出 0;
  • 否则输出 10。

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

C题:区间查询当前区间可以被分为多少段,要求每段只有一种数字。

做法1:提前对所有段编号,查询时直接左右边界编号相减,注意边界需要特别处理
做法2:标记第i段与第i+1段之间的分界点,然后求前缀和,本质上和做法1一样

D题:给定网格,0表示障碍,1表示道路。问有多少块长方形道路?(正方形也是长方形)

对此我们首先用过bfs找到连通块,对于每个连通块我们需要维护这个连通块最大x,y坐标,
最小x,y坐标,以及连通块大小。当连通块是矩形的时候通过
统计矩形的(minX, minY) -> (maxX, maxY)

然后判断 (maxY - minY + 1) * (maxX - minX + 1) == 连通图的大小

// Problem: 剪纸游戏
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/73450/D
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
# define int long long
#define ull unsigned long long
#define pii pair<int,int>

#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl  "\n"
#define debug1(x) cerr<<x<<" "
#define  debug2(x) cerr<<x<<endl
const int N = 1e3 + 10;
const int M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
int n, m;
bool st[N][N];
int  a[N][N];
int dx[5]={0,1,-1,0};
int dy[5]={1,0,0,-1};
vector<pii>mx(N*N,{-1,-1});
vector<pii>mn(N*N,{2000,2000});
vector<int>sz(N*N,0);
queue<pii>q;
int cnt=0;
void bfs(int x,int y){
	//cerr<<x<<" "<<y<<endl;
	q.push({x,y});
	st[x][y]=true;
	sz[cnt]++;
	mx[cnt].first=max(mx[cnt].first,x);
	mx[cnt].second=max(mx[cnt].second,y);
	// mx[cnt]=max(mx[cnt],{x,y});
	// mn[cnt]=min(mn[cnt],{x,y});
	
	mn[cnt].first=min(mn[cnt].first,x);
	mn[cnt].second=min(mn[cnt].second,y);
	while(q.size()){
		auto t=q.front();q.pop();
		
		for(int i=0;i<4;i++){
			int tx=t.first+dx[i];
			int ty=t.second+dy[i];
			if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]&&!st[tx][ty]){
				q.push({tx,ty});st[tx][ty]=true;
				sz[cnt]++;
				mx[cnt].first=max(mx[cnt].first,tx);
	mx[cnt].second=max(mx[cnt].second,ty);
	
	mn[cnt].first=min(mn[cnt].first,tx);
	mn[cnt].second=min(mn[cnt].second,ty);
	//mx[cnt]=max(mx[cnt],{tx,ty});
	//mn[cnt]=min(mn[cnt],{tx,ty});
			}
		}
	}
	// cerr<<sz[cnt]<<endl;
	// cerr<<mx[cnt].first<<" "<<mx[cnt].second<<endl;
	// cerr<<mn[cnt].first<<" "<<mn[cnt].second<<endl;
	// cerr<<"***************************"<<endl;
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c;cin>>c;
			if(c=='.')a[i][j]=1;
			else a[i][j]=0;
			//cerr<<a[i][j]<<" ";
		}
		//cerr<<endl;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==0||st[i][j])continue;
			bfs(i,j);
		cnt++;
			
			
			
			
		}
	}
	int res=0;
	//cerr<<cnt<<endl;
	for(int i=0;i<cnt;i++){
		int l=mx[i].first-mn[i].first+1;
		int r=mx[i].second-mn[i].second+1;
		if(l*r==sz[i]){
			res++;
		//cerr<<l<<" "<<r<<' '<<sz[cnt]<<endl;
		}
	}	
	cout<<res<<endl;
}
signed main() {
    cin.tie(0);
    
    ios::sync_with_stdio(false);

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

E题:带容量下限的最大连续子数组和

简单无脑做法:枚举每个起点,他的终点是j到n的任意一点。j是从左到右第一个满足当前区间容量大于W的坐标,对于这一过程我们显然需要维护容量的前缀和然后二分。我们希望价值最大

标程做法:首先枚举左端点,然后根据 \(W\) 的限制求解出右端点的最小值(双指针递推),记为 \(r\)。

那么此时问题转变为:以 \(r\) 为左端点的最大子段和(通过倒序 dp 预处理即可)。

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

标签:连通,int,long,牛客,2000,小白月赛,做法,86,define
From: https://www.cnblogs.com/mathiter/p/17994274

相关文章

  • 8086汇编语言二重循环问题三种处理方法
    1.寄存器保留CXassumecs:code,ds:datadatasegmentdb'ibm'db'dec'db'dos'db'vax'dataendscodesegmentstart:movax,datamovds,a......
  • ubuntu_x86_64上运行arm64的程序
    摘自:百度文心一言 qemu-user-static是一个用于利用当前操作系统来运行其它架构的一个仿真器要使Ubuntu上运行ARM64程序,需要进行以下操作:安装QEMU模拟器:可以通过命令sudoapt-getinstallqemu-user-static来安装。这将为系统提供支持多种体系结构的能力。获取适用于ARM64的二进制......
  • 8086汇编push pop 易错点总结
    首先附代码assumecs:codecodesegmentdw0123h,0456hdw0,0,0start:movax,csmovss,ax;设置栈段movsp,0Ah;设置栈顶A是栈偏移movbx,0;偏移movcx,2;设置s:pushcs:[bx]addbx,2loopsmo......
  • 牛客练习赛121补题
    C.思路由于水滴会影响一个区间里的水滴,所以只需要为何区间[l,r]即可ac代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;consti64inf=1e18;typedefpair<int,int>pii;constintmod=1e9+7;constintN=2e5+10;inta[N];intn......
  • 牛客练习赛121
    牛客练习赛121出题人题解|牛客练习赛121题解小念吹气球解题思路:字符长度加字符种类数。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;voidso......
  • IU5186兼容IU5180集成30V的OVP功能,3A升降压充电,1~4节锂电池
    IU5186C是一款自动申请快充输入,开关模式升降压充电管理IC,用于1~4节锂离子电池和锂聚合物电池,以及1~5节磷酸铁锂电池。芯片集成包括4开关MOSFET、输入和充电电流感应电路、电池以及升降压转换器的环路补偿。芯片具有3A的充电电流能力,充电电流可以通过外部电阻灵活可调。IU5186C内置......
  • English86
    计数单位可以是“头”calculate:计算calculus:小圆石;小鹅卵石;微积分;结石calc=stonecalcul:计算;估计;评价;认为(用小石头处理)+-ul-=small;+-ate构成v.ul是ule的缩略式;ate与名词词根相结合,作动词后缀时,表示toprudce;totrative;toconbyeive也就是处理的含义。calculat......
  • 牛客周赛 Round 29
    牛客周赛Round29小红大战小紫代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;voidsolve(){inta,b;cin>>a>>b;......
  • [Mac软件]DoubleTake for Mac(全景拼图软件) v2.6.12 (1086) 激活版本
    DoubleTakeforMac是一款功能强大的全景拼图软件,专为Mac用户设计,可以帮助用户轻松地将多张照片拼接成一张全景图像。这款软件具有直观的用户界面和丰富的功能,使得全景图像的制作变得简单快捷。本文将详细介绍DoubleTakeforMacv2.6.12激活版本的特点和功能。首先,DoubleTakefor......
  • ubuntu_x86_64上运行arm64的程序
    摘自:百度文心一言ubuntu让arm64的程序在x86要使Ubuntu上运行ARM64程序,需要进行以下操作:安装QEMU模拟器:可以通过命令sudoapt-getinstallqemu-user-static来安装。这将为系统提供支持多种体系结构的能力。获取适用于ARM64的二进制文件或源代码:确保已经有了针......