C 栈的应用
#include<bits/stdc++.h>using namespace std;stack<int>stk;int main()
{int n;cin>>n;for(int i=1;i<=n;i++){int a;cin>>a;while(!stk.empty()&&a==stk.top()){stk.pop();a++;}stk.push(a);}cout<<stk.size()<<endl;return 0;
}
D BFS加set
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include<queue>
#define x first
#define y secondusing namespace std;const int N = 1e3+10;
typedef pair<int, int> PII;char c[N][N];
int n,m,ans=0;
int dp[N][N],vis[N][N];int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};queue<PII>Q;
set<PII>V;
set<PII>S;bool check(int x,int y)
{for(int i=0;i<4;i++){int a=x+dx[i],b=y+dy[i];if(c[a][b]=='#')return 0;}return 1;
}void bfs(int x,int y)
{V.clear();S.clear();Q.push({x,y});vis[x][y]=1;while(!Q.empty()){auto t=Q.front();Q.pop();V.insert(t);for(int i=0;i<4;i++){int a=t.x+dx[i],b=t.y+dy[i];if(a>=1&&b>=1&&a<=n&&b<=m&&check(a,b)&&vis[a][b]==0){vis[a][b]=1;Q.push({a,b});}}}for(auto man:V){for(int i=0;i<4;i++){int a=man.x+dx[i],b=man.y+dy[i];if(c[a][b]=='.'&&vis[a][b]==0){S.insert({a,b});}}}int size=V.size()+S.size();ans=max(ans,size);
}void solve()
{cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>c[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(vis[i][j]==0&&c[i][j]=='.'){ans=max(ans,1);if(check(i,j))bfs(i,j);}}cout<<ans<<endl;
}int main()
{solve();return 0;
}