10月19日訓練記錄 CF GYM 101911

2021-08-29 10:12:27 字數 3408 閱讀 6481

a題

題意:喝n杯咖啡,但兩杯咖啡的間隔時間要大於d,問最少需要幾天才能喝上n杯咖啡

思路:貪心喝咖啡,每一杯都選時間符合要求的,如果找不到時間符合要求的就加一天

**:資料結構減智力,可以用set簡單維護。。。

#includeusing  namespace std;

#define lson rt<<1

#define rson rt<<1|1

const int maxn = 200010;

const int inf = 0x3f3f3f3f;

struct node

void update( int p , int x , int l , int r , int rt )

int mid = (l+r)>>1;

if ( p<=mid ) update( p , x , l , mid , lson );

else update( p , x , mid+1 , r , rson );

push_up( rt );

}int query( int l , int r , int l , int r , int rt )

printf( "%d\n" , sum );

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

printf( "\n" );

}return 0;

}

b題

題意:n段不相交的區間,在這些區間內移動不需要花費(進區間前必須還有剩餘),區間外移動需要每單位一點,求h點最多可以向前走幾個單位

思路:起點肯定是某個區間的起點,但列舉起點顯然會超時,但顯然從當前起點向前可以穿過的區間數和其花費是單調遞增,所以處理出字首和後列舉起點二分終點即可獲得答案

**:

#includeusing  namespace std;

const int maxn = 200010;

int max( int a , int b )

int a[maxn],b[maxn];

struct node

ll ans = 0;

while ( q.size()>=2 )

ll t = b/a,l = 0,r = 50;

while( l<=r )

if ( a[l]!=t )

ans += l; q.push(b*2);

}printf( "%i64d\n" , ans );

}return 0;

}

d題

題意:n個數需要將每個數拆分成兩個整數相乘,但拆分後不能有任何一組相同

思路:排序,將相同的數一起處理,根號列舉因子

**:

#includeusing  namespace std;

const int maxn = 200010;

struct node

if ( l>r ) break;}}

if ( l<=r )

i = r;

}if ( ok )

else

printf( "no\n" );

}return 0;

}

e題

題意:有n塊木板初始有顏色ai...an,刷m次漆,每次刷漆選擇一種顏色從當前顏色的最左端刷到當前顏色的最右端,問經過m次刷漆以後最終木板的顏色序列

思路:用set維護各顏色擁有的木板下標,每次塗色直接取set.begin和set.rbegin進行刷漆,此外當一種顏色刷過以後,它所刷過的區間就不再需要遍歷,將其左右邊界流在set裡即可,下次再遍歷到這些點直接跳過該區間

**:

#includeusing  namespace  std;

const int maxn = 300010;

bool vis[maxn]; int a[maxn];

sets[maxn];

int main()

}vis[x] = true;

}for ( int i=0 ; i=2 )

}for ( int i=1 ; i<=n ; i++ )

printf( "\n" );

}return 0;

}

f題

題意:有n次詢問每次詢問給乙個x,且x自動補全六位abcdef,詢問思路:排序,離線,暴力操作

**:

#includeusing  namespace std;

int abs( int x )

const int maxn = 200010;

struct node

int cal( int x )

int main()

if ( !ok )

for ( int i=1 ; i<=n ; i++ ) s.insert(i);

sort( a+2 , a+n+1 ); ans[1] = a[2]; s.erase(a[2]);

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

else

int min( int a , int b )

int min( int a , int b )

ll min( ll a , ll b )

int n,m,dp[maxn],sum[maxn];

int main()

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

printf( "%d\n" , dp[n] );

}return 0;

}

l題

題意:有兩個反射鏡面,下鏡面有n個點,上鏡面有m個,選任意點和任意角度射入一條光線,求經過的最多點數

思路:因為在列舉每個步長之後其奇數倍的步長就不需要再列舉了,所以列舉從下鏡面當上鏡面的變化步長只需列舉logn個,維護相應的資料答案,注意光線是可以垂直的

**:

#includeusing  namespace  std;

const int maxn = 100010;

int max( int a , int b )

int n,a[maxn],aa[maxn];

int m,b[maxn],bb[maxn];

int main()

else

ans = max( ans , r-l+1 );

i = r;

}int al = 1;

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

else

ans = max( ans , r-l+1 );

i = r;}}

for ( int i=1,j=1 ; i<=n ; i++ )

printf ( "%d\n" , ans );

}return 0;

}

NOIP集訓 10月19日

今天的資料夾 10月19日.zip 今天中午講了一下昨天的題,還是有水平的。下午複習搜尋,居然有noi難度的題,不過給了講解,也有參考程式,就不多說了。主要說說第一題。t1 這是道bfs練手題,但都寫不對。第乙個難點是讀入,雖然題目中給的讀入順序很嚇人,但仔細想想,就類似於 字典序比較 了。在pas...

8月19日訓練筆記

糟糕到極點的一天,唉。今天出了很大問題,感覺自己真的很水。唉,比賽也沒有打好,從今以後一定要避免此類事件在發生,多細心,注意細節。今天一天真的很不在狀態,上午的時候還是再看樹狀陣列的有關內容,唉。感覺題目真的好難,樹狀陣列給人最大的困難也就是想到要用樹狀陣列還要就是如何用樹狀陣列。其實,單純地樹狀陣...

7月24日訓練記錄

今天學了什麼 1.倍增,第k大數,還有就是環形均分紙牌,我今天把這個問題,推了一遍,因為我發現有很多題目經過推導變形最後會轉化為經典題目,但是這個轉化過程不太好找,也不太好推,雖然每道題的推導不一樣,但是我覺得推導一道題就能讓自己有點思路,遇到新題肯定不會變型,但是能讓我記得比較深的是這道題是否能夠...