2016.7.18 memset小技巧总结

本文介绍了memset函数的一些实用技巧,帮助读者更好地理解如何高效地利用此函数进行内存填充操作。通过对比自定义循环的方式,强调了memset的优势,并提供了多个参考资料以加深理解。

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

    作为初始化常用军,memset是我们很多人都熟知的函数,但由于对于直接赋字节的方法不太熟,我们很多时候宁愿自己写个循环也不会用这个已提供给我们的函数,但这些事总要去熟练因为memset(应该)会比自己写循环要快很多,所以写了一个小专题收集memset的小技巧;

参考资料:

    1. 老生常谈,正确使用memset by????&????(http://blog.youkuaiyun.com/my_business/article/details/40537653

    2.C语言中memset函数详解 by追梦海星 (http://blog.sina.com.cn/s/blog_715d0ae30100yj2d.html

    3.memset陷阱 by Norcy(http://www.cnblogs.com/chenyg32/p/3289068.html

技巧总结:

转载于:https://www.cnblogs.com/SindarDawn/p/5679937.html

#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、付费专栏及课程。

余额充值