CF1472(div3):总结
文章目錄
- 前言
- A. Cards for Friends
- 題意簡(jiǎn)述
- 解析
- 代碼
- B. Fair Division
- 題意簡(jiǎn)述
- 解析
- 代碼
- C. Long Jumps
- 題意簡(jiǎn)述
- 解析
- 代碼
- D. Even-Odd Game
- 題意簡(jiǎn)述
- 解析
- 代碼
- E. Correct Placement
- 題意簡(jiǎn)述
- 解析
- 代碼
- F. New Year's Puzzle
- 題意簡(jiǎn)述
- 解析
- 代碼
- G. Moving to the Capital
- 題意簡(jiǎn)述
- 解析
- 代碼
前言
周圍的大佬都在切藍(lán)紫黑
只有我在水div3的水題
qwq
A. Cards for Friends
題意簡(jiǎn)述
給出一個(gè)矩形的長(zhǎng)和寬,當(dāng)它的長(zhǎng)(或?qū)?#xff09;是偶數(shù)時(shí),你就可以把它按照長(zhǎng)(或?qū)?#xff09;的方向平分成相等的兩半
求該矩形能否剪出大于等于n個(gè)矩形
w,h≤104,n≤109w,h\leq 10^4,n\leq10^9w,h≤104,n≤109
解析
顯然長(zhǎng)和寬是獨(dú)立的
分別求出兩個(gè)方向最多能剪多少再乘在一起就行了
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=105; const int mod=998244353; 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;char s[N];int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){scanf(" %s",s+1);n=strlen(s+1);if(s[1]!=s[n]) s[1]=195-s[1];printf(" %s\n",s+1);}return 0; }B. Fair Division
題意簡(jiǎn)述
給出一些價(jià)值為1或2的元素,求是否存在一種方案,把元素分成兩個(gè)集合后兩集合價(jià)值和相等
n≤100n\leq 100n≤100
解析
設(shè)所有元素價(jià)值和為sum
當(dāng)且僅當(dāng)sum為奇數(shù),或者sum/2為奇數(shù)且沒(méi)有1的元素時(shí),無(wú)解
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=105; const int mod=998244353; 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;char s[N]; int a,b,sum; int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();a=0;b=0;sum=0;for(int i=1;i<=n;i++) sum+=read();a=sum-n;b=n-a;if((sum&1)||(b==0&&sum%4)) printf("NO\n");else printf("YES\n");}return 0; }C. Long Jumps
題意簡(jiǎn)述
給出一個(gè)數(shù)列a1?ana_1-a_na1??an?,你可以從任何一個(gè)位置 i 開(kāi)始,每次獲得aia_iai?的分?jǐn)?shù), 并跳到 i+aii+a_ii+ai? 的位置,直到跳出去為止
n≤2×105,1≤ai≤109n\leq 2\times 10^5,1 \leq a_i \leq 10^9n≤2×105,1≤ai?≤109
解析
直接按題意模擬dp即可
注意數(shù)組越界
代碼
#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=998244353; 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[N],dp[N]; int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();int mx(0);for(int i=1;i<=n;i++) a[i]=read();for(int i=n;i>=1;i--){if(i+a[i]>n) dp[i]=a[i];else dp[i]=dp[i+a[i]]+a[i];mx=max(mx,dp[i]);}printf("%d\n",mx);}return 0; }D. Even-Odd Game
題意簡(jiǎn)述
alice和bob玩游戲
他們有一個(gè)長(zhǎng)度為n的數(shù)列 aaa,從alice開(kāi)始,輪流取數(shù)
alice得到所有取到的偶數(shù)的分?jǐn)?shù)
bob得到所有取到的奇數(shù)的分?jǐn)?shù)
求最后誰(shuí)的分?jǐn)?shù)高
n≤2?105,1≤ai≤109n \leq 2*10^5,1 \leq a_i \leq 10^9n≤2?105,1≤ai?≤109
解析
顯然兩個(gè)人會(huì)不管奇偶的從大往小取
sort一下后模擬即可
代碼
#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=998244353; 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;ll sum[2]; int a[N]; int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();sum[1]=sum[0]=0;for(int i=n;i>=1;i--){a[i]=read();sum[a[i]&1]+=a[i];}sort(a+1,a+1+n);for(int i=n;i>=1;i--){if(((n-i+1)&1)==(a[i]&1)) sum[a[i]&1]-=a[i];}if(sum[1]>sum[0]) printf("Bob\n");else if(sum[1]<sum[0]) printf("Alice\n");else printf("Tie\n");}return 0; }E. Correct Placement
題意簡(jiǎn)述
給出n個(gè)元素,每個(gè)元素有兩個(gè)關(guān)鍵值域aaa和bbb
我們說(shuō)元素 u 支配元素 v,當(dāng)且近當(dāng)滿足下列兩個(gè)條件之一:
1.au>av且bu>bva_u>a_v且b_u>b_vau?>av?且bu?>bv?
2.bu>av且au>bvb_u>a_v且a_u>b_vbu?>av?且au?>bv?
要求對(duì)于所有的 1≤i≤n1 \leq i \leq n1≤i≤n,輸出任意一個(gè)元素 i 支配的元素 j
如果不存在輸出 -1
n≤2×105n \leq 2\times 10^5n≤2×105
解析
我的做法是樹(shù)狀數(shù)組,但是其實(shí)并不用…
支配的含義可以簡(jiǎn)化為:u的最大值大于v的最大值,且u的最小值也大于v的最小值
那么我們按照最小值sort一下,再?gòu)那巴髵咭槐?#xff0c;沿途記錄最大值的最小值w,看是否比當(dāng)前的最大值小,就行了
代碼
然而還是樹(shù)狀數(shù)組的碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=4e5+100; const int mod=998244353; 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 q[N],a[N],b[N],num; struct tree{int mn[N],id[N];void init(int x){fill(mn,mn+1+x,1e9);}inline void upd(int p,int v,int nam){for(int i=p;i<=num;i+=i&-i){if(mn[i]>v){mn[i]=v;id[i]=nam;}}return;}int ask(int p,int v){for(;p;p-=p&-p){if(mn[p]<v) return id[p];}return -1;} }t1; int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();for(int i=1;i<=n;i++){a[i]=read();b[i]=read();q[++num]=a[i];q[++num]=b[i];}sort(q+1,q+1+num);num=unique(q+1,q+1+num)-q-1;t1.init(num);for(int i=1;i<=n;i++){a[i]=lower_bound(q+1,q+1+num,a[i])-q;b[i]=lower_bound(q+1,q+1+num,b[i])-q;//printf("i=%d a=%d b=%d\n",i,a[i],b[i]);t1.upd(a[i],b[i],i);}for(int i=1;i<=n;i++){int res(0);if((res=t1.ask(a[i]-1,b[i]))!=-1) printf("%d ",res);else if((res=t1.ask(b[i]-1,a[i]))!=-1) printf("%d ",res);else printf("-1 ");}putchar('\n');}return 0; }F. New Year’s Puzzle
題意簡(jiǎn)述
給出一個(gè) 2×n2 \times n2×n的矩形,其中有m個(gè)格子被擋住了,求是否可以用1*2的長(zhǎng)方形覆蓋滿所有未被擋住的格子
n≤109,m≤2×105n \leq 10^9,m \leq 2\times 10^5n≤109,m≤2×105
解析
題解似乎是一些分類討論,但我覺(jué)得并不簡(jiǎn)單,就沒(méi)仔細(xì)看…
n≤2×105n \leq 2\times 10^5n≤2×105時(shí),顯然直接dp即可
但是目前n太大了
注意到擋住的格子非常稀疏
不難發(fā)現(xiàn)當(dāng)前一列的填的狀態(tài)一定,且后面全沒(méi)被擋住時(shí),填法以兩列為一個(gè)單位是循環(huán)一定的
我們可以強(qiáng)行把相鄰的格子的距離%2縮小到O(1)級(jí)別
然后大力dp即可
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=4e5+100; const int mod=998244353; 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;struct node{int h,pl;bool operator < (const node o){return pl<o.pl;} }p[N]; bool jd[N][3]; int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();m=read();//int Jd=++tim==377;//if(Jd) printf("%d %d\n",n,m);for(int i=1;i<=m;i++){p[i].h=read();p[i].pl=read();//if(Jd) printf("%d %d\n",p[i].h,p[i].pl);}p[++m]=(node){1,0};p[++m]=(node){2,0};p[++m]=(node){1,n+1};p[++m]=(node){2,n+1};sort(p+1,p+1+m);for(int i=3;i<=m;i++){int flag=p[i].pl==p[i+1].pl;int d=p[i].pl-p[i-1].pl;p[i].pl=p[i-1].pl+1+((d+1)&1);if(flag) p[i+1].pl=p[i].pl,++i;}n=p[m].pl;for(int i=1;i<=n;i++) jd[i][1]=jd[i][2]=0;for(int i=1;i<=m;i++){//printf("i=%d pl=%d h=%d\n",i,p[i].pl,p[i].h);jd[p[i].pl][p[i].h]=1;}int flag(1);for(int i=1;i<=n;i++){if(jd[i-1][1]&&jd[i-1][2]){//printf(" a\n");if(!jd[i][1]&&!jd[i][2]) jd[i][1]=jd[i][2]=1;}else if(!jd[i-1][1]){//printf(" b\n");if(jd[i][1]){flag=0;break;}else jd[i][1]=1;}else{//printf(" c\n");if(jd[i][2]){flag=0;break;}else jd[i][2]=1;}//printf("i=%d jd=%d %d\n",i,jd[i][1],jd[i][2]);}if(!jd[n][1]||!jd[n][2]) flag=0;if(flag) printf("YES\n");else printf("NO\n");}return 0; }G. Moving to the Capital
題意簡(jiǎn)述
有一個(gè)由 n 個(gè)結(jié)點(diǎn)組成的有向圖。一些結(jié)點(diǎn)由邊長(zhǎng)為1的有向邊相連。
已知一個(gè)數(shù)組 d1...nd_{1...n}d1...n??,其中 did_idi?? 為從編號(hào)為 1 的結(jié)點(diǎn)到編號(hào)為 i 的結(jié)點(diǎn)的最短距離。 你站在第 s 個(gè)節(jié)點(diǎn)上。你有以下幾種選擇:
你的目標(biāo)是:靠近編號(hào)為 1 的點(diǎn)。(準(zhǔn)確地說(shuō),是找到從任意一個(gè)結(jié)點(diǎn)出發(fā)到第 1 個(gè)結(jié)點(diǎn)的最短距離)
解析
把dp設(shè)計(jì)寫(xiě)在臉上的題
直接設(shè)計(jì)dpx,0/1dp_{x,0/1}dpx,0/1?表示x點(diǎn)出發(fā)使用/不使用逆行機(jī)會(huì)的最小距離
遞歸轉(zhuǎn)移即可
注意:只有在disto>disxdis_{to}>dis_xdisto?>disx?的時(shí)候才遞歸求dp!否則會(huì)循環(huán)遞歸出大問(wèn)題!!
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=4e5+100; const int mod=998244353; 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;struct node{int to,nxt; }p[N<<1]; int fi[N],cnt; inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return; }bool vis[N]; int dis[N];int q[N],st,ed; void bfs(){q[st=ed=1]=1;dis[1]=0;vis[1]=1;while(st<=ed){int now=q[st++];for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;q[++ed]=to;vis[to]=1;dis[to]=dis[now]+1;}}return; }int dp[N][2]; void find(int x){if(dp[x][0]!=-1) return;dp[x][0]=dp[x][1]=dis[x];//printf("find:%d\n",x);for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;//printf(" x=%d to=%d\n",x,to);if(dis[to]>dis[x]){find(to);dp[x][0]=min(dp[x][0],dp[to][0]);dp[x][1]=min(dp[x][1],dp[to][1]);}else{dp[x][1]=min(dp[x][1],dis[to]);}//printf(" x=%d to=%d dp0=%d dp1=%d\n",x,to,dp[x][0],dp[x][1]);}return; }int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifint T=read();while(T--){n=read();m=read();fill(vis,vis+1+n,0);fill(fi,fi+1+n,-1);cnt=-1;for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=-1;for(int i=1;i<=m;i++){int x=read(),y=read();addline(x,y);}bfs();for(int i=1;i<=n;i++){find(i);//printf("i=%d dis=%d dp0=%d dp1=%d\n",i,dis[i],dp[i][0],dp[i][1]);printf("%d ",min(dp[i][0],dp[i][1]));}putchar('\n');}return 0; }總結(jié)
以上是生活随笔為你收集整理的CF1472(div3):总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 又一款小米手机正测试澎湃OS 1.0 雷
- 下一篇: 超 13Gbps,华为刷新 Wi-Fi