日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CF 1191】Tokitsukaze, CSL and Stone Game//Tokitsukaze and Duel//Tokitsukaze and Strange Rectangle

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CF 1191】Tokitsukaze, CSL and Stone Game//Tokitsukaze and Duel//Tokitsukaze and Strange Rectangle 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很難想 but很好實現
博弈論專練
傳送門
慣例這里只完成D,E,F
話不多說上代碼

文章目錄

  • D:Tokitsukaze, CSL and Stone Game
    • 題目大意
    • 題解
    • 代碼實現
  • E:Tokitsukaze and Duel
    • 題目大意
    • 題解
    • 代碼實現
  • E:Tokitsukaze and Strange Rectangle
    • 題目大意
    • 題解
    • 代碼實現

D:Tokitsukaze, CSL and Stone Game

題目大意

輸入n,n堆石子,接下來輸入n個數表示i堆石子a[i]個
然后sjf先手,每人任選一堆石子,拿走一個,如果拿走后出現有至少兩堆石子個數相同就輸了
csl贏輸出cslnb,否則輸出sjfnb,每個人都選擇最優選法,因為他們很聰明

n (1≤n≤10^5) a1,a2,…,an (0≤a1,a2,…,an≤10^9)

題解

每人只能取一顆,那么去到最后決勝就是n堆石子個數分別是0,1,2…n-1這樣下一個人怎么選都是必輸
好了這題結束,下一題 如果這么快就AC是不是太水了?那就在特判那里挖坑吧!
本仙女是被這道題的特判給弄哭了(哼唧唧╭(╯^╰)╮)

先手必輸的特判:
1)如果剛開始石子就有>=2對相同的石子,那么你選了破壞了一對,另外也有一對。
2)如果有一對相同的石子,但是石子數-1也有一堆,也會輸eg:5 5 4你選了5就出現了5 4 4還是有相同石子數
3)如果有一對是0,那么也是輸,因為你取不了0

代碼實現

#include <cstdio> #include <algorithm> using namespace std; #define MAXN 100005 int tot, n; long long sum; int a[MAXN]; int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "%d", &a[i] );sum += a[i];}sort ( a + 1, a + n + 1 );int len = 1;if ( n == 1 && a[1] == 0 ) return ! printf ( "cslnb" );a[n + 1] = a[0] = -1;for ( int i = 2;i <= n + 1;i ++ ) {if ( a[i] == a[i - 1] ) {len ++;if ( len > 2 ) return ! printf ( "cslnb" );}else {if ( len == 2 ) tot ++;if ( tot > 1 ) return ! printf ( "cslnb" );if ( len == 2 && a[i - 1] == 0 ) return ! printf ( "cslnb" ); if ( len == 2 && a[i - 3] == a[i - 1] - 1 ) return ! printf ( "cslnb" );len = 1;}}long long tmp = n * ( n - 1 ) / 2;if ( ( sum - tmp ) % 2 ) printf ( "sjfnb" );else printf ( "cslnb" );return 0; }

E:Tokitsukaze and Duel

題目大意

輸入n,k (1≤k≤n≤10^5),表示01字符串的長度為n,先手和后手必須選擇連續的長度為k的區間把這些區間里面的01全部變為0或者1,如果這個區間本身全部都是1那么也可以進行全部變1的操作,就類似于不變嘛~!
最后誰先把這個字符串全部變為0或者1就勝利
如果先手贏輸出tokitsukaze,后手贏輸出quailty,都不滿足輸出over again
同樣這兩個人都聰明絕頂!會選擇最優方法

題解

既然他們都很聰明,那么這道題就是問先手或者后手能否一招致勝

因為如果先手不能一招制勝,機會就給了后手,所以他就會一直破壞后手的方法,
比如后手把i區間變為1,先手就可以變為0,這樣就能over again,
如果機會給了后手,后手也不能一招制勝,
機會就回到了先手,似乎先手就要贏了,no~~。

你當后手的頭白禿了后手發現自己贏不了那么就惡心先手,
奶媽蔡文姬毒奶一口,不讓先手贏,結果還是over again
所以如果你沒有思路,輸出over again應該能的一大部分分,
不過老師一般都會綁點ex

那么問題就變為了先手和后手分別一招制勝的情況,都沒有就是over again

先手一招制勝的情況就是:
for循環暴力找一次看有沒有一個連續k區間全部變為1或者0后能獲勝

后手一招制勝的情況就是不管先手怎么搞,他都能找到一個連續k區間獲勝。

那么就意味著n/2<=k后手贏必須滿足這個條件,
因為如果n/2>k那么先手選擇1–k后手根本不可能一次就把k+1到n全部一次操作,
那么你又會說如果后面有一部分已經連續了,后手可以贏呢!
那么這個假設就被推翻了,
仙女已經講過了先手一招殺不死,就會惡心死后手,那么他就不會選1–k區間。

而且,滿足了上面的條件后,還要for循環判斷,
是不是不管先手怎么改變區間,他都能一招制勝。

代碼實現

真的這兩個for循環,你看我的說的很輕松簡單的亞子,實際上可ex了!
要判斷如果變為1和如果變為0兩種情況

#include <cstdio> #include <cstring> #define MAXN 100005 int n, k; char s[MAXN]; int pre[MAXN]; int main() {scanf ( "%d %d", &n, &k );scanf ( "%s", s );int len = strlen ( s );for ( int i = 0;i < len;i ++ )pre[i + 1] = s[i] - '0' + pre[i];for ( int i = 1;i <= n - k;i ++ ) {int tmp = pre[n] - pre[i + k - 1];if ( i == 1 && ( tmp == 0 || tmp == n - i - k + 1 ) ) return ! printf ( "tokitsukaze" );if ( tmp == 0 && pre[i - 1] == 0 ) return ! printf ( "tokitsukaze" );if ( tmp == n - i - k + 1 && pre[i - 1] == i - 1 ) return ! printf ( "tokitsukaze" ); }if ( n / 2 > k ) return ! printf ( "once again" );for ( int i = 2;i <= n - k;i ++ ) {if ( pre[i - 1] == 0 && pre[n] - pre[i + k - 1] == n - i - k + 1 ) continue;if ( pre[i - 1] == i - 1 && pre[n] - pre[i + k - 1] == 0 ) continue;return ! printf ( "once again" );}printf ( "quailty" );return 0; }

E:Tokitsukaze and Strange Rectangle

題目大意

n個點n (1≤n≤2×10^5),接下來n行每行表示i點的橫縱坐標xi , yi (1≤xi,yi≤10^9)

矩陣左邊界l,右邊界r,最下邊a,無限長,問有多少個矩陣包含點的種類不一樣
即yi>a,xi>l,xi<r 嚴格大于!的點的種類不一樣,每一個i都是不一樣的種類,所以如果兩個矩陣分別包含1,2和2,3是屬于不同的兩個矩陣

題解

首先看n的范圍,xi,yi的范圍,數組開不了1e9就必須要離散化,
這是一個難點,做好筆記考試要考

離散化后你想,矩陣是無限高的也就意味著如果包含了i點,
也就包含了x滿足這個矩陣的y>yi的所有點,那么我們就可以dfs從上往下找

接著我們思考當操作到縱坐標y的時候,
這一條直線上有多少個x點,會對答案有多少貢獻:
考慮只有1個點的時候,那么就是左邊有多少空與右邊有多少空的乘積,

而有多個點的時候,i點左邊有多少空與i點右邊有多少空的乘積,
這時會重復算i點前面點已經算過的方案,所以要減掉,
其實也就是i點與i-1點之間有多少空與i后面空的乘積,
偷偷告訴你:其實單點也滿足這個規律

看完后你可能會有點懵,解釋一下空指的是從上往下遞歸后,我們會在y上所有點的x畫下來,如圖!
接下來的難點就是我怎么標記這個x豎線,
我們可愛的樹狀數組和線段樹這對好基友手牽著手登上了非誠勿擾,恭喜兩位嘉賓牽手成功 可以實現話不多說,屁不多放,上馬!

代碼實現

#include <cstdio> #include <vector> #include <algorithm> using namespace std; #define MAXN 200005 #define LL long long struct node {LL tx, ty;LL x, y; }a[MAXN]; vector < LL > G[MAXN]; LL n, cnt, result; LL tree[MAXN << 2]; bool cmpx ( node u, node v ) {return u.tx < v.tx; } bool cmpy ( node u, node v ) {return u.ty < v.ty; } void update ( LL l, LL r, LL L, LL R, LL num ) {if ( l == r ) {tree[num] = 1;return;}LL mid = ( l + r ) >> 1;if ( L <= mid ) update ( l, mid, L, R, num << 1 );if ( mid < R ) update ( mid + 1, r, L, R, num << 1 | 1 );tree[num] = tree[num << 1] + tree[num << 1 | 1]; } LL research ( LL l, LL r, LL L, LL R, LL num ) {if ( l == r ) return tree[num];if ( L <= l && r <= R ) return tree[num];LL mid = ( l + r ) >> 1;LL sum1 = 0, sum2 = 0;if ( L <= mid ) sum1 = research ( l, mid, L, R, num << 1 );if ( mid < R ) sum2 = research ( mid + 1, r, L, R, num << 1 | 1 );return sum1 + sum2; } void dfs ( LL u ) {if ( u == 0 ) return;LL last = 0;for ( LL i = 0;i < G[u].size();i ++ ) {LL v = G[u][i];update ( 1, n, v, v, 1 );}for ( LL i = 0;i < G[u].size();i ++ ) {LL v = G[u][i];LL t1 = research ( 1, n, 1, v, 1 );LL t2 = research ( 1, n, v, n, 1 );result += ( t1 - last ) * t2;last = t1;}dfs ( u - 1 ); } int main() {scanf ( "%lld", &n );for ( LL i = 1;i <= n;i ++ )scanf ( "%lld %lld", &a[i].tx, &a[i].ty );cnt = 0;sort ( a + 1, a + n + 1, cmpx );for ( LL i = 1;i <= n;i ++ ) {if ( a[i].tx != a[i - 1].tx )++ cnt;a[i].x = cnt;}cnt = 0;sort ( a + 1, a + n + 1, cmpy );for ( LL i = 1;i <= n;i ++ ) {if ( a[i].ty != a[i - 1].ty )++ cnt;a[i].y = cnt;G[a[i].y].push_back( a[i].x );}for ( int i = 1;i <= cnt;i ++ )sort ( G[i].begin(), G[i].end() );dfs ( a[n].y );printf ( "%lld", result );return 0; }

平A三刀,三殺,恭喜你成為全場MVP!!!

好了,有任何不懂的,歡迎留言,我看見了會及時給你答復

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【CF 1191】Tokitsukaze, CSL and Stone Game//Tokitsukaze and Duel//Tokitsukaze and Strange Rectangle的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。