再戰atcoder,誤入grand局,賽後才意識到。偶然間發現,一年多前自己也是通過grand局狂漲800+分,甚是巧合
A - Connection and Disconnection
思路:這題就是一個簡單的字符串計算問題,子串複製多次後變換最少元素消除連續相同元素。對於連續元素,其實只需要向下取整相間消除即可完成,最後單獨統計一下首尾,處理掉複製連接處,再考慮一下所有元素均相同的情況即可。
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e7+5;
vector<int> col;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//freopen(".txt","r",stdin);
string s;
int k;
cin >> s >> k;
col.clear();
int len = s.size();
int num = 1;
char c = s[0];
int sum = 0;
for(int i=1;i<len;i++)
{
if(s[i]==c)
num++;
else
{
col.push_back(num);
sum += num/2;
num = 1;
c = s[i];
}
}
col.push_back(num);
int siz = col.size();
if(siz==1)
{
cout << (ll)(len)*(ll)(k)/2LL << "\n";
}
else if(s[0]==s[len-1])
{
sum -= col[0]/2;
cout << (ll)(sum)*(ll)(k) + (ll)(col[0]/2) + (ll)(col[siz-1]/2) + (ll)((col[0]+col[siz-1])/2) * (ll)(k-1);
}
else
{
sum += col[siz-1]/2;
cout << (ll)(sum)*(ll)(k) << "\n";
}
return 0;
}
B - Graph Partition
思路:對於圖論問題,比較常見的就是搜索系列的bfs,dfs,處理邊系列的最短路,最小生成樹,還有就是網絡流系列。
本題要求對點分組,要求鄰邊所對應得點必須鄰組。昏昏沉沉之中想着找最長鏈,判環一堆什麼亂七八糟的操作,最終只得無功而返。其實這題就是個分層問題,bfs所得的不同層元素必鄰組,枚舉每個頂點作爲bfs起點,先分組,後判斷驗證
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 205;
bool s[maxn][maxn];
int in[maxn];
queue<int> q;
int n;
/*
int dfs(int pre,int now,int num)
{
in[now] = num;
int re = 0;
for(int i=1;i<=n;i++)
{
if(i==pre)
continue;
if(s[now][i])
{
if(in[i]>=0)
{
if(num-in[i]!=3)
continue;
//cout << in[i] << "*" << num <<"*"<<i<<"*"<<now << "*" << s[now][i]<< endl;
else
return -1;
}
else
{
int temp = dfs(now,i,num+1);
if(temp>re)
re = temp;
}
}
}
in[now] = -1;
return max(re,num);
}
int main()
{
//freopen(".txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char temp;
scanf("%c",&temp);
for(int j=1;j<=n;j++)
{
scanf("%c",&temp);
//cout << i << "&" << "&"<<temp;
//cout << temp;
s[i][j] = (temp=='1' ? true : false);
}
//cout << "\n";
}
//cout << s[3][3] << "%" << endl;
bool ok = true;
int re = 0;
for(int i=1;ok&&i<=n;i++)
{
memset(in,-1,sizeof in);
int l1=0,l2=0;
for(int j=1;ok&&j<=n;j++)
{
if(s[i][j])
{
in[i] = 0;
int now = dfs(i,j,1);
if(now == -1)
ok = false;
else
{
if(now>l1)
{
l2=l1;
l1=now;
}
else if(now>l2)
l2=now;
}
}
}
if(l1+l2+1>re)
{
re = l1 + l2 + 1;
cout << i << "^" << l1 << "^" << l2 <<endl;
}
}
if(ok)
printf("%d\n",re);
else
printf("%d\n",-1);
return 0;
}
*/
/*
dfs行不通,考慮bfs
*/
int myabs(int k)
{
if(k<0)
k = k * (-1);
return k;
}
int main()
{
//freopen(".txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char temp;
scanf("%c",&temp);
for(int j=1;j<=n;j++)
{
scanf("%c",&temp);
//cout << i << "&" << "&"<<temp;
//cout << temp;
s[i][j] = (temp=='1' ? true : false);
}
//cout << "\n";
}
//cout << s[3][3] << "%" << endl;
int re = -1;
for(int i=1;i<=n;i++)
{
memset(in,-1,sizeof in);
q.push(i);
in[i]=1;
int other = n;
int now;
while(other)
{
now = q.front();
//cout << now << endl;
//exit(-1);
q.pop();
other--;
for(int j=1;j<=n;j++)
{
if(s[now][j]&&in[j]==-1)
{
//cout << j << "*" << endl;
q.push(j);
in[j] = in[now]+1;
}
}
//exit(-1);
}
//cout << i << "*"<<in[now] << endl;
bool ok = true;
for(int j=1;ok&&j<n;j++)
for(int k=j+1;ok&&k<=n;k++)
if(s[j][k]&&(myabs(in[j]-in[k])!=1))
ok = false;
if(ok&&in[now]>re)
re = in[now];
}
printf("%d\n",re);
return 0;
}