寒假每日一题(提高组)Week 1 完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假每日一题(提高组)Week 1 完结相关的知识,希望对你有一定的参考价值。
目录
1402. 星空之夜【dfs + 哈希】
https://www.acwing.com/problem/content/description/1404/
本题最难的一个点在于如何判断,两图形是同一个。即如何记录图形,这里可以用哈希值来对应相应的图形,
为了尽可能的避免碰撞,故将图形内任意两点的距离和作为哈希值。
#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;
以上是关于寒假每日一题(提高组)Week 1 完结的主要内容,如果未能解决你的问题,请参考以下文章