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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

codeforces contest 1142

發(fā)布時(shí)間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces contest 1142 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

這個(gè)contest是div1的,div2的題其實(shí)也做了一下,但這里就不貼出了

CF 1142 A

題目大意:有nnn個(gè)城市排成一圈,相鄰兩個(gè)城市距離為kkk,一個(gè)人從起點(diǎn)SSSSSS未給出)開始,每次走xxxxxx未給出)的距離,當(dāng)其第二次到達(dá)SSS時(shí)就不再走了
現(xiàn)在給出離起始位置最近的城市的距離aaa和離走一步后的位置最近的城市的距離bbb,求可能的走的步數(shù)的最大值和最小值
n,k≤105n,k\le10^5n,k105
題解:
這題的英文題意有點(diǎn)點(diǎn)難懂
首先,我們可以分類討論aaabbb的情況(因?yàn)槲覀儼l(fā)現(xiàn)最近可以是左邊也可以是右邊,所以我們討論的話有4種可能性),然后我們再討論跨過的城市數(shù),就可以唯一確定xxxSSS其實(shí)也可以知道,但是這里用不到)
我們考慮步數(shù)的情況,設(shè)步數(shù)為lll圈數(shù)為ttt,那么滿足lx=nktlx=nktlx=nktl=nktxl=\frac{nkt}{x}l=xnkt?
由于第一次走到SSS就不繼續(xù)走了,所以一定滿足t=xgcd(nk,x)t=\frac{x}{gcd(nk,x)}t=gcd(nk,x)x?
ttt已經(jīng)固定,那么代入可得l=nkgcd(nk,x)l=\frac{nk}{gcd(nk,x)}l=gcd(nk,x)nk?,我們希望lll求最值,那么就對gcd(nk,x)gcd(nk,x)gcd(nk,x)求最值即可,復(fù)雜度O(n)\mathcal O(n)O(n)

#include<bits/stdc++.h> typedef long long ll; #define rg register template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;} template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');} template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);} template <typename T> inline T min(const T a,const T b){return a<b?a:b;} template <typename T> inline T max(const T a,const T b){return a>b?a:b;} template <typename T> inline T gcd(const T a,const T b){if(!b)return a;return gcd(b,a%b);} ll n,k,a,b; int main() {read(n),read(k),read(a),read(b);ll mi=0x7fffffffffffffff,mx=0;for(int i=0;i<n;i++){ll x1=gcd(n*k,k-a-b+i*k),x2=gcd(n*k,k+b-a+i*k),x3=gcd(n*k,a+b +i*k),x4=gcd(n*k,k+a-b+i*k);mi=min(mi,min(x1,min(x2,min(x3,x4))));mx=max(mx,max(x1,max(x2,max(x3,x4))));}print(n*k/mx),putchar(' '),print(n*k/mi);return 0; }

CF 1142 B

題目大意:給定一個(gè)長度為nnn的排列AAA和一個(gè)長度為mmm的數(shù)組BBB
若干組詢問,每次詢問數(shù)組BBB的一個(gè)子段CCC(位置是lllrrr)是否包含一個(gè)子序列DDD使得AAADDD循環(huán)同構(gòu)
n,m≤2?105n,m\le2·10^5n,m2?105
題解: 我們考慮預(yù)處理每個(gè)端點(diǎn)lll,存在一個(gè)合法的DDDrrr的最小值
由于這題中的AAA是個(gè)排列,所以以每個(gè)點(diǎn)開始的下一個(gè)位置都是唯一確定的
考慮倍增以每個(gè)位置開始走2k2^k2k步的最靠左位置,最后直接通過這個(gè)數(shù)組算出走n?1n-1n?1步的最靠左位置即可,復(fù)雜度O(nlogn)\mathcal O(nlogn)O(nlogn)

#include<bits/stdc++.h> typedef long long ll; #define rg register template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;} template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');} template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);} template <typename T> inline T min(const T a,const T b){return a<b?a:b;} template <typename T> inline T max(const T a,const T b){return a>b?a:b;} int n,m,q; int las[200005],nxt[200005],a[200005],b[200005],f[200005][19],ml[200005]; int main() {read(n),read(m),read(q);for(rg int i=1;i<=n;i++)read(a[i]);for(rg int i=1;i<=m;i++)read(b[i]);for(rg int i=1;i<n;i++)nxt[a[i]]=a[i+1];nxt[a[n]]=a[1];for(rg int i=1;i<=n;i++)las[i]=m+1;for(rg int j=0;j<=18;j++)f[m+1][j]=m+1;n--;ml[m+1]=m+1;for(rg int i=m;i>=1;i--){f[i][0]=las[nxt[b[i]]];las[b[i]]=i;for(rg int j=1;j<=18;j++)f[i][j]=f[f[i][j-1]][j-1];int tot=i;for(rg int j=0;j<=18;j++)if((1<<j)&n)tot=f[tot][j];ml[i]=min(ml[i+1],tot);}while(q--){int l,r;read(l),read(r);putchar((r>=ml[l])+'0');}return 0; }

CF 1142 C

題目大意:給定平面上的nnn個(gè)點(diǎn),很顯然,兩個(gè)xxx坐標(biāo)不同的點(diǎn)確定一個(gè)二次函數(shù)y=x2+bx+cy=x^2+bx+cy=x2+bx+c
問有多少個(gè)二次函數(shù)滿足沒有點(diǎn)被包在內(nèi)部(一個(gè)點(diǎn)(xi,yi)(x_i,y_i)(xi?,yi?)被二次函數(shù)包在內(nèi)部的定義是yi&gt;xi2+bxi+cy_i&gt;x_i^2+bx_i+cyi?>xi2?+bxi?+c
n≤105n\le10^5n105
題解:
CCC題就計(jì)算幾何了,但是這題并不麻煩
我們考慮把式子移項(xiàng)
變成y?x2=bx+cy-x^2=bx+cy?x2=bx+c
即如果每個(gè)點(diǎn)(xi,yi)(x_i,y_i)(xi?,yi?)變成(xi,yi?xi2)(x_i,y_i-x_i^2)(xi?,yi??xi2?),就成了兩個(gè)點(diǎn)確定一個(gè)一次函數(shù)了
考慮被包住的定義,同樣移項(xiàng)變成yi?xi2&gt;bxi+cy_i-x_i^2&gt;bx_i+cyi??xi2?>bxi?+c,相當(dāng)于就是在這個(gè)一次函數(shù)的上方
我們發(fā)現(xiàn),這樣就好做了,考慮上下凸殼求凸包法,我們直接輸出上凸殼的邊數(shù)即可
求凸殼復(fù)雜度O(nlogn)\mathcal O(nlogn)O(nlogn)

#include<bits/stdc++.h> typedef long long ll; #define rg register template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;} template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');} template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);} template <typename T> inline T min(const T a,const T b){return a<b?a:b;} template <typename T> inline T max(const T a,const T b){return a>b?a:b;} int n,top=1; struct Point {ll x,y;bool operator <(const Point b)const{return x==b.x?y>b.y:x<b.x;}Point operator -(const Point b)const{return (Point){x-b.x,y-b.y};} }Q[100001]; ll Cross(Point a,Point b){return a.x*b.y-a.y*b.x;} int main() {read(n);for(rg int i=1;i<=n;i++)read(Q[i].x),read(Q[i].y),Q[i].y-=Q[i].x*Q[i].x;std::sort(Q+1,Q+n+1);for(rg int i=2;i<=n;i++)if(Q[i].x!=Q[top].x){while(top>1&&Cross(Q[i]-Q[top-1],Q[top]-Q[top-1])<=0)top--;Q[++top]=Q[i];}print(top-1);return 0; }

CF 1142 D

題目大意:定義一個(gè)數(shù)列AAA,滿足如下性質(zhì):

  • Ai&lt;Aj(i&lt;j)A_i&lt;A_j(i&lt;j)Ai?<Aj?(i<j)
  • Ai=i(1≤i≤9)A_i=i(1\le i\le9)Ai?=i(1i9)
  • ?i\forall i?i,設(shè)c=imod&ThinSpace;&ThinSpace;11c=i\mod11c=imod11,滿足Ai?10+0,Ai?10+1???Ai?10+c?1A_i*10+0,A_i*10+1···A_i*10+c-1Ai??10+0,Ai??10+1???Ai??10+c?1都在數(shù)列中,Ai?10+c,Ai?10+c+1???Ai?10+9A_i*10+c,A_i*10+c+1···A_i*10+9Ai??10+c,Ai??10+c+1???Ai??10+9都不在數(shù)列中

給定一個(gè)字符串SSS,求有多少種作為一個(gè)子串出現(xiàn)的數(shù)xxx(x≥1x\ge1x1)滿足xxx在數(shù)列AAA
∣S∣≤105|S|\le10^5S105
題解:
cf的官方題解好像是建個(gè)自動(dòng)機(jī)狀物,反正我也沒仔細(xì)的看
好像有個(gè)比較好寫的做法
定義f[i][j]f[i][j]f[i][j]為從iii開始的子段,在前面匹配一個(gè)jjj之后出現(xiàn)在數(shù)列中的數(shù)的數(shù)量
考慮轉(zhuǎn)移,首先我們發(fā)現(xiàn)兩位數(shù)ab ̄\overline{ab}ab當(dāng)且僅當(dāng)a&gt;ba&gt;ba>b才會(huì)在數(shù)列AAA中,那么,顯然的,對于一個(gè)高位數(shù)abT ̄\overline{abT}abT,如果a≤ba\le bab,那么這個(gè)數(shù)一定不在數(shù)列中
考慮轉(zhuǎn)移,如果想從cT ̄\overline{cT}cT轉(zhuǎn)移到abT ̄\overline{abT}abT,那么就要保證c?ab ̄c\Leftrightarrow\overline{ab}c?ab,即判定一個(gè)二位數(shù)是當(dāng)前數(shù)列第幾個(gè),模111111即可,所以我們發(fā)現(xiàn)fff的第二維狀態(tài)元素有111111個(gè),這樣的話總復(fù)雜度是O(n?p)\mathcal O(n*p)O(n?p)的(本題中p=11p=11p=11

#include<bits/stdc++.h> typedef long long ll; #define rg register template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;} template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');} template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);} template <typename T> inline T min(const T a,const T b){return a<b?a:b;} template <typename T> inline T max(const T a,const T b){return a>b?a:b;} int n,mod=11; char s[100001]; int f[100005][11]; ll ans; int main() {scanf("%s",s+1),n=strlen(s+1);for(rg int i=n;i>=1;i--){const int d=s[i]-'0';for(rg int j=0;j<mod;j++){if(j>d)f[i][j]=1+f[i+1][(j*(j-1)/2+d+10)%mod];}if(s[i]>'0')ans+=f[i+1][s[i]-'0']+1;}print(ans);return 0; }

CF 1142 E

題目大意:交互題(即會(huì)根據(jù)你的輸出給接下來的輸入):一個(gè)nnn個(gè)點(diǎn)的完全圖,每條邊有個(gè)方向和顏色,現(xiàn)在有mmm條邊是粉色的,告訴你這些粉色邊的方向,剩下的邊都是綠色的
每次我們可以詢問一條綠色邊的方向,我們需要使用不超過2?n2*n2?n次詢問找到一個(gè)點(diǎn)xxx使得對于每個(gè)點(diǎn)yyy都滿足xxxyyy有一條只包含一種顏色的邊的路徑
題解:
我們先考慮沒有粉色邊的情況我們維護(hù)前iii個(gè)點(diǎn)中滿足條件的點(diǎn)xxx,我們發(fā)現(xiàn),對于新來一個(gè)點(diǎn)yyy,直接詢問(x,y)(x,y)(x,y),即可,如果x?&gt;yx-&gt;yx?>y,那么保持不變,如果y?&gt;xy-&gt;xy?>x,那么yyy就替代xxx成為新的滿足條件的點(diǎn),這樣我們只需要n?1n-1n?1次詢問就可以找到這個(gè)點(diǎn)
考慮有粉色邊的情況,首先我們可以通過模擬把聯(lián)通的粉色邊給全部消除,定義消除完后的點(diǎn)都叫粉色點(diǎn),現(xiàn)在我們需要把這些點(diǎn)用綠邊連起來,由于要求路徑是同色的,所以在一條綠邊x?&gt;yx-&gt;yx?>y的情況下,所有yyy的粉色出邊都是不合法的,那么這個(gè)時(shí)候就要把yyy的粉色出邊的點(diǎn)的度數(shù)粉邊入度減少,若減到000了,那么就要把這個(gè)點(diǎn)恢復(fù)過來
然后由于每次綠邊的詢問都能刪一個(gè)點(diǎn),所以還是只需要n?1n-1n?1次詢問
注意一件事,在模擬把粉色邊連接的點(diǎn)合并的時(shí)候,要注意不能出現(xiàn)環(huán)的情況
我一開始的寫法沒有考慮這個(gè)問題,就wa了

#include<bits/stdc++.h> typedef long long ll; #define rg register template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;} template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');} template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);} template <typename T> inline T min(const T a,const T b){return a<b?a:b;} template <typename T> inline T max(const T a,const T b){return a>b?a:b;} const int maxn=100001; int n,m,ip; std::vector<int>E[maxn],M[maxn]; bool vis[maxn],in[maxn]; int d[maxn]; void dfs(const int u) {vis[u]=in[u]=1;for(std::vector<int>::iterator Pos=E[u].begin();Pos!=E[u].end();Pos++){if(!in[*Pos])M[u].push_back(*Pos),d[*Pos]++;if(!vis[*Pos])dfs(*Pos);}in[u]=0; } int Q[maxn],top; int query(int x,int y) {printf("? %d %d\n",x,y),fflush(stdout);int z;scanf("%d",&z);return z; } void ans(int x) {printf("! %d\n",x),fflush(stdout); } int main() {scanf("%d%d",&n,&m);for(rg int i=1;i<=m;i++){int u,v;read(u),read(v);E[u].push_back(v);}for(rg int i=1;i<=n;i++)if(!vis[i])dfs(i);for(rg int i=1;i<=n;i++)if(!d[i])Q[++top]=i;ip=Q[1];for(rg int i=2;i<=top;i++){int u=Q[i];if(!query(ip,u))std::swap(ip,u);for(std::vector<int>::iterator Pos=M[u].begin();Pos!=M[u].end();Pos++)if(--d[*Pos]==0)Q[++top]=*Pos;}ans(ip);return 0; }

總結(jié)

以上是生活随笔為你收集整理的codeforces contest 1142的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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