題目:給定很多花的開花時間段,詢問某一時間點有多少朵花兒開放。
分析:線段樹、離散化。利通每朵花的開花時間段的端點值將時間軸分割成區間段,則操作以每個區間段為整體進行。分割又兩種方案: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組測試...