寒假每日一题(提高组)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 完结的主要内容,如果未能解决你的问题,请参考以下文章

寒假每日一题(提高组)Week 3 完结

寒假每日一题(提高组)Week 4 完结

寒假每日一题(入门组)week2 完结

寒假每日一题(入门组)week3 完结

寒假每日一题(入门组)week7 完结

寒假每日一题(入门组)week4 完结