首页 > 其他分享 >D. Array Repetition

D. Array Repetition

时间:2024-01-17 20:11:10浏览次数:20  
标签:last ll cin len times Array Repetition 乘法

原题链接

核心大事实1:对于查询的点k对应的值一定是某个操作过后的最后一个值

核心大事实2:对于操作前数组长度大于k的都不用考虑

核心小事实:点k有两种情况
1.点k的位置在两次操作之间(乘法)
2.点k的位置恰好位于某次操作后的最后一个点(乘法和加法都有可能)

代码构建以此展开

1.要不断地回溯操作,直到找到事实2
2.记录每次操作后数组的长度和最后一个值

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll last[1000005]={0};
ll len[100005]={0};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll t;
    cin>>t;
    while(t--)
    {
        ll n,q;
        cin>>n>>q;
        for(ll i=1;i<=n;i++)
        {
            ll op,x;
            cin>>op>>x;
            if(op==1)
            {
                last[i]=x;
                len[i]=min(len[i-1]+1,(ll)2e18);
            }
            else
            {
                last[i]=last[i-1];
                if((ll)2e18/(x+1)<len[i-1]) len[i]=2e18;//防止溢出
                else len[i]=len[i-1]*(x+1);
            }
        }

        while(q--)
        {
            ll k;
            cin>>k;
            ll times=lower_bound(len+1,len+n+1,k)-len;//如果k点是在某次加法后诞生的,那么一步到位
            while(k!=len[times])
            {
                k=(k-1)%len[times-1]+1;//说明它在乘法之间,回溯等价于在上一步乘法的模数位置
                times=lower_bound(len+1,len+n+1,k)-len;//有点像dp?递归?
            }
            cout<<last[times]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

标签:last,ll,cin,len,times,Array,Repetition,乘法
From: https://www.cnblogs.com/pure4knowledge/p/17970888

相关文章

  • 数组Array
    slice用于截取数组的一部分,不修改原数组。letmyArray=[1,2,3,4,5];//使用slice创建一个新的数组,包含索引1到索引3的元素(不包括索引3)letnewArray=myArray.slice(1,3);console.log(newArray);//输出新的数组,这里是[2,3]console.log(myArray);//输出原始数......
  • Codeforces Round 920 (Div. 3) D Very Different Array
    DVeryDifferentArray题意给出两个长度分别为\(n,m\)的数组\(a,c\),\(n<m\),从\(c\)中选择\(n\)个数并找到一个序列使得\(D=\sum_{i=1}^{n}|a_i-c_i|\)尽可能大,求D的值思路假设如果\(m\)和\(n\)一样大,那么找到这个序列的方法很简单:将两个序列分别排序后将其中一个转置,......
  • 算法练习 1.寻找中心下标(Find the Middle Index in Array)
    算法练习1.寻找中心下表(FindtheMiddleIndexinArray)题目来源来源:力扣(LeetCode)https://leetcode-cn.com/problems/find-the-middle-index-in-array/题目描述给你一个整数数组nums,请计算数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有......
  • C. Partitioning the Array
    原题链接直接看代码#include<bits/stdc++.h>usingnamespacestd;inta[200005]={0};intn;intcheck(intk){intm=0;//任何数与零的gcd都是其本身for(inti=1;i<=n-k;i++){m=__gcd(m,abs(a[i]-a[i+k]));//从题干推出来的性质?对于所有abs(a[i]-a......
  • 性能篇:深入源码解析和性能测试arraylist和LinkedList差异!
    嗨,大家好,我是小米!今天我们要谈论的是Java中两个常用的集合类:ArrayList和LinkedList。大家都知道,这两者在新增和删除元素的操作上有一些差异,那么它们究竟在性能上有何表现呢?我们通过深入源码解析和性能测试来一探究竟!ArrayList新增元素到末尾这是最常见的新增元素操作,我们使用......
  • 433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明)
    这道题可以看成一个24叉树。因为基因序列长度固定为8,且每个位置的字母固定是AGCT,可以选择改变的只有3个字母,所以一次最多24种情况。然后检查变化后的结果是否存在bank中(使用hashSet来存储),同时设置一个visited集合来检查是否访问过。classSolution{publicintminMutation(St......
  • PHP的array_column()函数用法详解
    在PHP中,经常需要对数组进行处理和操作。有时候,需要从一个多维数组中获取特定的一列数据,这时候就可以使用array_column()函数来实现。本文将详细介绍array_column()函数的用法。一、什么是array_column()函数array_column()是一个PHP函数,用于从一个多维数组中获取指定的一列数据。该......
  • 【JDK源码】ArrayList的代码实现
    JDK版本:1.8.0_271基础介绍ArrayList底层数据结构就是一个数组:index表示数组下标,从0开始计数,elementDatda表示数组本身DEFAULT_CAPACITY表示数组的初始化大小,默认是10size表示数组的大小,int类型,没有使用volatile修饰,非线程安全modCount统计当前数组被修改的版本次数,数......
  • CF121E Lucky Array
    题意给定一个序列,维护下列操作。区间加区间查询数中只包含\(4,7\)数的个数。所有数前后不超过\(1e4\)。Sol块块版。\(1e4\),发现满足条件的数的个数只有\(30\)个。对于每个块开一个桶,记录每种数有多少个。查询时暴力枚举\(30\)个数,暴力判断即可。修改是平凡的......
  • 【并发编程】CopyOnWriteArrayList详解与原理
    ......