题目大意:给一定关系,判断后面给的跟前面的有无矛盾
一开始还在想一些构造的操作,后面实在想不出来看题解,就是暴力啊......
但是这种数据结构tuple(元组)确实是没见过,于是写篇总结
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int _;
int n;int a[4];
int i,j,k;
vector<tuple<int,int,int>> v; //以tuple数据类型开
bool check(){
for(auto [x,y,w]:v){ //三元组以上就只能用中括号了
if(w==1){
if(a[x]<a[y])continue;
else return 0;
}
else{
if(a[x]>=a[y])continue;
else return 0;
}
}
return 1;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>_;
while(_--){
cin>>n;
v.clear();//这里不能用fill,除非前面给vector开了大小,这里耗费我了不少时间
for(int b=1;b<=n;++b){
cin>>i>>j>>k;v.push_back({i,j,k});
//三元组的插入还是{},如果是插入,前面的vector就不能决定范围了
}
int res=0;
for(i=1;i<=3;++i){//暴力枚举27种情况,看看有没有能满足给的上面情况的
for(j=1;j<=3;++j){
for(k=1;k<=3;++k){
a[1]=i;a[2]=j;a[3]=k;
res|=check();
//这里巧用了一个| 这样一来,只要右边出现一次1,就会一直是1了(数据类型小)
}
}
}
if(res) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
while(q.size()){
auto t = q.top();
int cnt_val = get<0>(t); // 获取 cnt[i][j]
int i = get<1>(t); // 获取行
int j = get<2>(t); // 获取列
// 你可以在这里使用 cnt_val, i, j
}
两种使用方法