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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF1472(div3):总结

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF1472(div3):总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • A. Cards for Friends
    • 題意簡述
    • 解析
    • 代碼
  • B. Fair Division
    • 題意簡述
    • 解析
    • 代碼
  • C. Long Jumps
    • 題意簡述
    • 解析
    • 代碼
  • D. Even-Odd Game
    • 題意簡述
    • 解析
    • 代碼
  • E. Correct Placement
    • 題意簡述
    • 解析
    • 代碼
  • F. New Year's Puzzle
    • 題意簡述
    • 解析
    • 代碼
  • G. Moving to the Capital
    • 題意簡述
    • 解析
    • 代碼

前言

周圍的大佬都在切藍(lán)紫黑
只有我在水div3的水題
qwq

A. Cards for Friends

題意簡述

給出一個矩形的長和寬,當(dāng)它的長(或?qū)?#xff09;是偶數(shù)時,你就可以把它按照長(或?qū)?#xff09;的方向平分成相等的兩半
求該矩形能否剪出大于等于n個矩形
w,h≤104,n≤109w,h\leq 10^4,n\leq10^9w,h104,n109

解析

顯然長和寬是獨立的
分別求出兩個方向最多能剪多少再乘在一起就行了

代碼

#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

題意簡述

給出一些價值為1或2的元素,求是否存在一種方案,把元素分成兩個集合后兩集合價值和相等
n≤100n\leq 100n100

解析

設(shè)所有元素價值和為sum
當(dāng)且僅當(dāng)sum為奇數(shù),或者sum/2為奇數(shù)且沒有1的元素時,無解

代碼

#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

題意簡述

給出一個數(shù)列a1?ana_1-a_na1??an?,你可以從任何一個位置 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^9n2×105,1ai?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

題意簡述

alice和bob玩游戲
他們有一個長度為n的數(shù)列 aaa,從alice開始,輪流取數(shù)
alice得到所有取到的偶數(shù)的分?jǐn)?shù)
bob得到所有取到的奇數(shù)的分?jǐn)?shù)
求最后誰的分?jǐn)?shù)高
n≤2?105,1≤ai≤109n \leq 2*10^5,1 \leq a_i \leq 10^9n2?105,1ai?109

解析

顯然兩個人會不管奇偶的從大往小取
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

題意簡述

給出n個元素,每個元素有兩個關(guān)鍵值域aaabbb
我們說元素 u 支配元素 v,當(dāng)且近當(dāng)滿足下列兩個條件之一:
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?
要求對于所有的 1≤i≤n1 \leq i \leq n1in,輸出任意一個元素 i 支配的元素 j
如果不存在輸出 -1
n≤2×105n \leq 2\times 10^5n2×105

解析

我的做法是樹狀數(shù)組,但是其實并不用…
支配的含義可以簡化為:u的最大值大于v的最大值,且u的最小值也大于v的最小值
那么我們按照最小值sort一下,再從前往后掃一遍,沿途記錄最大值的最小值w,看是否比當(dāng)前的最大值小,就行了

代碼

然而還是樹狀數(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

題意簡述

給出一個 2×n2 \times n2×n的矩形,其中有m個格子被擋住了,求是否可以用1*2的長方形覆蓋滿所有未被擋住的格子
n≤109,m≤2×105n \leq 10^9,m \leq 2\times 10^5n109m2×105

解析

題解似乎是一些分類討論,但我覺得并不簡單,就沒仔細(xì)看…
n≤2×105n \leq 2\times 10^5n2×105時,顯然直接dp即可
但是目前n太大了

注意到擋住的格子非常稀疏
不難發(fā)現(xiàn)當(dāng)前一列的填的狀態(tài)一定,且后面全沒被擋住時,填法以兩列為一個單位是循環(huán)一定的
我們可以強行把相鄰的格子的距離%2縮小到O(1)級別
然后大力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

題意簡述

有一個由 n 個結(jié)點組成的有向圖。一些結(jié)點由邊長為1的有向邊相連。
已知一個數(shù)組 d1...nd_{1...n}d1...n??,其中 did_idi?? 為從編號為 1 的結(jié)點到編號為 i 的結(jié)點的最短距離。 你站在第 s 個節(jié)點上。你有以下幾種選擇:

  • 沿著某條邊,從第 i 個結(jié)點到第 j 個結(jié)點,di<djd_i<d_jdi?<dj?
  • 沿著某條邊,從第 iii 個結(jié)點到第 jjj 個結(jié)點,di≥djd_i\geq d_jdi?dj??;(最多只能走一次)
  • 你的目標(biāo)是:靠近編號為 1 的點。(準(zhǔn)確地說,是找到從任意一個結(jié)點出發(fā)到第 1 個結(jié)點的最短距離)

    解析

    把dp設(shè)計寫在臉上的題
    直接設(shè)計dpx,0/1dp_{x,0/1}dpx,0/1?表示x點出發(fā)使用/不使用逆行機會的最小距離
    遞歸轉(zhuǎn)移即可
    注意:只有在disto>disxdis_{to}>dis_xdisto?>disx?的時候才遞歸求dp!否則會循環(huá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):总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。