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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces:1103(div1)1104(div2)

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces:1103(div1)1104(div2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • CF1104A Splitting into digits
    • Description\text{Description}Description
    • Solution\text{Solution}Solution
    • Description\text{Description}Description
  • CF1104B Game with string
    • Description\text{Description}Description
    • Solution\text{Solution}Solution
    • Code\text{Code}Code
  • CF1103A Grid game
    • Description\text{Description}Description
    • Solution\text{Solution}Solution
    • Code\text{Code}Code
  • CF1103B Game with modulo
    • Description\text{Description}Description
    • Solution\text{Solution}Solution
    • Code\text{Code}Code
  • CF1103C Johnny Solving
    • Description\text{Description}Description
    • Solution\text{Solution}Solution
    • Code\text{Code}Code
  • CF1103D Professional layer
    • Description\text{Description}Description
    • Solution\text{Solution}Solution
    • Code\text{Code}Code

前言

1104AB,1103A是水題
1103B是不錯的交互題
C小清新構造
D毒瘤優化狀壓
E是惡心數學題(直接棄療)

CF1104A Splitting into digits

Description\text{Description}Description

給定一個數字 nnn ,請將它拆分成 a1+a2+?+am,ai∈[1,9]a_1+a_2+\cdots + a_m,a_i \in [1,9]a1?+a2?+?+am?,ai?[1,9],使得 ∑i=1mai=n\sum_{i=1}^ma_i = ni=1m?ai?=n,并且使 aia_iai? 中不同的數盡量少。

輸出方案,兩行,第一行為數的個數 mmm,第二行為mmm個數,由空格隔開,分別為 a1?ama_1 - a_ma1??am?

Solution\text{Solution}Solution

智障題。輸出 nnn111 即可…

Description\text{Description}Description

#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e6+100; 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; int main(){n=read();for(int i=1;i<=9;i++){if(n%i==0){printf("%d\n",n/i);while(n) printf("%d ",i),n-=i;return 0;}}printf("%d\n",(n+8)/9);while(n>9) printf("9 ");n-=9;printf("%d",n); }

CF1104B Game with string

Description\text{Description}Description

A\text{A}AB\text{B}B 正在玩一個關于由小寫拉丁字符構成的字符串 sss 的游戲。

每一個人會輪流操作,先 A\text{A}AB\text{B}B

對于每一次操作,操作者需要將 sss 中的兩個 連續且相同 的字符消除,消除后的字符串由另一個人操作。

對于每一次操作,如果不能找到兩個符合要求的字符,那么操作者輸。

Solution\text{Solution}Solution

水題。
顯然博弈論只是層皮,勝負就與操作次數的奇偶性有關。
由于有刪除操作,我寫了個鏈表,每次刪除后再遞歸往兩側看能不能接著刪。
看其他題解許多使用了棧,做法也很簡單。

Code\text{Code}Code

#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e5+100; 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; int l[N],r[N],ans; char s[N]; bool vis[N]; void del(int x,int y){++ans;vis[x]=vis[y]=1;int xx=l[x],yy=r[y];r[xx]=yy;l[yy]=xx;if(xx>0&&yy<=n&&s[xx]==s[yy]) del(xx,yy);return; } int main(){scanf(" %s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++) l[i]=i-1,r[i]=i+1;r[0]=1;l[n+1]=n;for(int i=1;i<=n;i++){if(vis[i]) continue;if(s[i]==s[l[i]]) del(l[i],i);}if(ans&1) printf("Yes");else printf("No"); }

CF1103A Grid game

Description\text{Description}Description

你有一個 4×44\times44×4 的棋盤和一些 1×21\times21×2 大小的方格,給你放入的順序,000 表示豎著放,111 表示橫著放,每當一行或一列全放滿時會將這一行或列上的消除,輸出任意一種使小方格不重疊的方案。

Solution\text{Solution}Solution

似乎和其他題解的方法不太一樣。
豎著的先放 (1,1)(1,1)(1,1),再放 (3,1)(3,1)(3,1) 把上一個消掉。
橫著的先放 (4,3)(4,3)(4,3),再放 (4,1)(4,1)(4,1) 把上一個消掉。
永遠不會有沖突。

Code\text{Code}Code

#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e5+100; 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; int a,b; char s[N]; int main(){scanf(" %s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++){if(s[i]=='0'){if(a) printf("3 1\n");else printf("1 1\n");a^=1;}else{if(b) printf("4 1\n");else printf("4 3\n");b^=1;}} }

CF1103B Game with modulo

Description\text{Description}Description

未知一個數 aaa,讓你每次猜兩個數 xxxyyy,若 (xmoda)≥(ymoda)(x\bmod a)\ge (y\bmod a)(xmoda)(ymoda) 返回 x,否則返回 y。讓你猜測次數少于 606060 次的時候猜出數 aaa
a≤2×109a\le 2\times 10^9a2×109

Solution\text{Solution}Solution

一開始,令 x=1x=1x=1。
不斷進行一下過程:

  • 詢問 xxx2x2x2x。
  • xmoda<2xmodax\bmod a< 2x\bmod axmoda<2xmoda,說明 a>2xa>2xa>2x,令 x←2xx\gets 2xx2x,回到第一步。
  • xmoda>2xmodax\bmod a> 2x\bmod axmoda>2xmoda,說明 a≤2xa\le 2xa2x,也就是 a∈(x,2x]a\in (x,2x]a(x,2x],進入第四步。
  • 現在已知 a∈(x,2x]a\in (x,2x]a(x,2x],二分找到 aaa 的值即可。
  • a=1a=1a=1 的情況比較惡心,建議特判處理。

    Code\text{Code}Code

    #include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=4e5+100; 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 c; inline char ask(int x,int y){printf("? %d %d\n",x,y);fflush(stdout);scanf(" %c",&c);return c; } char s[105]; signed main(){ #ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout); #endif while(1){scanf(" %s",s+1);if(s[1]=='m'||s[1]=='e') return 0;int x=1;while(1){if(ask(x,x<<1)=='x') break;else x<<=1;}if(x==1){if(ask(2,1)=='y') printf("! 2\n");else printf("! 1\n");fflush(stdout);}else{int st=x+1,ed=x<<1;while(st<ed){int mid=(st+ed)>>1;if(ask(mid,x)=='x') st=mid+1;else ed=mid;}printf("! %d\n",st);fflush(stdout);}}return 0; } /**/

    CF1103C Johnny Solving

    Description\text{Description}Description

    給出一張無重邊的無向圖(保證每個點度數大于等于 333)和一個限制 kkk,需要你構造以下兩種情況中的一種:

    1、找出一條路徑長度為 n/kn/kn/k。

    2、找出 kkk 個環,使得每個環的長度大于 333 而且不是 333 的倍數,并且要求保證每個環中至少有一個點在這 kkk 個環里只出現一次。

    Solution\text{Solution}Solution

    不錯的一道題。
    不難想到先建出 dfs 生成樹的套路。
    然后,若直徑大于 n/kn/kn/k,就已經滿足條件一了。
    否則,必然有每個結點的深度不超過 n/kn/kn/k,那么葉子的數量必然不少于 kkk 個。
    同時,每個葉子 uuu 必然至少有兩條非樹返祖邊。,假設分別連向 x,yx,yx,y。
    分類討論一下一定有一個不是 333 的倍數的環。
    把葉子作為代表結點即可。

    Code\text{Code}Code

    #include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=5e5+100; 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,k; 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],jd[N]; vector<int>v[N]; int fa[N],dep[N]; void dfs(int x,int f){fa[x]=f;dep[x]=dep[f]+1;vis[x]=1;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;if(vis[to]){if(dep[to]<dep[x]) v[x].push_back(to); }else{jd[x]=1;dfs(to,x);}}return; } void print(int x,int tp){//printf("%d\n",dep[x]-dep[tp]+1);while(x!=fa[tp]) printf("%d ",x),x=fa[x];putchar('\n');return; } inline bool ok(int o){return o>2&&o%3;} bool bac[4]; bool pd[N]; signed main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();k=read();for(int i=1;i<=m;i++){int x=read(),y=read();addline(x,y);addline(y,x);}dfs(1,0);for(int i=1;i<=n;i++){if(1ll*dep[i]*k>=n){printf("PATH\n");printf("%d\n",dep[i]);print(i,1);return 0;}}printf("CYCLES\n");for(int i=1;i<=n&&k;i++){int x(0),y(0),z(0);bac[0]=bac[1]=bac[2]=0;if(jd[i]) continue;for(auto now:v[i]){if(pd[now]) continue;if(ok(dep[i]-dep[now]+1)){printf("%d\n",dep[i]-dep[now]+1);pd[i]=1;print(i,now);k--;break;}else if(x&&ok(abs(dep[x]-dep[now])+1+1)){if(dep[x]>dep[now]) swap(x,now);printf("%d\n%d ",dep[now]-dep[x]+1+1,i);print(now,x);pd[i]=1;k--;break;}else if(y&&ok(abs(dep[y]-dep[now])+1+1)){if(dep[y]>dep[now]) swap(y,now);printf("%d\n%d ",dep[now]-dep[y]+1+1,i);print(now,y);pd[i]=1;k--;break;}else if(z&&ok(abs(dep[z]-dep[now])+1+1)){if(dep[z]>dep[now]) swap(z,now);printf("%d\n%d ",dep[now]-dep[z]+1+1,i);print(now,z);pd[i]=1;k--;break;}if(!bac[dep[now]%3]){bac[dep[now]%3]=1;if(!x) x=now;else if(!y) y=now;else if(!z) z=now;}}}return 0; } /**/

    CF1103D Professional layer

    Description\text{Description}Description

    給定 1≤n≤1061 \le n \le 10^61n106 個正整數 ai,1≤ai≤1012a_i,1 \le a_i≤10^{12}ai?,1ai?1012,以及正整數 1≤k≤10121 \le k \le 10^{12}1k1012,修改第 iii 個正整數 aia_iai? 的花費為 ei,1≤ei≤109e_i,1 \le e_i \le 10^9ei?,1ei?109

    要求選出若干個正整數進行一次修改,使得修改后所有正整數的最大公約數等于 111 。修改操作為:對于正整數 aaa,選擇 aaa 的一個約數 d≤kd \le kdk,把 aaa 修改為 $ \frac{a}ozvdkddzhkzd$。

    設選出并修改的正整數有 xxx 個,他們的花費之和為 yyy,則總的修改花費為 x×yx \times yx×y。求最小花費。

    Solution\text{Solution}Solution

    毒瘤狀壓題。
    不難想到,公因數的質因子不超過 111111 個,可以狀壓。
    關鍵就是對復雜度的優化。
    (以下設質因子個數為 kkk
    樸素 dp 的復雜度是 O(nk3k)O(nk3^k)O(nk3k),難以通過。
    考慮優化。
    首先,注意到會有大量的重復數(打表可知不同的數只有 10410^4104 個),每種數字取代價最小的前 kkk 個即可。
    然后,數的數里降到了十萬級別,我們可以暴力求出每個數可以轉移到那些質因數集合,而每個集合其實也只需要取前 kkk 個數進行轉移,所以轉移數降到了 k×2kk\times2^kk×2k
    對每個轉移集合的補集枚舉子集轉移,再加上枚舉一維選取個數的復雜度,總復雜度 3k×k23^k\times k^23k×k2。
    注意每次不能暴力更新滾動數組,復雜度會假掉,所以需要開個 vector 記錄一下更新了哪些狀態。
    注意開 longlong。

    Code\text{Code}Code

    #include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=2e6+100; 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 k,flag; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} struct node{ll a,c; }p0[N],p[N]; bool cmpc(node x,node y){return x.c<y.c;} bool cmpa(node x,node y){return x.a<y.a;} ll tot,g; ll dp[2][13][2105],now,nxt; ll prime[13],cnt; map<ll,int>mp; vector<int>v[2105]; ll w[13],mi[13],bit[2105]; vector<int>vv[N]; void findtrans(int id){ll x=p[id].a;//ll x=p[i].a;for(int j=1;j<=cnt;j++){w[j]=1;while(x%prime[j]==0){x/=prime[j];w[j]*=prime[j];}}for(int s=0;s<(1<<cnt);s++){ll o=1;int ss=s;if((int)v[s].size()==cnt) continue;while(ss){o*=w[bit[ss&-ss]+1];ss-=ss&-ss;}if(o<=k){//v.push_back(s);v[s].push_back(id);//printf(" s=%d o=%lld\n",s,o);}} } void init(){int tp=floor(sqrt(g));for(int i=2;i<=tp;i++){if(g%i==0){prime[++cnt]=i;while(g%i==0) g/=i;}}if(g>1) prime[++cnt]=g;sort(p0+1,p0+1+n,cmpc);for(int i=1;i<=n;i++){int x=p0[i].a;if(mp.find(x)!=mp.end()&&mp[x]>=cnt) continue;p[++tot]=p0[i];mp[x]=mp[x]+1;/*for(int j=1;j<=cnt;j++){if(x%prime[j]==0){p[++tot]=p0[i];mp[x]=mp[x]+1;break;}}*/}mi[0]=1;bit[1]=0;for(int i=1;i<=cnt;i++) mi[i]=mi[i-1]<<1,bit[mi[i]]=i;for(int i=1;i<=tot;i++) findtrans(i);//sort(p+1,p+1+tot,cmpa);for(int i=0;i<(1<<cnt);i++){for(auto x:v[i]) vv[x].push_back(i);} } vector<int>tr; void DP(){memset(dp,0x3f,sizeof(dp));dp[now=1][0][0]=0;for(int i=1;i<=tot;i++){//swap(nxt,now);tr.clear();for(auto ns:vv[i]){int t=((1<<cnt)-1)^ns,T=t;//debug("ns=%d\n",ns);dp[nxt][1][ns]=min(dp[nxt][1][ns],p[i].c);tr.push_back(ns);for(;t;t=T&(t-1)){tr.push_back(t|ns);for(int o=0;o<cnt;o++){//debug("ns=%d t=%d o=%d\n",ns,t,o);dp[nxt][o+1][t|ns]=min(dp[nxt][o+1][t|ns],dp[now][o][t]+p[i].c);}}}for(auto s:tr){for(int o=0;o<=cnt;o++) dp[now][o][s]=min(dp[now][o][s],dp[nxt][o][s]);}/*for(int s=0;s<(1<<cnt);s++){for(int o=0;o<=cnt;o++){dp[nxt][o][s]=min(dp[nxt][o][s],dp[now][o][s]);//if(dp[nxt][o][s]<1e9) printf("s=%d num=%d dp=%lld\n",s,o,dp[nxt][o][s]);} }*/} } void findans(){ll ans(2e18),op;for(int i=0;i<=cnt;i++){if(dp[now][i][(1<<cnt)-1]<1e18){if(ans>dp[now][i][(1<<cnt)-1]*i) op=i;ans=min(ans,dp[now][i][(1<<cnt)-1]*i);}}printf("%lld\n",ans>1e18?-1:ans);//if(flag) printf("g=%lld op=%lld tot=%lld\n",g,op,tot);//debug("ans=%lld num=%lld\n",ans,op); } signed main(){ #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifn=read();k=read();for(int i=1;i<=n;i++) p0[i].a=read(),g=gcd(g,p0[i].a);for(int i=1;i<=n;i++) p0[i].c=read();//printf("g=%lld\n",g);flag=p0[1].a==204367626045ll;init();//debug("ok\n");DP();findans();return 0; } /**/

    總結

    以上是生活随笔為你收集整理的CodeForces:1103(div1)1104(div2)的全部內容,希望文章能夠幫你解決所遇到的問題。

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