目录
L2-007 家庭房产 - 结构体 + 并查集 + 自定义排序
L2-006 树的遍历 - 中后序构建二叉树模板
#include <bits/stdc++.h>
using namespace std;
const int N=35;
unordered_map<int,int> ltr,rtr,idx;
int n;
int last[N],mid[N];
vector<int> v;
int dfs(int l1,int r1,int l2,int r2)
{
if(l1>r1) return 0;
int root=last[r1];
int k=idx[root];
ltr[root]=dfs(l1,l1+k-l2-1,l2,k-1);
rtr[root]=dfs(l1+k-l2,r1-1,k+1,r2);
return root;
}
void bfs(int root)
{
queue<int> q;
q.push(root);
while(!q.empty())
{
int t=q.front();
q.pop();
v.push_back(t);
if(ltr[t]) q.push(ltr[t]);
if(rtr[t]) q.push(rtr[t]);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>last[i];
for(int i=0;i<n;i++)
{
cin>>mid[i];
idx[mid[i]]=i;
}
int root=dfs(0,n-1,0,n-1);
bfs(root);
for(int i=0;i<n;i++)
{
if(i!=0) cout<<" ";
cout<<v[i];
}
}
L2-007 家庭房产 - 结构体 + 并查集 + 自定义排序
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
int f[N];
map<int,bool> st; //记录id是否出现 map默认从小到大排序
struct peo
{
double hsum,area;
}p[N];
struct family
{
int minx=-1,num;
double zhsum,zarea,ave_hsum,ave_area;
}fam[N];
int find(int x)
{
if(x!=f[x]) f[x]=find(f[x]);
return f[x];
}
void unite(int a,int b)
{
int x=find(a),y=find(b);
if(x!=y) f[x]=y;
}
bool cmp(family &a,family &b)
{
if(a.ave_area!=b.ave_area) return a.ave_area>b.ave_area;
else return a.minx<b.minx;
}
int main()
{
for(int i=0;i<N;i++) f[i]=i;
cin>>n;
while(n--)
{
int id,fa,ma;
cin>>id>>fa>>ma;
st[id]=true;
if(fa!=-1) st[fa]=true,unite(fa,id);
if(ma!=-1) st[ma]=true,unite(ma,id);
int k;
cin>>k;
while(k--)
{
int x;
cin>>x;
st[x]=true;
unite(id,x);
}
int sum,areaa;
cin>>sum>>areaa;
p[id].hsum=sum;
p[id].area=areaa;
}
for(auto x:st)
{
int tt=x.first;
if(fam[find(tt)].minx==-1) fam[find(tt)].minx=tt; //找到该家庭成员最小编号
fam[find(tt)].num++;
fam[find(tt)].zhsum+=p[tt].hsum;
fam[find(tt)].zarea+=p[tt].area;
}
for(int i=0;i<N;i++)
{
if(!st[i]) continue;
fam[find(i)].ave_hsum=fam[find(i)].zhsum/fam[find(i)].num;
fam[find(i)].ave_area=fam[find(i)].zarea/fam[find(i)].num;
}
int res=0;
for(int i=0;i<N;i++) if(fam[i].num) res++;
cout<<res<<endl;
sort(fam,fam+N,cmp);
for(int i=0;i<res;i++)
{
printf("%04d %d %.3f %.3f\n",fam[i].minx,fam[i].num,fam[i].ave_hsum,fam[i].ave_area);
}
}
L2-008 最长对称子串 - 回文串 + 双指针
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
bool ishui(string s)
{
for(int l=0,r=s.size()-1;l<=r;l++,r--)
if(s[l]!=s[r]) return false;
return true;
}
int main()
{
int res=0;
string s;
getline(cin,s); //不能用cin cin遇到空格就截止
int maxx=0;
for(int l=0;l<s.size();l++)
{
for(int len=s.size()-l;len>=1;len--)
{
string t=s.substr(l,len);
if(ishui(t))
{
maxx=max(maxx,len);
break;
}
}
}
cout<<maxx;
}