奇技淫巧与结论

对于多次询问,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.
双冒号的作用,变量前加双冒号用于表示全局变量,不加则为局部变量,可以减少变量名的混用情况发生

posted @   半步蒟蒻  阅读(34)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示