USACO3.2 還是暴力+bitset學習

道阻且長

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章