codeforces:812(div2):总结
前言
比較水的一場(chǎng)比賽
E題幾乎是一本通原題而我還是不會(huì)做qwq
A - Sagheer and Crossroads
有一個(gè)十字路口,給出四個(gè)路口的車(chē)是否可以左轉(zhuǎn)/右轉(zhuǎn)/直行,并且給出每個(gè)路口的行人是否可以通過(guò),求是否出現(xiàn)車(chē)和人沖突的情況
閱讀理解題(其實(shí)只是我英語(yǔ)太差了),讀懂題意直接模擬即可
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=5e5+100; const int mod=1e9+7; const double eps=1e-9; inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m;int a[5][5],d[4]={0,3,2,1}; bool vis[5]; int main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endiffor(int i=1;i<=4;i++){for(int j=1;j<=4;j++) a[i][j]=read();}for(int i=1;i<=4;i++){for(int j=1;j<=3;j++){if(a[i][j]){//printf("i=%d j=%d to=%d\n",i,j,(i+d[j]-1)%4+1);vis[(i+d[j]-1)%4+1]=1,vis[i]=1;}}}for(int i=1;i<=4;i++){if(vis[i]&&a[i][4]){printf("YES");return 0;}}printf("NO\n");return 0; }B - Sagheer, the Hausmeister
給出一個(gè)n層的房屋,每層有m個(gè)房間,最左邊和最右邊有兩個(gè)樓梯
有一些房間的燈是開(kāi)著的,求一條從第一層左樓梯開(kāi)始的最短的不下樓的路徑,關(guān)掉所有的燈
n≤15,m≤100n \leq 15,m \leq 100n≤15,m≤100
dp入門(mén)水題,設(shè)計(jì) dpi,0/1dp_{i,0/1}dpi,0/1? 表示從在第 i 層的左/右樓梯(本層的燈還沒(méi)有關(guān))的最短路徑,枚舉關(guān)燈方式進(jìn)行轉(zhuǎn)移即可
時(shí)間復(fù)雜度 O(n×m)O(n \times m)O(n×m)(瓶頸竟然在于輸入)
但是這題還WA了兩次…有一些特殊情況需要特判:
C - Sagheer and Nubian Market
給出 nnn 個(gè)元素的基本價(jià)格 aia_iai? ,如果你選擇了k個(gè)元素 ax1,ax2,...,axka_{x_1},a_{x_2},...,a_{x_k}ax1??,ax2??,...,axk??,那么每個(gè)元素的真實(shí)價(jià)格就是 axi+k?xia_{x_i}+k*x_iaxi??+k?xi?(換句話說(shuō)就是加上總數(shù)量乘下角標(biāo))
現(xiàn)在有 sss 元錢(qián),求最多能買(mǎi)到幾個(gè)元素
二分答案,二分后每個(gè)元素的真實(shí)價(jià)格就確定了,sort后取前 kkk 個(gè)看有沒(méi)有超過(guò) sss 即可
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=2e5+100; const int mod=1e9+7; const double eps=1e-9; inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m,s; ll a[N],b[N]; ll calc(int k){for(int i=1;i<=n;i++) b[i]=a[i]+1ll*i*k;sort(b+1,b+1+n);ll res(0);for(int i=1;i<=k;i++) res+=b[i];return res; } int main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifn=read();s=read();for(int i=1;i<=n;i++) a[i]=read();int st=0,ed=n;while(st<ed){int mid=(st+ed+1)>>1;if(calc(mid)<=s) st=mid;else ed=mid-1;}printf("%d %lld\n",st,calc(st));return 0; }D - Sagheer and Kindergarten
如果想自己做一下這道題,建議直接去原題面
有 nnn 個(gè)孩子和 mmm 個(gè)玩具,孩子會(huì)提出一共k個(gè)對(duì)玩具的要求,滿足如下性質(zhì):
有q個(gè)獨(dú)立的詢問(wèn),每次增加一條要求(不一定滿足第4條和第6條),求有多少個(gè)孩子在哭
真正的閱讀理解題(上面這一大陀已經(jīng)是我部分精簡(jiǎn)抽象后的結(jié)果),難點(diǎn)似乎就在于轉(zhuǎn)化題意,后面就比較顯然了
可以把對(duì)玩具的要求轉(zhuǎn)化為孩子之間的依賴關(guān)系
具體的,如果x要求玩具w,上一個(gè)要求玩具w的人是y,就連一條有向邊 y?>xy->xy?>x,表示只有y滿足之后x才能滿足
一個(gè)孩子哭泣,當(dāng)且僅當(dāng)他在某個(gè)環(huán)中
由于性質(zhì)4和性質(zhì)6,連成的圖一定是一個(gè)森林
每次判斷給出的新的依賴關(guān)系是否是返祖邊,如果是,這條鏈就會(huì)形成一個(gè)環(huán),否則必然不會(huì)成環(huán)
判斷返祖不必lca,可以直接用dfs序判定子樹(shù)的方法,單次詢問(wèn) O(1)O(1)O(1)
E - Sagheer and Apple Tree
給定一個(gè)樹(shù),第i個(gè)節(jié)點(diǎn)上有aia_iai?個(gè)蘋(píng)果
兩人輪流行動(dòng),每次可以選擇一個(gè)有蘋(píng)果的節(jié)點(diǎn),進(jìn)行下列行為之一:
保證從根到所有葉子的距離的奇偶性相同
現(xiàn)在,后手方可以交換任意兩個(gè)節(jié)點(diǎn)(u,v)(u,v)(u,v)上的蘋(píng)果數(shù),求能使雙方最優(yōu)情況下后手獲勝的無(wú)序點(diǎn)對(duì)(u,v)(u,v)(u,v)的數(shù)量
ybt有一道情景幾乎一模一樣的題
然而還是并不會(huì)
qwq
感覺(jué)這個(gè)題的題解講的更加透徹
把葉子和到葉子距離為偶數(shù)的點(diǎn)染成黑色,距離為偶數(shù)的點(diǎn)染成白色
那么,每次操作其實(shí)就是使黑色節(jié)點(diǎn)的某一堆的石子增加或減少
那么和nim游戲的唯一區(qū)別就是這里還可以增加石子
但是其實(shí)并不影響,因?yàn)楸財(cái)》絿L試增加石子后,必勝方都可以把增加的石子減少回去
所以后手勝的充要條件和nim一樣,就是黑點(diǎn)權(quán)值異或和為0
然后合法點(diǎn)對(duì)就可以分類討論一下然后開(kāi)個(gè)map隨便做了
總結(jié)
以上是生活随笔為你收集整理的codeforces:812(div2):总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: YBTOJ洛谷P2387: 魔法森林(L
- 下一篇: 洛谷P4219 大融合(LCT、虚子树)