CF1773E Easy Assembly 题解
本题需要使用离散化算法。
因为本题我们只关注数的相对大小,先对塔里面的数进行离散化处理。即,按照从小到大的顺序编号为
然后,如果对于一个塔
因为所有数皆不相同,所以不存在两个塔分别是
记分裂的次数为
放代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int n,c=0,c0=0; cin>>n;
vector<vector<int> > a(n);
set<int> s; map<int,int> m;
for(auto &i:a){
int k; cin>>k; i.resize(k);
for(auto &j:i)cin>>j,s.emplace(j); // 记录
}
for(auto &i:s)m[i]=++c; // 编号
for(auto &i:a)for(auto &j:i)j=m[j]; // 赋值
for(auto &i:a)
for(int j=1;j<i.size();j++)
if(i[j]-i[j-1]>1||i[j]-i[j-1]<0)c0++; // 判断
cout<<c0<<' '<<c0+n-1<<endl;
return 0;
}