- 当需要使用ll时,常数也记得强制转化为ll
ll tmp=(ll)1<<i;
- 图论题数组记得开够,不要1e6的给开成1e5的大小(因为很多题都是1e5大小,顺手了)
ll p[1000005];
ll save[100005];//有错
ll save[1000005];//应该这样
例如:C. Anna, Svyatoslav and Maps
- 给了答案最差情况时,优先考虑最差情况去构造答案。
如上,则优先考虑选择n/2个节点的情况。即生成一棵树再去选择节点(结合下方例题看)。
例如:E. Cover it! (也可以看成染色问题)
- 求模运算时,一定要判断左边的被求模数是否大于0.
if((d[i]/2-tot)>0&&(d[i]/2-tot)%cnt==0){
a[cnt]=(d[i]/2-tot)/cnt;
tot+=a[cnt];cnt--;
}
例如:C. Nezzar and Symmetric Array
- 初始化gcd的求值时,因为gcd需要两个数,所以初始化c=0,再c=__gcd(c,a)。这样比初始化c=a更好,0和任何数求gcd就等于那个数本身。
ll cc=0;
for(ll i=n-1;i>=1;i--){
cc=__gcd(cc,a[n]-a[i]);
}
例如:C. Row GCD
- 精度要求高的题时,若求概率问题,应考虑反向求全不满足概率p,再用1-p求得答案。不然精度可能不够。
Rep(i,1,m){
ll rr;
scanf("%lld",&rr);
double pp;
scanf("%lf",&pp);
if(rr>=r){ans*=1-pp;}
}
if(r==0){printf("%.6lf\n\n",1.0);}
else printf("%.6lf\n\n",1-ans);
- 判断奇偶尽量用 if(s&1) 奇数,不要用 s%2==1 。
if(sum&1) cout<<1<<"\n";