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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

寒假每日一题(提高组)【Week 1 完结】

發(fā)布時間:2025/3/20 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 寒假每日一题(提高组)【Week 1 完结】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 1402. 星空之夜【dfs + 哈希】
  • 479. 加分二叉樹【DP】
  • 1414. 牛異或【trie】

1402. 星空之夜【dfs + 哈希】


https://www.acwing.com/problem/content/description/1404/
本題最難的一個點在于如何判斷,兩圖形是同一個。即如何記錄圖形,這里可以用哈希值來對應(yīng)相應(yīng)的圖形,
為了盡可能的避免碰撞,故將圖形內(nèi)任意兩點的距離和作為哈希值。

#include<bits/stdc++.h> using namespace std; const int N=110; string s[N]; int n,m,idx,st[N][N]; int dx[8]={-1,-1,-1,0,0,1,1,1}; int dy[8]={-1,0,1,-1,1,-1,0,1}; vector<pair<int,int>>ve; void dfs(int x,int y) {ve.push_back({x,y});st[x][y]=1;for(int i=0;i<8;i++){int tempx=x+dx[i],tempy=y+dy[i];if(tempx<0||tempx>=n) continue;if(tempy<0||tempy>=m) continue;if(st[tempx][tempy]) continue;if(s[tempx][tempy]!='1') continue;dfs(tempx,tempy);} } map<double,int>mp; void solve()//染字母 {double sum=0;//連通塊任意點的距離和作為哈希值for(int i=0;i<ve.size();i++){for(int j=i+1;j<ve.size();j++){int x=ve[i].first,y=ve[i].second;int xx=ve[j].first,yy=ve[j].second;sum+=sqrt(1.0*(x-xx)*(x-xx)+(y-yy)*(y-yy));}}int w=0,flag=0;for(auto i=mp.begin();i!=mp.end();i++){auto temp=i->first;if(abs(temp-sum)<1e-5) {w=i->second;flag=1;break;}}if(!flag) w=idx,mp[sum]=idx++;for(int i=0;i<ve.size();i++) {s[ve[i].first][ve[i].second]='a'+w;} } int main(void) {cin>>m>>n;for(int i=0;i<n;i++) cin>>s[i];for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(s[i][j]=='1'&&!st[i][j]) {ve.clear();dfs(i,j);solve();}}}for(int i=0;i<n;i++) cout<<s[i]<<endl;return 0; }

479. 加分二叉樹【DP】

#include<bits/stdc++.h> using namespace std; const int N=110; int root[N][N],w[N],f[N][N],n; void dfs(int l,int r) {if(l>r) return;int k=root[l][r];cout<<k<<" ";dfs(l,k-1);dfs(k+1,r); } int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>w[i];for(int len=1;len<=n;len++){for(int i=1;i+len-1<=n;i++){int l=i,r=i+len-1;for(int k=l;k<=r;k++){int left=(k==l)?1:f[l][k-1];int right=(k==r)?1:f[k+1][r];int score=left*right+w[k];if(l==r) score=w[k];if(f[l][r]<score){f[l][r]=score;root[l][r]=k;}}}}cout<<f[1][n]<<endl;dfs(1,n);return 0; }

1414. 牛異或【trie】

#include<bits/stdc++.h> using namespace std; const int N=1e5*21; int son[N][2],s[N],id[N],idx,n; void insert(int u,int k) {int p=0;for(int i=20;i>=0;i--){int t=u>>i&1;if(!son[p][t]) son[p][t]=++idx;p=son[p][t];}id[p]=k; } int query(int u) {int p=0;for(int i=20;i>=0;i--){int t=u>>i&1;if(son[p][!t]) p=son[p][!t];else p=son[p][t];}return id[p]; } int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>s[i],s[i]^=s[i-1];int ans=-1,l,r;insert(s[0],0);for(int i=1;i<=n;i++){int k=query(s[i]);int temp=s[i]^s[k];if(temp>ans) ans=temp,l=k+1,r=i;insert(s[i],i);}cout<<ans<<" "<<l<<" "<<r<<endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的寒假每日一题(提高组)【Week 1 完结】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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