“有联系”如何建立联系和集合多对一

一、F - 小沙的算术

知识点:复杂度分析;并查集应用;并查集思想(数组实现,建立联系);可以开一些无用空间不填东西或者初始化成一个值;逆元、模计算;从后往前看问题(延时一步);从前往后看问题

首先分析这个问题的复杂度,把问题取个极限。比如这个题,如果全是乘法,按照我最朴素的模拟想法,即从乘法开始用指针找到加号为止,时间为1e6,不可取;如果全是一个乘法一个加法,则最多有1e6/2组,如果是用记录左和右坐标的方法还是不行。

这个问题的关键是 划分组别

如果是加号就把他分开即下面的else

如果是乘号就把他合起来

int f[maxn]  
long long sum[maxn]
sum[1]=a[1]; f[1]=1;
    for (int i=2; i<=n; ++i)
        if (ch[i-1]=='*') f[i]=f[i-1],sum[f[i-1]]=sum[f[i-1]]*a[i]%mm;
        else f[i]=i,sum[i]=a[i];
    for (int i=1; i<=n; ++i) ans=(ans+sum[i])%mm;

sum尽管有为0的地方也不用管他。int 类型的 f[]就是用来充当sum的坐标的。

注意对应关系的转变:本题是某个区间的多个x的值对应这个区间的乘积y,把他放到sum里,每次改只需要取一小段改即可不用再把整个数组遍历一遍,由i找f的值,由f的值找sum,提取出这个区间的值。这是两个映射关系 

  • 注意sum[ i ] , sum [ f [ i ] ] 的区别 !多多利用第二种映射关系解决问题
  • for循环i从2开始,从后往前看,操作i-1,别嫌麻烦,从多个角度想一想想好再写。这利用了一点stack的思想,有优先级的时候要这样考虑问题。
ll inv(ll m){
    return ksm(mod-2,m);
}
int find(int x){
    return f[x]==x?x:f[x]=find(f[x]);
}
void solve(){
    int n=read(),q=read();
    string str;cin>>str;str=" "+str;
    for(int i=1;i<=n;i++)f[i]=i,ac[i]=s[i]=read(),assert(0

二、价值序列“有联系”如何建立联系和集合多对一_第1张图片

int T, n, a[maxn], b[maxn], num[maxn];
bool vis[maxn];
ll t[maxn];

read(T);
    t[0] = 1;
    rep(i, 1, maxn - 1) t[i] = t[i - 1] * 2 % mod;
    while (T--) {
        read(n);
        rep(i, 1, n) { read(a[i]); }
        int cnt = 0;
        rep(i, 1, n) {
            b[++cnt] = a[i];
            num[cnt] = 1;
            while (i < n && a[i] == a[i + 1]) {
                ++i;
                ++num[cnt];
            }
        }
        vis[1] = vis[cnt] = true;
        rep(i, 2, cnt - 1) {
            if (b[i] > b[i - 1] && b[i] > b[i + 1])
                vis[i] = true;
            else if (b[i] < b[i - 1] && b[i] < b[i + 1])
                vis[i] = true;
        }
        ll res = 1;
        rep(i, 1, cnt) {
            if (!vis[i]) {
                res = res * t[num[i]] % mod;
            } else {
                res = res * (t[num[i]] - 1 + mod) % mod;
            }
        }
        print(res, '\n');
        rep(i, 1, cnt) vis[i] = false, num[i] = 0;
    }

你可能感兴趣的:(算法,leetcode,职场和发展)