用法1 模拟链表用于图的链式存储
Codeforces Round 875 (Div. 2) C
思路:先按照边的顺序为其赋递增的权并建图,以1为根节点进行深度优先搜索,当下一条边权小于当前边时意味着沿该路径绘制树所需的读数数加1
深搜的部分还没写完,以后填坑,先把图的储存放上来
typedef pair<int,int> PII;
const int N=2e5+10;
vector<vector<PII>>tr(N);
int main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<n;i++){
cin>>a>>b;
tr[a].push_back(pair<int,int>(b,i));
tr[b].push_back(pair<int,int>(a,i));
}
dfs();
}
return 0;
}
用法2 用于模拟二维数组
数据范围过大时无法{ int a[N][N]; },这个时候可以利用vector变长数组的特点储存数据
题目1 Codeforces Round 861 (Div. 2) B
这个题解写的很清楚👍我摘录总结一下精华
二维vector的初始化与使用
vector<vector<int> > f(n,vector<int> (m));
等价于f[n][m];
通过上面的定义方式定义后,可以直接通过下标来输入,使用方法同普通数组
for(int i = 0;i < n;i++)
for(int j= 0;j < m;j++)
cin >> f[i][j];
如果只是
vector<vector<int> > f;
这样的定义,没有提前开辟内存的话
输入时要用pushback()
for(int i = 0;i < n;i++){
for(int j= 0;j < m;j++){
int x;
cin >> x;
f[i].pushback(x);
}
}
补充:每行独立进行排序(原链接的排序有问题)
for(int i = 0;i < m;i++) sort(a[i].begin(),a[i].end());
附AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+10;
int T=1;
int n,m;
int main(){
cin>>T;
while(T--){
cin>>n>>m;
vector<vector<ll> > a(m,vector<ll> (n));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[j][i];
for(int i = 0;i < m;i++) sort(a[i].begin(),a[i].end());
if(n==1){
cout<<"0\n";continue;
}
swap(n,m);
ll ans=0;
for(int i=0;i<n;i++){
for(int j=1;j<m;j++){
ans+=a[i][j]*j-a[i][j-1];
a[i][j]+=a[i][j-1];
}
}
cout<<ans<<"\n";
}//while
return 0;
}
题目2 Codeforces Round 860 (Div. 2) B
思路:储存所有输入数据之后逆序标记并考虑该天的中奖者,以此保证该天中奖者在以后不出现
这个题目与上一个不同的是这个题的每一组数据数量都不同且需要排序(就题论题其实不排序也可以),所以我选择 vector<vector<int> > a(n); 的定义和 cin>>x;a[i].push_back(x); 的输入
附AC代码:
#include<bits/stdc++.h>
#define YES cout<<"YES\n";
#define NO cout<<"NO\n";
#define ll long long
using namespace std;
const int N=50000+10;
int T=1;
int n,m[N],ans[N],x;
int main(){
cin>>T;
while(T--){
cin>>n;
vector<vector<int> > a(n);
// 必须是a(n),不能是a,否则输入会有问题
for(int i=0;i<n;i++){
cin>>m[i];
for(int j=0;j<m[i];j++){
cin>>x;a[i].push_back(x);
}
sort(a[i].begin(),a[i].end());//排序
}
map<int,bool>mp;
memset(ans,0,sizeof ans);
int an=0;
for(int i=n-1;i>=0;i--){
for(int j=0;j<m[i];j++){
if(!mp[a[i][j]]){
ans[i]=a[i][j];
mp[a[i][j]]=true;
}
}
if(ans[i]==0){//该天没有符合条件的中奖者
an=1;break;
}
}
if(an)cout<<"-1\n";
else{
for(int i=0;i<n;i++)cout<<ans[i]<<" ";
cout<<"\n";
}
}
return 0;
}