题目链接:C题
本来想用搜索,发现不行后还是分类讨论了,我在原来的图形上加了一圈'x'方便判断,里面的搜索可要可不要。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll lo=1e9+7,maxx=0,l,r,t;
char a[4][250500];
ll mod=1e9+7;
ll n,m,k,z,b[500050]={0};
//ll c[500000],d[500050];
ll dx[4]={1,-1,0,0};
ll dy[4]={0,0,1,-1};
ll rx[4]={-1,1,1,-1};
ll ry[4]={1,-1,1,-1};
int inis(int x,int y){
ll su=0;
for(int i=0;i<4;i++){
ll xx=x+dx[i];
ll yy=y+dy[i];
if(a[xx][yy]=='.'){
su++;
}
}
return su;
}
int init(int x,int y){
ll su=0;
for(int i=0;i<4;i++){
ll xx=x+rx[i];
ll yy=y+ry[i];
if(a[xx][yy]=='x'){
su++;
}
}
return su;
}
int main(){
cin>>n;
ll sum=0;
a[1][0]='x';
a[2][0]='x';
a[1][n+1]='x';
a[2][n+1]='x';
for(int i=1;i<=2;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<=n+1;i++){
a[0][i]='x';
a[3][i]='x';
}
for(int i=1;i<=2;i++){
for(int j=1;j<=n;j++){
if(a[i][j]=='.'){
ll az=inis(i,j);
ll ax=init(i,j);
if(a[i][j-1]=='.'&&a[i-1][j]=='.'&&a[i-1][j-1]=='x'){
sum++;
}
else if(a[i][j+1]=='.'&&a[i-1][j]=='.'&&a[i-1][j+1]=='x'){
sum++;
}
else if(a[i][j+1]=='.'&&a[i+1][j]=='.'&&a[i+1][j+1]=='x'){
sum++;
}
else if(a[i][j-1]=='.'&&a[i+1][j]=='.'&&a[i+1][j-1]=='x'){
sum++;
}
else if(az==0){
sum++;
}
else if(az==2&&a[i-1][j]=='x'&&a[i+1][j]=='x'){
sum++;
}
}
}
}
cout<<sum<<endl;
}
题目链接:D题
就是一个并查集加上二维存储,用动态数组方便存储
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,t,k;
ll sum[500500]={0};
ll a[500500]={0};
ll b[500500]={0};
vector<ll> f[210050];
void inis(){
for(int i=1;i<=n;i++){
a[i]=i;
}
return;
}
int cha(int x){
if(a[x]==x){
return x;
}
else return a[x]=cha(a[x]);
}
void bing(int x,int y){
int fx,fy;
fx=cha(x);
fy=cha(y);
if(fx==fy){
return;
}
else a[fx]=fy;
return;
}
int main(){
cin>>n>>m;
inis();
for(int i=1;i<=n;i++){
cin>>sum[i];
}
for(int i=0;i<m;i++){
ll xx,yy;
cin>>xx>>yy;
b[xx]=1;
b[yy]=1;
bing(xx,yy);
}
ll su=0;
for(int i=1;i<=n;i++){
if(b[i]==1){
su++;
f[cha(i)].push_back(sum[i]);
}
}
ll ans=0;
for(int i=1;i<=n;i++){
if(f[i].size()!=0){
sort(f[i].begin(),f[i].end());
ll x=1;
ll y=1;
for(int j=0;j<f[i].size()-1;j++){
if(f[i][j]==f[i][j+1]){
x++;
}
else{
x=1;
}
y=max(x,y);
}
ans+=y;
}
}
cout<<su-ans<<endl;
}
题目链接:E题
把括号存储想象成一个栈,读到左括号就是入栈,这时n-栈的长度就是能出几个括号
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,t,l,r,k;
ll maxx=1e9+7,a[500050],b[500050],c[500050];
ll ac[105][105]={0};
int main(){
string s;
cin>>n;
cin>>s;
ll ans=0,sum=0,ro=0;
for(int i=0;i<n*2;i++){
if(s[i]=='('){
ans++;
a[ro++]=n-ans;
//cout<<n-ans<<' ';
}
if(s[i]==')'){
sum++;
if(ans>0&&sum>0){
ans--;
sum--;
}
}
}
if(sum==0&&ans==0){
for(int i=0;i<ro;i++){
cout<<a[i]<<' ';
}
}
else{
cout<<"-1"<<endl;
}
}
标签:int,题解,ll,long,牛客,500050,sum,105 From: https://www.cnblogs.com/Krau/p/18564599