奇技淫巧与结论
对于多次询问,vis[]等可以不用memset,可用标号法以节省时间
whlie(q--){ for(int i=l;i<=r;i++) if(vis[a[i]]!=q)ans++,vis[a[i]]=q; }
手动开O2
#pragma GCC optimize(2)
矩形判断相交
inline bool intersect(int xa,int xb,int xc,int xd,int ya,int yb,int yc,int yd){ return max(xa,ya)<=min(xc,yc)&&max(xb,yb)<=min(xd,yd); return (ya>xc||yb>xd||yc<xa||yd<xb)^1;//或者 }
树上差分:
边差分
sum[x]++,sum[y]++,sum[LCA(x,y)]-=2;
点差分
sum[x]++;sum[y]++;sum[LCA(x,y)]--;sum[fa[LCA(x,y)]]--;
计算内存与用时
bool Mbg=false; //然后中间定义普通变量 bool Med=true;//最后再定义的 signed main(){ int sttime=clock(); //运行主函数 if(1.0*(&Mbg-&Med)/1024/1024>0.1)fprintf(stderr,"memo:%lf MB\n",1.0*(&Mbg-&Med)/1024/1024); else fprintf(stderr,"memo:%lf KB\n",1.0*(&Mbg-&Med)/1024); fprintf(stderr,"time:%lf s\n",1.0*(clock()-sttime)/CLOCKS_PER_SEC); return 0; }
对于空间不够的数组,可以使用map
unordered_map<int,unordered_map<int,int>>a;
对于sort的重载运算符,可以直接在sort里重载
sort(q+l,q+r+1,[](int x,int y){return dis[x]<dis[y];})
#define DBG(...) fprintf(stderr,__VA_ARGS__) //DBG("---%d->%d\n",x,y)
一些卡常的函数
template<class T>inline bool POWOF2(T x){return x>0&&(x&(x-1))==0;} template<class T>inline T ABS(T x){return (x^(x>>31))-(x>>31);} template<class T>inline T MAX(T a,T b){return b&((a-b)>>31)|a&(~(a-b)>>31);} template<class T>inline T MIN(T a,T b){return a&((a-b)>>31)|b&(~(a-b)>>31);} template<class T>inline T SAMESIGN(T a,T b){return (a^b)>=0;} template<class T>inline void SWAP(T&a,T&b){a^=b^=a^=b;} template<class T>inline bool CMAX(T&a,T b){return a<MAX(a,b)?a=b,1:0;} template<class T>inline bool CMIN(T&a,T b){return a>MIN(a,b)?a=b,1:0;} template<class T>inline T SQUARE(T x){return x*x;} inline bool ISNUM(char c){return c>='0'&&c<='9';} inline bool ISSAPCE(char c){return c==' '||c=='\n'||c=='\r'||c=='\b';} inline int SETBIT(int a,int b,bool f){return f?(a|(1<<b)):(a&~(1<<b));} inline unsigned int parity(unsigned int x){ x^=x>>4;x^=x>>8;x^=x>>16;return (0x6996>>(x&0xf))&0x1; }//返回二进制中1的个数
树上的两条路径相交则至少有一方的LCA在另一方的路径上,判断点在路径上用距离和来判断。
cin>>a>>b>>c>>d; int x=LCA(a,b),y=LCA(c,d); if(dis(a,b)==dis(a,y)+dis(b,y)||dis(c,d)==dis(c,x)+dis(d,x))cout<<"Y\n";
对于序列a,构造单调递增序列b,求sum(i=1->n)(|a[i]-b[i]|),设b[i]=i+v[i],原式为sum(i-1->n)(a[i]-(i+v[i]))=sum(i=1->n)(|(a[i]-i)-v[i]|),将a和b都减去i,于是就可以让b成为不递减序列。
12.
双冒号的作用,变量前加双冒号用于表示全局变量,不加则为局部变量,可以减少变量名的混用情况发生
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】