zoukankan      html  css  js  c++  java
  • 0917 lxs 反思

    最近真的状态很低迷呢
    今天几乎到手 的解法我就是没有推出来
    不过我还是大致变沉稳了对于一道题的想法也变得正了起来 但是还是不够细心认真
    **一道题你拿到了发现要超时超空间 不要慌 要慢慢推出性质 **

    打比赛打到后面脑子完全是麻的 可能最近没怎么锻炼吧 那就从明天开始开始晨跑

    话说我学了一年还不如高一的新生呢
    思维真的是硬伤
    反思咕咕咕咕咕到明天

    睡了 晚安好梦

    (f)
    关于何老板的劝告
    最近状态不怎么样 连续几场比赛都 打的不好 总结了一下几点

    主要是思路打不开 思维僵化
    其次还是有点慌 不要慌
    我感觉我就是一味打表 没有对题有深入的了解
    对出题人考点把握不透彻
    其次要对照学会选择算法 比如算时间复杂度 空间复杂度 举出反例
    何老板说 要学会开题
    首先 得明确这道题考什么
    可以通过关键词 范围 确定 明确大致方向
    并且相信自己已经学过这些知识
    然后 再来想解
    不要随便想
    然后才开始各种打表 或者 推

    以后做题一定要想自己是怎么打开这个思路的

    A
    LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵。
    第一行的数字是
    (1 2 3 .. M)

    $ M+1 M+2 M+3 ... 2*M$

    $ (n-1)+1 (n-1)+2 (n-1)+3 ... N*M $

    例如 N=3 M =4
    (1 2 3 4)

    $5 6 7 8 $

    (9 10 11 12)

    对于身为智慧之神的LZK来说,这个矩阵过于无趣.于是他决定改造这个矩阵,改造会进行K次,每次改造会将矩阵的某一行或某一列乘上一个数字,
    你的任务是计算最终这个矩阵内所有数字的和,输出答案对(1e9+7)取模。

    解:
    此题我zz了 没有表示出最终的结果来 一直以为是一个打表题 就很naiive
    很显然因为乘法满足分配律 所以我们可以 对行和列进行分开来讨论
    答案就是 (sum_{i=1} ^n sum_{j=1}^m(((i-1)*m+j )*l[j]*r[i] ))

    我们对于这个柿子
    打开一下
    (sum_{i=1}^n r[i]*(sum_{j=1}^m ((i-1)*m*l[j] )+sum_{j=1}^m j*l[j]))

    然后我们发现 对于(sum_{j=1}^m m*l[j])(sum_{j=1}^m j*l[j])
    我们可以事先预处理出来
    然后就没了....

    这种数学问题显然需要进行 推公式的啊

    CODE:

        #include<stdio.h>
        #include<bits/stdc++.h>
        using namespace std;
        #define mod 1000000007
    
        #define ll long long 
        #define maxnn 2000000
        ll lie[maxnn],line[maxnn];
        ll sum[maxnn];ll n,m,k;
        ll tmp1=0,tmp2=0;
        ll x,y;
        ll ksc(ll a,ll b)
        {
        	ll ans=0;
        	while(b)
        	{
        		
        		if(b&1) (ans=ans+a)%mod;
        		b>>=1;
        		a=(a+a)%mod;
        	}
        	return ans;
    
        }
        int main()
        {
        	ios::sync_with_stdio(false);
        	cin.tie(0);
        	cin>>n>>m>>k;
        	for(int i=1;i<=n;i++) line[i]=1;
        	for(int i=1;i<=m;i++) lie[i]=1;
        	char c;
        	while(k--)
        	{
        		
        		cin>>c;
        		if(c=='R')
        		{
        			cin>>x>>y;
        			line[x]=ksc(line[x],y)%mod;
        			
        		}
        		else
        		{
        			cin>>x>>y;
        			lie[x]=ksc(lie[x],y)%mod;
        		
        		}
        	}
        	for(int i=1;i<=n;i++)
        	{
        		tmp1=(tmp1+(ksc(ksc((i-1),m),line[i])%mod))%mod;
        		tmp2=(tmp2+line[i])%mod;
        	}
        	ll ans=0;
        	for(int j=1;j<=m;j++)
        	{
        		sum[j]=ksc(tmp1+ksc(tmp2,j)%mod,lie[j])%mod;
        		ans=(ans+sum[j]%mod)%mod;
        	}
        	cout<<ans%mod;
        	
        			return 0;
        }
    
    

    B
    Problem:
    何老板有一个农场,农场可看作 (N imes M) 的方格,每个方格都是一块韭菜田。
    每块田都长有一定数量的韭菜。其中坐标为 ((i,j)) 的田,即第i行,第j列的这块田长有 (A_{i,j}) 公斤韭菜。
    何老板打算从坐标为 (X,Y) 的田出发,沿上下左右四个方向移动,每到达一块田,何老板会割走该田所有的韭菜。设当前何老板位于坐标为 ((i,j)) 的田,他收割到的韭菜为 (A_{i,j}) 公斤,当何老板离开该田后,该田又会立即长出 (A_{i,j}) 公斤韭菜。
    何老板今天打算移动 (T) 步,最后恰好回到起点 ((X,Y)) 。问,何老板最多能收割多少公斤韭菜。

    输入格式
    第一行:5个正整数 (N,M,X,Y,T)

    Solution:
    此题我列出了状态方程 但是发现可能会超空间 然后我就。。。
    然后听了讲题后 我发现我想对了一半 但是还是不够啊

    首先我们有两个我没有发现的性质

    这不是一条环 而是一条路重复走两次
    看T这么大 肯定是在两个点来回走 否则不是最优的

    然后看到n和m 很小 所以我们想到进行 (DP)

    (f[k][i][j])表示从起点走到 ((i,j)) 所获得的最大值
    $f[k][i][j]=max(f[k-1][i-1][j],f[k-1][i][j-1],f[k-1][i+1][j],f[k-1][i][j+1])+w[i][j] ( 然后你就可以来回走 )ans=max(ans,2f[k][i][j]+(T-2 imes k)/2(a[i][j]+maxx)-a[i][j])$

    code:

    //
    #include<iostream>
    #include<cmath>
    #include<cstdio>
    
    using namespace std;
    #define ll long long
    ll mapp[200][200];
    ll f[4][200][200];
    ll n,m,x,y,T;
    ll ans=0;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n>>m>>x>>y>>T;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>mapp[i][j];
            }
        }
        f[0][x][y]=0;
        for(int k=1;k<=min(m*n,T);k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    ll tmp1=0;
                    if(2*k>T) continue;
                    if(abs(i-x)+abs(j-y)>k) continue;
                    f[k&1][i][j]=max(f[(k-1)&1][i-1][j],max(f[(k-1)&1][i][j-1],max(f[(k-1)&1][i+1][j],f[(k-1)&1][i][j+1])))+mapp[i][j];
                    tmp1=max(mapp[i][j-1],max(mapp[i-1][j],max(mapp[i+1][j],mapp[i][j+1])));
                   
                    
                        {
                            ans=max(ans,2*f[k&1][i][j]+(((T-2*k))/2)*(mapp[i][j]+tmp1)-mapp[i][j]);
                        }
                }
            }
        }
        cout<<ans;
    }
    

    C

    #include<stdio.h>
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<set>
    using namespace std;
    #define maxnn 600100
    int las[maxnn],en[maxnn],nex[maxnn],tot;
    int f[maxnn][30];
    int in[maxnn],out[maxnn],cnt;
    int dep[maxnn];
    int n,m;
    int res[maxnn];
    set<int > s;
    set<int> ::iterator it;
    void add(int a,int b) {
        en[++tot]=b;
        nex[tot]=las[a];
        las[a]=tot;
    }
    int go_up(int a,int b) {
        int k=log2(n);
        for(int i=k; i>=0; i--) {
            if(b&(1<<i)) {
                a=f[a][i];
            }
            
        }
        return a;
        
    }
    int lca(int x,int y) {
        if(dep[x]<dep[y])swap(x,y);
        x=go_up(x,dep[x]-dep[y]);
        if(x==y) return y;
        int s=log2(n);
        for(int i=s; i>=0; i--) {
            if(f[x][i]!=f[y][i]) {
                x=f[x][i];
                y=f[y][i];
            }
        }
        return f[x][0];
        
    }
    void dfs(int v,int fa) {
        in[v]=++cnt;
        res[cnt]=v;
        dep[v]=dep[fa]+1;
        f[v][0]=fa;
        int s=log2(n);
        for(int i=1; i<=s; i++) {
            f[v][i]=f[f[v][i-1]][i-1];
        }
        
        for(int i=las[v]; i; i=nex[i]) {
            int u=en[i];
            if(u!=fa) {
                dfs(u,v);
            }
        }
        out[v]=cnt;
    }
    
    int main() {
        cin>>n>>m;
        int x;
        for(int i=2; i<=n; i++) {
            scanf("%d",&x);
            add(x,i);
        }
        dfs(1,0);
        
        while(m--) {
            scanf("%d",&x);
            if(x<0) {
                int ans=0;
                int pos=0;
                x=abs(x);
                if(s.upper_bound(in[x])!=s.end()) {
                    
                    if(ans<dep[lca(x,res[*s.upper_bound(in[x])])])
                        ans=dep[lca(x,res[*s.upper_bound(in[x])])],pos=lca(x,res[*s.upper_bound(in[x])]);
                }
                
                it=s.upper_bound(in[x]);
                if(it!=s.begin())
                {
                    it--;
                    if(ans<dep[lca(x,res[*it])])
                        ans=dep[lca(x,res[*it])],pos=lca(x,res[*it]);
                    
                }
                
                
                
                printf("%d
    ",pos);
            } else {
                if(s.count((in[x]))) {
                    s.erase(in[x]);
                    
                } else {
                    s.insert(in[x]);
                }
            }
            
        }
    }
    

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<set>
    using namespace std;
    #define maxnn 600100
    int las[maxnn],en[maxnn],nex[maxnn],tot;
    int f[maxnn][30];
    int in[maxnn],out[maxnn],cnt;
    int dep[maxnn];
    int n,m;
    int res[maxnn];
    set<int > s;
    set<int> ::iterator it;
    void add(int a,int b) {
        en[++tot]=b;
        nex[tot]=las[a];
        las[a]=tot;
    }
    int go_up(int a,int b) {
        int k=log2(n);
        for(int i=k; i>=0; i--) {
            if(b&(1<<i)) {
                a=f[a][i];
            }
            
        }
        return a;
        
    }
    int lca(int x,int y) {
        if(dep[x]<dep[y])swap(x,y);
        x=go_up(x,dep[x]-dep[y]);
        if(x==y) return y;
        int s=log2(n);
        for(int i=s; i>=0; i--) {
            if(f[x][i]!=f[y][i]) {
                x=f[x][i];
                y=f[y][i];
            }
        }
        return f[x][0];
        
    }
    void dfs(int v,int fa) {
        in[v]=++cnt;
        res[cnt]=v;
        dep[v]=dep[fa]+1;
        f[v][0]=fa;
        int s=log2(n);
        for(int i=1; i<=s; i++) {
            f[v][i]=f[f[v][i-1]][i-1];
        }
        
        for(int i=las[v]; i; i=nex[i]) {
            int u=en[i];
            if(u!=fa) {
                dfs(u,v);
            }
        }
        out[v]=cnt;
    }
    
    int main() {
        cin>>n>>m;
        int x;
        for(int i=2; i<=n; i++) {
            scanf("%d",&x);
            add(x,i);
        }
        dfs(1,0);
       
        while(m--) {
            scanf("%d",&x);
            if(x<0) {
                int ans=0;
                int pos=0;
                x=abs(x);
                if(s.upper_bound(in[x])!=s.end()) {
                   
                    if(ans<dep[lca(x,res[*s.upper_bound(in[x])])])
                ans=dep[lca(x,res[*s.upper_bound(in[x])])],pos=lca(x,res[*s.upper_bound(in[x])]);
                    }
                
                it=s.upper_bound(in[x]);
                if(it!=s.begin())
                {
                    it--;
                        if(ans<dep[lca(x,res[*it])])
                        ans=dep[lca(x,res[*it])],pos=lca(x,res[*it]);
                    
                    }
                    
                
                
                printf("%d
    ",pos);
            } else {
                if(s.count((in[x]))) {
                    s.erase(in[x]);
                    
                } else {
                    s.insert(in[x]);
                }
            }
            
        }
    }
    
    刀剑映出了战士的心。而我的心,漆黑且残破
  • 相关阅读:
    1725最少硬币问题(DP)
    3358高数Umaru系列(9)——哈士奇(DP)
    1018骨牌铺方格(分治算法)
    3664顺序表应用7:最大子段和之分治递归法(分治算法)
    1722整数因子分解问题(分治算法)
    剑指offer JZ-11
    剑指offer JZ-10
    剑指offer JZ-9
    剑指offer JZ-8
    剑指offer JZ-7
  • 原文地址:https://www.cnblogs.com/OIEREDSION/p/11531180.html
Copyright © 2011-2022 走看看