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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[20180818]校内模拟赛

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [20180818]校内模拟赛 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

T1 與(and)

題目在這

Solution

從最高位開始搜,假設(shè)當(dāng)前搜到i位,如果有兩個以上的數(shù)第i位是1,那么Answer的第i位肯定是1,把這位不是1的數(shù)都去掉,繼續(xù)往下搜,在這個過程中更新Answer。


#include<iostream> #include<cstdio> #include<cstring> inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f; } #define MN 300005 long long n,a[MN],cnt,ans; int main(){freopen("and.in","r",stdin);freopen("and.out","w",stdout);n=read();register int i,j,k;for(i=1;i<=n;i++) a[i]=read();for(j=30;j>=0;j--){cnt=0;for(i=1;i<=n;i++) if((a[i]>>j)&1) cnt++;if(cnt>=2){for(i=1,k=0;i<=n;i++) if((a[i]>>j)&1) a[++k]=a[i];ans+=(1<<j);n=cnt;}}printf("%lld\n",ans);return 0; }




T2 計數(shù)(count)

題目在這

Solution

記f[i][j]表示有i位、各位數(shù)之和是j的數(shù)量。

顯然,前n位之和與后n位之和相等的數(shù)和奇數(shù)位之和與偶數(shù)位之和相等的均有
\[ \sum_{i=0}^M f_{n,i} \ \ \ \ \ \ (其中M表示n位數(shù)的各位數(shù)之和的最大值) \]
把兩者相加,再減去同時滿足兩個條件的數(shù)的數(shù)量。

我們設(shè)前n位的奇數(shù)位和為a,偶數(shù)位為b;后n位的奇數(shù)位和位c,偶數(shù)位和為d。

所以 $ a+b=c+d $并且 $ a+c=b+d $ 所以 $ a=c $ 并且$ b=d$。

那么這部分的方案數(shù)等于:
\[ \sum_{i=0}^M f_{n/2,i}* \sum_{j=0}^M f_{(n+1)/2,j} \]

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define mod 999983 int n,cc,s[15],ans,a,b; int f[1005][9005]; char S[15]; inline void add(int &x,long long y){x+=y;while(x>=mod) x-=mod;} inline void minus(int &x,long long y){x-=y;while(x<0) x+=mod;} int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);scanf("%d%s",&n,S+1);cc=strlen(S+1);register int i,j,k;for(i=1;i<=cc;i++) s[i]=S[i]-'0';std::sort(s+1,s+cc+1);f[0][0]=1;int MAX=s[cc]*n;for(i=0;i<n;i++)for(j=0;j<=MAX;j++)if(f[i][j]>0){for(k=1;k<=cc;k++) add(f[i+1][j+s[k]],f[i][j]);}for(i=0;i<=MAX;i++) add(ans,((2LL)*f[n][i]*f[n][i])%mod);int len1=n>>1,len2=n+1>>1;MAX=s[cc]*len2;for(i=0;i<=MAX;i++){add(a,(1LL*f[len2][i]*f[len2][i])%mod);add(b,(1LL*f[len1][i]*f[len1][i])%mod);}printf("%d\n",(ans-(1LL*a*b)%mod+mod)%mod);return 0; }




T3 三角形(triangle)

題目在這

Solution

題目即判斷鏈上是否存在a[x]+a[y]>a[z]

將鏈上的權(quán)值取出來排序,只需要判斷是否有b[i]+b[i+1]>b[i+2]

如果都不滿足,則有b[i+2]>=b[i]+b[i+1],則b[i]至少會以斐波那契數(shù)列增長的速度增長

那么如果鏈的長度超過一定值(O(log 2^31)級別),必然存在合法的三元組

如果不超過,暴力判斷即可

注意:會爆int

#include<cstdio> #include<cstring> #include<algorithm> inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f; } #define MN 100005 int n,m,a[MN],dep[MN],f[MN]; int Sort[MN],cnt; struct edge{int to,nex; }e[MN<<1];int hr[MN],pin; inline void ins(int f,int t){e[++pin]=(edge){t,hr[f]};hr[f]=pin;e[++pin]=(edge){f,hr[t]};hr[t]=pin; } inline void dfs(int fa,int x){f[x]=fa;dep[x]=dep[fa]+1;register int i;for(i=hr[x];i;i=e[i].nex)if(e[i].to^fa)dfs(x,e[i].to); } inline bool solve(int x,int y){cnt=0;while(x!=y){if(dep[x]<dep[y]) std::swap(x,y);Sort[++cnt]=a[x];x=f[x];if(cnt>50) return 1;}Sort[++cnt]=a[x];if(cnt>50) return 1;std::sort(Sort+1,Sort+cnt+1);for(register int i=3;i<=cnt;i++)if(Sort[i]<1LL*(Sort[i-1])+Sort[i-2])return 1;return 0; } int main(){freopen("triangle.in","r",stdin);freopen("triangle.out","w",stdout);n=read();m=read();register int i,x,y,v;for(i=1;i<=n;i++) a[i]=read();for(i=1;i<n;i++)x=read(),y=read(),ins(x,y);dfs(0,1);while(m--){v=read();x=read();y=read();switch(v){case 1:a[x]=y;break;case 0:puts(solve(x,y)?"Y":"N");break;}}return 0; }





Blog來自PaperCloud,未經(jīng)允許,請勿轉(zhuǎn)載,TKS!

轉(zhuǎn)載于:https://www.cnblogs.com/PaperCloud/p/9497179.html

總結(jié)

以上是生活随笔為你收集整理的[20180818]校内模拟赛的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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