nyist 600 花兒朵朵

2021-06-11 01:44:56 字數 1754 閱讀 6885

題目:給定很多花的開花時間段,詢問某一時間點有多少朵花兒開放。

分析:線段樹、離散化。利通每朵花的開花時間段的端點值將時間軸分割成區間段,則操作以每個區間段為整體進行。分割又兩種方案:1.端點各成一段,端點間各成一段;2.建立左閉右開的區間,每個區間從上乙個頂點開始、到下乙個頂點之前結束(開區間)。本題採用方案2,方案一需要生成4倍花兒的數量,而方案2只需要2倍花兒的數量,空間複雜度會降低一倍。注意,在每個葉子節點上建立節點[a,a],因為操作[a,b]區間需要操作[a,b)和[b,b]兩個區間,所以線段樹的結點數是區間的3倍(2n-1+n),而不是通常的2倍(2n-1)。

#include #include #include int x[100005];

int y[100005];

int z[200005];

int s[200005];

typedef struct tnode

stnode;

stnode node[600005];

class stree

else np->lchild = np->rchild = null;

return np;

}public:

stree( int a, int b )

void insert( stnode* r, int a, int b )

int mid = (r->lvalue+r->rvalue)>>1;

if ( b < mid || a == b ) else if ( a >= mid ) else

} int query( stnode* r, int v ) \n",r->lvalue,r->rvalue);

if ( r->lvalue == r->rvalue )

return s[r->lvalue]==v?r->counts:0;

if ( v < s[r->lvalue] || v >= s[r->rvalue] )

return 0;

int mid = (r->lvalue+r->rvalue)>>1;

if ( v < s[mid] || r->lvalue+1 == r->rvalue )

return query( r->lchild, v )+r->counts;

else

return query( r->rchild, v )+r->counts;

} void insert( int a, int b )

int query( int v )

};int map( int numb, int m )

return r;

}int cmp( const void* a, const void* b )

int main()

qsort( z, 2*n, sizeof( int ), cmp );

int count = 0;

s[++count] = z[0];

for ( int i = 1 ; i < 2*n ; ++ i )

if ( z[i-1] != z[i] )

s[++count] = z[i];

s[++count] = s[count-1]+1;

stree st( 1, count );

for ( int i = 0 ; i < n ; ++ i )

for ( int i = 0 ; i < m; ++ i )

} return 0;

}

nyist 組隊賽(三)

本次比賽是浙江省賽的題,做了5 道題感覺水平有點次啊,讓我感到差距太大,自己需要學的知識好有很多 比賽前10分鐘我來晚了隊友等著我讀題,當我來的時候,當時別人已經把a題給a出來了,a題就是乙個大水題,1分鐘讀題 2分鐘 接著就是c題2分鐘讀題 n分鐘思考 2分鐘 n 20 也是乙個水題,接著g題,模...

nyist 組隊賽(四)

本次已是第四次組隊賽了,感覺狀態不太好,隊友之間配合的不是那麼默契,a,b,c,g,f,h題都是比較水的題目,不過在做題的過程中 總是讓人感覺出乎意外,第一題即wa了一次,緊接著第二題wa了3次,英文水平還是太差啊,需惡補一下,就因為前兩題的判斷失誤,導致f題這麼水 的題,都不敢輕易地寫 比人家慢了...

nyist 小光棍數

描述 最近topcoder的xd遇到了乙個難題,倘若乙個數的三次方的後三位是111,他把這樣的數稱為小光棍數。他已經知道了第乙個小光棍數是471,471的三次方是104487111,現在他想知道第m m 10000000000 個小光棍數是多少?輸入 有多組測試資料。第一行乙個整數n,表示有n組測試...