湘潭网站建设有名磐石网络长沙最近什么传染病
湘潭网站建设有名磐石网络,长沙最近什么传染病,视频网站建设模版,专业做包装设计网站Day one
这一天是基础算法#xff0c;主要有枚举#xff0c;二分#xff0c;贪心#xff0c;排序等。
枚举
P3799 小 Y 拼木棒
如这道题#xff0c;若直接一根一根枚举#xff0c;复杂度为
肯定超时。
然而#xff0c;木棒的长度却只有5000#xff0c;由此可想到…Day one这一天是基础算法主要有枚举二分贪心排序等。枚举P3799 小 Y 拼木棒如这道题若直接一根一根枚举复杂度为肯定超时。然而木棒的长度却只有5000由此可想到桶排。令cnt[len]表示长度为len的木棒有几根我们枚举两根较长的木棒若cnt[len]2,则有可能拼成继续枚举一个中间值j将len分成两段若cnt1则可以根据组合公式算出方案数。#includebits/stdc.h using namespace std; const int N1e410; int n; int a[N],cnt[N]; int ct[N]; int main() { // freopen(P3799_1.in,w,stdin); scanf(%d,n); int maxn0; for(int i1;in;i){ scanf(%d,a[i]); cnt[a[i]]; maxnmax(maxn,a[i]); } // for(int i1;imaxn;i)coutct[i] ;cout\n; long long ans0; for(int i1;imaxn;i){ if(cnt[i]2){ for(int j1;ji/2;j){ if(ijcnt[j]cnt[i-j]){ int cC(cnt[i],2); if(i-j!j){ ansans(cnt[i]*(cnt[i]-1)*cnt[j]*cnt[i-j]/2); // printf(i:%d j:%d %d %d %d \n,i,j,c,c1,c2); } else{ if(cnt[j]2){ int c1C(cnt[j],2); ansans(cnt[i]*(cnt[i]-1)*(cnt[j]*(cnt[j]-1)))/4; } // printf(%d %d \n,c,c1); } } } } } coutans; return 0; }二分新理解二分将模糊的概念变为清晰的数如最大值的最小值可以用二分确定一个具体的值在后续算法可以直接跑简单的算法P1462 通往奥格瑞玛的道路排序1.sort2.归并排序逆序对#includebits/stdc.h using namespace std; const int N500010; int q[N],tmp[N],n; long long merge_sort(int l,int r){ if(lr)return 0; int midlr1; long long resmerge_sort(l,mid)merge_sort(mid1,r); int k0,il,jmid1; while(imidjr) if(q[i]q[j]) tmp[k]q[i]; else{ tmp[k]q[j]; resmid-i1; } while (imid)tmp[k]q[i]; while(jr) tmp[k]q[j]; for(int il,j0;ir;i,j)q[i]tmp[j]; return res; } int main(){ cinn; for(int i0;in;i)cinq[i]; coutmerge_sort(0,n-1); return 0; }贪心老师重点讲了邻项交换法。总结先假设最优解为i在前j在后则i在前一定比j在前优列出不等式将与i有关和j有关的分别放到不等式两边就得到了i在前最优的条件可将这个结论推广到所有元素就可以按照这个条件将全集排序最后模拟题意即可。[NOIP 2012 提高组] 国王游戏#includebits/stdc.h using namespace std; const int N1e35; int n,a[N],b[N],id[N]; bool cmp(int x,int y){ return a[id[x]]*1ll*b[id[x]]a[id[y]]*b[id[y]]; } int main() { scanf(%d,n); for(int i0;in;i) scanf(%d%d,a[i],b[i]),id[i]i; sort(id1,id1n,cmp); long long ans0,mula[0]; for(int i1;in;i) { long long nummul/b[id[i]]; mul*a[id[i]]; ansmax(ans,num); } printf(%lld\n,ans); return 0; }Day two这一天讲的是数据结构重点是线段树堆并查集ST表数据结构尽量要手写锻炼代码能力线段树线段树的结构都是一样的无非建树更新查询。主要是标记和信息的合并可以通过重载运算符实现。#includebits/stdc.h using namespace std; #define LL long long #define lc 2*x #define rc 2*x1 using namespace std; const int N1e511; LL n,q,mod,a[N]; struct info{ LL s,c; }; struct tag{ LL m,a; }; info operator(info l,info r){ return {(l.sr.s)%mod,l.cr.c}; } info operator(info x,tag k){ return {((x.s*k.m)(x.c*k.a))%mod,x.c}; } tag operator(tag x,tag y){ return {x.m*y.m%mod,(x.a*y.my.a)%mod}; } struct node{ LL l,r; info d; tag t; }s[N2]; void up(LL x){ s[x].ds[lc].ds[rc].d; } void build(LL x,LL l,LL r){ s[x].ll;s[x].rr;s[x].t(tag){1,0}; if(lr){ s[x].d(info){a[l],1}; return ; } build(lc,l,(lr)1); build(rc,((lr)1)1,r); up(x); return ; } void pushtag(LL x,tag v){ s[x].d(s[x].dv); s[x].t(s[x].tv); return ; } void pushdown(LL x){ pushtag(lc,s[x].t); pushtag(rc,s[x].t); s[x].t(tag){1,0}; return ; } void update(LL x,LL l,LL r,tag v){ if(ls[x].ls[x].rr){ pushtag(x,v); return ; } if(rs[x].l||s[x].rl) return ; pushdown(x); update(lc,l,r,v); update(rc,l,r,v); up(x); return ; } info query(LL x,LL l,LL r){ if(ls[x].ls[x].rr){ return s[x].d; } if(rs[x].l||s[x].rl) return (info){0,0}; pushdown(x); return query(lc,l,r)query(rc,l,r); } int main() { scanf(%lld%lld%lld,n,q,mod); // coutq\n; for(int i1;in;i){ scanf(%lld,a[i]); } build(1,1,n); while(q--){ LL op; scanf(%lld,op); if(op1){ LL l,r,k; scanf(%lld%lld%lld,l,r,k); update(1,l,r,(tag){k,0}); } else if(op2){ LL l,r,k; scanf(%lld%lld%lld,l,r,k); update(1,l,r,(tag){1,k}); } else{ LL l,r; scanf(%lld%lld,l,r); coutquery(1,l,r).s\n; } } return 0; }重点是这一段代码info operator(info l,info r){ return {(l.sr.s)%mod,l.cr.c}; } info operator(info x,tag k){ return {((x.s*k.m)(x.c*k.a))%mod,x.c}; } tag operator(tag x,tag y){ return {x.m*y.m%mod,(x.a*y.my.a)%mod}; }分别为信息与信息的合并信息和标记的合并标记与标记的合并堆1.priority_queue 2.手写堆ST表倍增思想求区间最值。#includebits/stdc.h using namespace std; const int N1e510; int n,m; int f[20][N]; int query(int l,int r){ int t(int)log2(r-l1); return max(f[t][l],f[t][r-(1t)1]); } int main(){ scanf(%d%d,n,m); for(int i1;in;i){ scanf(%d,f[0][i]); } for(int k1;k18;k){ for(int i1;i(1k)-1n;i){ f[k][i]max(f[k-1][i],f[k-1][i(1(k-1))]); } } while(m--){ int l,r; scanf(%d%d,l,r); printf(%d\n,query(l,r)); } return 0; }Day three动态规划内容与acwing算法提高课高度重合。Dp题重点在多做题Day four同上Day five图论同上Day six这一天讲的是数论进制正数的原补反码都相同负数的反码是处了符号位按位取反负数的补码是在反码的基础上在无符号部分加一bitset优化筛法埃氏筛线性筛扩展欧几里得逆元欧几里得算法求最大公因数int gcd(int a, int b){ return a0 ? b :gcd(a%b,a); }中国剩余定理欧拉数