关于vector< vector<> >

用法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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值