道阻且長
fact
一開始慣性思維以爲是求位數…
後來發現是求最後一位非零
再連錯兩次是因爲…保留位數少了…就是倒數的一些位數都會對最後以爲有影響
ratios
炒雞水的一道枚舉居然錯了這麼多遍..罪過罪過
每一遍都是沒有仔細考慮0..
第一遍除零爆
第二遍0的倍數不能是其它數
第三遍0不能是其它數的倍數QAQ…
翻nocow它說是..高斯消元…?!!!克萊姆法則….?!!!gcd//!!!
最後..幾個相似的東西能寫成數組就別寫成三個吶..
msquare
魔方..以前在sicily做過..還是被sample坑了一次才過
int ord[]={7,2,6,4,3,1,5,0};//打順序表
inline int trans(int p){
int sum=0;
for (int pos=7; pos>=0; pos--) {
aim[pos]=p%10;
p/=10;
}
for (int p=7; p>=0; p--) {
sum=sum*10+aim[ord[p]];
}
return sum;
}
map水掉了本來應該用的康拓展開
*spin
暴力
但是卻沒想到可以如此暴力
…
(暴力破解線段樹吶)
/* mark all the degrees we can see through wheel w */
void mark_light(int w)
{
int lv, lv2; /* loop variables */
int wpos; /* wedge position */
for (lv = 0; lv < 5; lv++)
{
if (wedglen[w][lv] < 0) /* no more wedges for this wheel */
break;
/* start of wedge */
wpos = (pos[w] + wedgest[w][lv]) % 360;
for (lv2 = 0; lv2 <= wedglen[w][lv]; lv2++)
{ /* throughout extent of wedge */
light[wpos] |= (1 << w); /* mark as hole in wheel */
wpos = (wpos + 1) % 360; /* go to the next degree */
}
}
}
*kimbits
一定不要去迎合答案而修改順序.往往會越改越錯
bitset使用
string temp =bitset<64>(num).to_string(); while (temp.size()>len) { temp.erase(temp.begin()); }
注意int溢出
一個優化
long long pow2[35]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296}; long long allright = pow2[maxone+1]; if (ord<allright) { num=ord-1; } //更簡單的實現... long a[40]={0}; while(ans>0){ a[++a[0]]=ans&1; ans>>=1; }
然後發現就是一個遞推…
不想水掉 晚點再做.
還是沒思路
楊輝三角+從左往右遞推
void printbits(int nbits, int nones, double index) { double s; if(nbits == 0) return; s = sizeofset[nbits-1][nones];//不用疊加上來!!!! if(s <= index) { fprintf(fout, "1"); printbits(nbits-1, nones-1, index-s); } else { fprintf(fout, "0"); printbits(nbits-1, nones, index); } }
忘了是哪裏要求二進制位數了
看到一段魔性代碼
unsigned long CountBit(unsigned long X) { X = (X & 0x55555555) + (X >> 1 & 0x55555555); X = (X & 0x33333333) + (X >> 2 & 0x33333333); X = (X & 0x0F0F0F0F) + (X >> 4 & 0x0F0F0F0F); X = (X & 0x00FF00FF) + (X >> 8 & 0x00FF00FF); X = (X & 0x0000FFFF) + (X >> 16 & 0x0000FFFF); return(X);
butter(稀疏圖最短路)
- floyd改一點過一點數據…查nocow發現需要更高級的算法
- SPFA 挺好寫的…但是注意 farm不是從0開始,建站不一定建在有牛的地方
- 據說djstra也可以 抄一遍堆的代碼..
bitset學習
//覺得下面幾個函數特別有用
.count()
.set()
to_string()
to_long()
//spin
#include<cstdio>
#include<bitset>
#include<iostream>
using namespace std;
int speed[6];
int main()
{
freopen("spin.in","r",stdin);
freopen("spin.out","w",stdout);
bitset <360> now[6],temp[6];
for(int i=1;i<=5;i++)
{
int x;
cin >> speed[i] >> x;
for(int j=1;j<=x;j++)
{
int start,end;
cin >> start >> end;
end += start;
for(int k=start;k<=end;k++)
now[i].set(k%360);
}
}
int t=0;
while(t<360)
{
for(int i=0;i<=359;i++)
{
int flag=0;
for(int j=1;j<=5;j++)
if(!now[j].test(i))
{
flag=1;
break;
}
if(flag==0)
{
cout << t << endl;
return 0;
}
}
for(int i=1;i<=5;i++)
{
for(int j=0;j<=359;j++)
temp[i][j]=now[i][(j+360-speed[i])%360];
now[i]=temp[i];
}
t++;
}
cout << "none" << endl;
return 0;
}