tuple, bitset

本文介绍了C++中tuple和bitset的基本用法。tuple是一种固定大小的数据结构,用于组合不同类型的元素。bitset则用于处理固定长度的二进制位组,支持多种位操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tuple, bitset

tuple : 是一个数据结构.
tuple类型的成员是固定的, 在初始化时要制出每一个成员.

bitset类是一个模板, 它类似于array类,具有固定的大小.


#include <iostream>
#include <cstdlib>
#include <string>
#include <tuple>
#include <vector>
#include <bitset>

int main()
{
	//tuple : 初始化
	std::tuple<int, double, std::string> tu1(1, 2.2, "abc");
	auto tu2 = std::make_tuple(2, 3.3, "def");  
	//tu1 = std::make_tuple(2, 3.3, "def"); 都可以;
	std::tuple<double, std::string, std::vector<int>> tu3(4.4, "xyz", { 1,2,3,4 });


	//使用 std::get<>()来获取对应的参数, 
	//角标跟数组一样从 0 开始. std::get<放角标>(放名字);
	//get 返回的是指定成员的引用, 即左值;
	auto x = std::get<1>(tu1);
	std::cout << x << "   " << std::get<2>(tu1) << "  " << std::get<2>(tu3).front() << std::endl;


	//相等;
	//tuple 的比较只有在两个 tuple的参数一样并且对应的参数类型一样才能进行比较;
	std::cout << (tu2 == tu1) << "\n";
	//std::cout << (tu1 == tu3);			编译报错;


	//bitset : 将其数字转换成对应的二进制;
	//bitset<位长度>;
	//bitset 初始化;
	//bitset支持角标 [];
	std::bitset<65> bit1(23004);
	//string : 比较特别; 它的第一位是从右边开始的, 所以 bit[0] = 0, bit[size()- 1] = 1;`
	std::string str = "101001000";
	std::bitset<64> bit2(str);
	std::bitset<32> bit3(str, 1, str.size() - 3); //从str[1]开始,str.size() - 3个长度;
	std::bitset<32> bit4(str, str.size() - 4);	  //str的最后4位;


	std::cout << bit1 << "\n";
	std::cout << bit2[0] << "\n";



	system("pause");
	return 0;
}

关于tuple 和 bitset 个人觉得做为了解吧, 等用的时候再来深入探究吧.

#include <bits/stdc++.h> #define ll long long using namespace std; const ll N=1e5,M=33334; struct node{ ll l,r,f; }q[3M+5]; ll n,m; ll a[N+5]; ll cnt; ll lp,rp; ll blk[N+5],lenb; bitset<N+5> s; ll mp[N+5]; map<ll,ll> mpp; ll num[N+5]; ll len[N+5]; bitset<N+5> bit[M+5]; bitset<N+5> solve(ll l,ll r){ while(l<lp){ lp–; ll numm=num[lp]+mp[a[lp]]+1; mp[a[lp]]; s[numm]=1; } while(rp<r){ rp; ll numm=num[rp]+mp[a[rp]]+1; mp[a[rp]]; s[numm]=1; } while(lp<l){ ll numm=num[lp]+mp[a[lp]]; mp[a[lp]]–; s[numm]=0; lp; } while(r<rp){ ll numm=num[rp]+mp[a[rp]]; mp[a[rp]]–; s[numm]=0; rp–; } return s; } bool cmp(node l1,node l2){ if(blk[l1.l]==blk[l1.r]){ if(blk[l1.l]&1) return l1.r<l2.r; return l1.r>l2.r; } else return blk[l1.l]<blk[l2.l]; } bool cmpf(node l1,node l2){ return l1.f<l2.f; } inline ll read() { ll x=0; char c=getchar(); while (c<‘0’ || c>‘9’) { c=getchar(); } while (c>=‘0’ && c<=‘9’) { x=x10+c-‘0’; c=getchar(); } return x; } inline void print(ll x) { if (x<0) { putchar(‘-’);x=-x; } if (x>9) print(x/10); putchar(x%10+‘0’); } int main(){ // scanf(“%lld%lld”,&n,&m); n=read(),m=read(); lenb=(ll)sqrt(n); ll sxx=1; for(ll i=1;i<=n;i++){ // scanf(“%lld”,&a[i]); a[i]=read(); mpp[a[i]]; blk[i]=sxx; if(i==lenb) sxx; } ll sum=0; for(auto i:mpp){ ll ss=i.second; mpp[i.first]=sum; sum+=ss; } for(ll i=1;i<=n;i++){ num[i]=mpp[a[i]]; } ll sx=1; bool flag=true; while(flag){ memset(mp,0,sizeof(mp)); cnt=0,lp=1,rp=0; s.reset(); mpp.clear(); ll l=(sx-1)M+1,r=min(sxM,m); if(sxM>=m) flag=false; sx++; for(ll i=1;i<=r-l+1;i++){ len[i]=0; for(ll j=1;j<=3;j++){ ll l,r; // scanf(“%lld%lld”,&l,&r); l=read(),r=read(); cnt++; q[cnt].l=l,q[cnt].r=r,q[cnt].f=i; len[i]+=r-l+1; } bit[i].set(); } sort(q+1,q+cnt+1,cmp); for(ll i=1;i<=cnt;i++){ bit[q[i].f]&=solve(q[i].l,q[i].r); } for(ll i=1;i<=r-l+1;i++){ // printf(“%lld\n”,len[i]-3(bit[i]).count()); print(len[i]-3*(bit[i]).count()); puts(“”); } } return 0; } /* 5 2 1 2 2 3 3 1 2 2 3 3 4 1 5 1 5 1 5 */现在一直TLE,救我
最新发布
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值