https://www.acwing.com/activity/content/1818/
4419. 上车【签到】
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
int s1,s2; cin>>s1>>s2;
if(s1+2<=s2) cnt++;
}
cout<<cnt;
return 0;
}
4420. 连通分量【并查集】
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
const int M=1e6+10;
int n,m,t;
char a[N][N];
int cnt[M],p[M];
int dx[4]={
-1,0,0,1};
int dy[4]={
0,-1,1,0};
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
void solve(int x,int y)
{
for(int i=0;i<4;i++)
{
int tempx=x+dx[i],tempy=y+dy[i];
if(tempx<0||tempx>=n||tempy<=0||tempy>m) continue;
if(a[tempx][tempy]=='*') continue;
int id1=x*m+y,id2=tempx*m+tempy;
if(find(id1)==find(id2)) continue;
cnt[find(id1)]+=cnt[find(id2)];
p[find(id2)]=find(id1);
}
}
int main(void)
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=1;j<=m;j++) cin>>a[i][j];
for(int i=1;i<=n*m;i++) p[i]=i,cnt[i]=1;
for(int i=0;i<n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]=='.') solve(i,j);
for(int i=0;i<n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='.') cout<<a[i][j];
else
{
map<int,int>mp;
int sum=0;
int x=i,y=j;
for(int k=0;k<4;k++)
{
int tempx=x+dx[k],tempy=y+dy[k];
if(tempx<0||tempx>=n||tempy<=0||tempy>m) continue;
if(a[tempx][tempy]=='*') continue;
int w=tempx*m+tempy;
if(mp[find(w)]) continue;
sum+=cnt[find(w)],mp[find(w)]=1;
}
cout<<(sum+1)%10;
}
}
cout<<'\n';
}
return 0;
}
4421. 信号【贪心】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,r;
int main(void)
{
cin>>n>>r;
for(int i=1;i<=n;i++) cin>>a[i];
int cnt=0;
for(int i=1;i<=n;i++)
{
int pos=-1;
for(int j=i;j<=i+r-1&&j<=n;j++) if(a[j]) pos=j;//右边找
if(pos!=-1)
{
cnt++,i=pos+r-1;
continue;
}
pos=-1;
for(int j=max(1,i-r+1);j<=i;j++) if(a[j]) pos=j;//左边找
if(pos==-1)
{
puts("-1");
return 0;
}
cnt++,i=pos+r-1;
if(i>=n) break;
}
cout<<cnt;
return 0;
}