思路很简单,但是有坑点,就是你统计相等的时候,不要一直while,特判一下那种2e5的数据全是一样的,还有就是写代码往简单的思路写,不然坑点太多~自己就被坑麻了,还是细节处理的很烂
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int T;
int n;
int a[N],b[N];
int cnt1[N],cnt2[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=2*n;i++)cnt1[i] = cnt2[i] = 0;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++){
int tem = a[i];
if(a[i-1]==a[i])continue;
int j=i;
int tem1 = 0;
while(a[j]==tem&&j<=n){
j++;
tem1++;
}
cnt1[tem] = max(cnt1[tem],tem1);
}
for(int i=1;i<=n;i++){
//st.insert(b[i]);
int tem = b[i];
if(b[i-1]==b[i])continue;
int j = i;
int tem1 = 0;
while(b[j]==tem&&j<=n){
tem1++;
j++;
}
cnt2[tem] = max(cnt2[tem],tem1);
}
int res = 1;
// for(auto t:st){
// res = max(res,cnt1[t]+cnt2[t]);
// }
//
for(int i=1;i<=2*n;i++)res = max(res,cnt1[i]+cnt2[i]);
cout<<res<<endl;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>T;
while(T--){
solve();
}
}
一开始想的是暴力跑队列,然后发现我们只需要给每条边按出现顺序给它附上一个权值就可以了,
然后跑dfs就行了,每个点至多遍历一次,不会超时,一定注意建图的时候数组大小要设置够大,不然会喜提TLE
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int e[2*N],ne[2*N],w[2*N],h[2*N],idx;
int T;
int n;
void add(int a,int b,int c){
e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a]=idx++;
}
int reu;
void dfs(int u,int fa,int res,int last){
reu = max(reu,res);
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa)continue;
if(w[i]>last)
dfs(j,u,res,w[i]);
else
dfs(j,u,res+1,w[i]);
}
}
int main()
{
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++)h[i] = -1;
idx = 0;
for(int i=1;i<=n-1;i++){
int a,b;
cin>>a>>b;
add(a,b,i),add(b,a,i);
}
reu = 0;
dfs(1,-1,1,0);
cout<<reu<<endl;
}
}