Meta"/>
D. Meta
Problem - D - Codeforces
题意有点让人看不懂,我琢磨了好久...
题意:
给你一个n行,每一行是一个牌,可以看作是一个整体。这个一行里面有k个元素,元素的范围在0,1,2中任选其一。问你n行中有多少
:五行中有两组满足条件,一组有三行,保证对应的v[i]都相等或者都不等
分析:
因为只有0,1,2组成。所以只有四种搭配
因为各不相同,所以必有一组被重新选择
要想凑成两组,必须要有一个被重复,两个不一样。
所以我们就这个必须要选的进行操作
开始枚举两个随意的,另一个必选的就可以被确定下来了,然后进行计数就可以了
这个代码实现的非常漂亮
有很多地方值得去学习
下面放代码(学习的是cup大佬QAQ)
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define IOS ios::sync_with_stdio(false), cin.tie(0);
#include<iostream>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PAII;
const int N=2e6+10,M=5050,INF=1e18,mod=998244353;
int get(int x)
{return x*(x-1)/2;
}
signed main(){//IOS;int T;T=1;//cin>>T;while(T--){int n,k;cin>>n>>k;vector<vector<int> > a(n, vector<int>(k));map<vector<int>,int> mp;for(int i=0;i<n;i++){for(int j=0;j<k;j++)cin>>a[i][j];}for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){vector<int> v(k);for(int z=0;z<k;z++) v[z]=(6-a[i][z]-a[j][z])%3;//可以确定必选的每一位数mp[v]++;}}int sum=0;for(int i=0;i<n;i++){sum+=get(mp[a[i]]);}cout<<sum<<"\n";}return 0;
}
/*
vector< vector<int> > v(m, vector<int>(n) );定义了一个vector容器
元素类型为vector<int>,初始化为包含m个vector<int>对象,每个对象都是一个新创立的vector<int>对象的拷贝,而这个新创立的vector<int>对象被初始化为包含n个0。*/
更多推荐
D. Meta
发布评论