首页 > 其他分享 >【21 ZR联赛集训 day18】游戏

【21 ZR联赛集训 day18】游戏

时间:2024-09-27 14:15:03浏览次数:1  
标签:手模 le 21 int 若干次 栈内 day18 ZR 前缀

【21 ZR联赛集训 day18】游戏

给定长度为 \(n\) 的序列 \(A,B\),每个数形如 \(\frac{2^{p_1}3^{p_2}5^{p_3}7^{p_4}11^{p_5}13^{p_6}}{2^{p_7}3^{p_8}5^{p_9}7^{p_{10}}11^{p_{11}}13^{p_{12}}}\)。

可以进行若干次操作,每次操作选定 \(i(2\le i\le n-1),(a_{i-1},a_i,a_{i+1})\gets (a_{i-1}a_i,\frac{1}{a_i},a_ia_{i+1})\)。

问能否把 \(A\) 变成 \(B\)。\(1\le n \le 2\times 10^5\)。

正解

首先显然我们只需要对每个数记录 \(6\) 个 \(p\) 即可,因为底数一样相除可以直接指数相减。

考虑到每次操作只和乘除有关,我们对 \(A,B\) 做前缀积数组 \(A',B'\)。可以发现每次操作其实是交换 \(a'_{i-1},a'_i\)。

那么问题就变成了做若干次相邻数字的交换,能否把 \(A\) 变成 \(B\),注意 \(a'_n\) 是不会换的。类似于冒泡排序,前 \(n-1\) 个数的所有排列我们都可以取得,因此只需要判断 \(a_n=b_n,\{A\}=\{B\}\) 即可。

对前 \(n-1\) 项排序并比较即可,时间复杂度 \(O(n\log n+nV)(V=6)\)。

手模出奇迹

赛场上我没有往前缀积这里想,自然地,幂的乘除法不好做,因为值域太大了,我们可以想到转化成指数的加减法。(然后其实可以变成交换前缀和)

但是我比较菜,想不到前缀和。首先很容易发现进行若干次操作后每个底数的所有数字的指数之和一定不变,可以判掉部分无解情况。我们又发现,若干次操作后,\(a_i\) 一定是原数组几个数相加减得到。但这还不够,于是我手模了一些小样例,具体来讲,我模拟了 \(n=4\) 的所有情况,由于 \(n=5\) 情况太多,我随机模拟了一些,发现若干次操作后,新序列每个位置一定是连续个 \(a_i\) 相加或相减,想象成一个栈里一会加入几个 \(a_i\),一会减去几个,栈内元素下标一定有序递增 \(1\),且最后栈内有 \(n\) 个元素。

考虑 DP,\(dp_{i,0/1,0/1}\) 表示第 \(i\) 个数 \(=b_i\),选择加一些 \(a_i\) 还是减一些 \(a_i\),答案尽量大还是尽量小,的答案(当前栈内元素数量)。

想要知道栈内有多少个元素,还是要前缀和,对前缀和二分找出 \(a'_x=b'_i\)。相信聪明的你已经发现这个做法和正解本质上是一致的,只是我不聪明,其实手模 dp 后就可以发现它是一个排列,本质上就是前缀和的集合相等。

Code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
using namespace std;
typedef long long ll;
const int N=2e5+7,inf=0x3f3f3f3f;
int n;
int x;
struct node{
    int p[10];
    bool operator == (const node b)const{
        rep(i,1,6) if(p[i]!=b.p[i]) return 0;
        return 1;
    }
    bool operator != (const node b) const{
        rep(i,1,6) if(p[i]!=b.p[i]) return 1;
        return 0;
    }
    bool operator < (const node b) const{
        rep(i,1,6) if(p[i]!=b.p[i]) return p[i]<b.p[i];
        return 0;
    }
    void add(node b){
        rep(i,1,6) p[i]+=b.p[i];
    }
}sa,sb;
struct node2{
    node x[N];
    bool operator ==(const node2 b)const{
        rep(i,1,n){
            if(x[i]!=b.x[i]) return 0;
        }
        return 1;
    }
}a,b,c,aa;
struct node3{
    node x;
    int id;
    bool operator <(const node3 b) const{
        if(x!=b.x) return x<b.x;
        else return id<b.id;
    }
}Al[N];
queue<node2> que;
int dp[N][2][2];
int findmax(int l,int r,node x){
    auto it=upper_bound(Al+1,Al+n+1,(node3){x,r});
    it--;
    node3 y=*it;
    if(x==y.x&&y.id>=l&&y.id<=r) return it-Al;
    else return -1;
}
int findmin(int l,int r,node x){
    auto it=lower_bound(Al+1,Al+n+1,(node3){x,r});
    it--;
    node3 y=*it;
    if(x==y.x&&y.id>=l&&y.id<=r) return it-Al;
    else return inf;
}
//#define DEBUG
int main(){
#ifdef DEBUG
    freopen("in.txt","r",stdin);
    freopen("my.out","w",stdout);
#endif
    sf("%d",&n);
    rep(i,1,n){
        rep(j,1,6){
            sf("%d",&x);
            a.x[i].p[j]+=x;
        }
        rep(j,1,6){
            sf("%d",&x);
            a.x[i].p[j]-=x;
            sa.p[j]+=a.x[i].p[j];
        }
    }
    rep(i,1,n){
        rep(j,1,6){
            sf("%d",&x);
            b.x[i].p[j]+=x;
        }
        rep(j,1,6){
            sf("%d",&x);
            b.x[i].p[j]-=x;
            sb.p[j]+=b.x[i].p[j];
        }
    }
    aa=a;
    c=b;
    rep(i,2,n){
        aa.x[i].add(aa.x[i-1]);
        c.x[i].add(c.x[i-1]);
    }
    rep(i,1,n) Al[i]={aa.x[i],i};
    sort(Al+1,Al+n+1);
    if(sa!=sb) {
        pf("No\n");
        return 0;
    }
    dp[1][0][0]=findmax(1,n,c.x[1]);
    dp[1][0][1]=findmin(1,n,c.x[1]);
    dp[1][1][0]=-1;
    dp[1][1][1]=inf;
    rep(i,2,n){
        dp[i][0][0]=max(findmax(dp[i-1][0][1],n,c.x[i]),findmax(dp[i-1][1][1],n,c.x[i]));
        dp[i][0][1]=min(findmin(dp[i-1][0][1],n,c.x[i]),findmin(dp[i-1][1][1],n,c.x[i]));
        dp[i][1][0]=max(findmax(1,dp[i-1][0][0],c.x[i]),findmax(1,dp[i-1][1][0],c.x[i]));
        dp[i][1][1]=min(findmin(1,dp[i-1][0][0],c.x[i]),findmin(1,dp[i-1][1][0],c.x[i]));
    }
    auto it=lower_bound(Al+1,Al+n+1,(node3){aa.x[n],n});
    int xx=it-Al;
    if(dp[n][0][0]==xx) pf("Yes\n");
    else pf("No\n");
}

标签:手模,le,21,int,若干次,栈内,day18,ZR,前缀
From: https://www.cnblogs.com/liyixin0514/p/18435589

相关文章

  • 【2021提高组十连测day7】a
    【2021提高组十连测day7】a题意:求每个点和其他所有点曼哈顿距离的平方之和。形式化地,求\(\sum_{j=1}^{n}(|x_i-x_j|+|y_i-y_j|)^2(1\lei\len)\)。对于每个点,我们把其他点分成四部分:左上、左下、右上、右下。四个部分可以通过旋转整个坐标系来解决。因此这里讲如何处理左上......
  • 【21 ZR联赛集训 day10】跑得比谁都快
    【21ZR联赛集训day10】跑得比谁都快\(O(nq)\)做法显然,不讲。如果我们把所有红绿灯的位置\(mod(g+r)\),放到数据结构里,就可以\(O(\logn)\)的时间内找到第一个红灯的位置。然后我们预处理每个红绿灯红灯结束的时刻开始,走到终点要用的时间\(f_i\),DP倒序求解。对于每个询......
  • 【20zr提高组十连测day10】心
    【20zr提高组十连测day10】心首先不同的操作序列一定在某个时刻使数组内容不同,因此我们只需要统计合法的操作序列数量。一个合法的最终数组形如若干个\(1,M\),而且\(1,M\)之间可能有若干个\(x\),长度为\(n+1\)。造成这个数组的操作序列必须满足所有操作\(1,M\)按顺序排列,......
  • 【20zr提高组十连测day10】信
    【20zr提高组十连测day10】信给定\(n,m\),\(n,m\le10^5\),给定分别长度为\(n-1,m,n,m-1\)的单调不减的序列\(A,B,C,D\),然后形如该图建边:考虑到序列是递增的,对于除最左上角以外的每个点,每个点一定要选和自己相连的一条边才能形成一棵树。那么选择左边或上边一定是更优的,而且......
  • [SWPUCTF 2021 新生赛]easy_md5
    分析一下代码, name不等于password,namd,md5值和password,md5值相等。get传参name,post传参password。$name!=$password&&md5($name)==md5($password)属于MD5绕过中的php==弱类型绕过有两个办法,第一个办法就是importrequests#网站的URLurl="http://node7.a......
  • 【LeetCode Hot 100】21. 合并两个有序链表
    题目描述最简单粗暴的想法是将两个链表的所有元素拿出来放在一个数组中,再将此数组排序,最后生成一个新链表并返回。由于给出的参数本身就是两个排好序的链表,可以进行一次遍历,就能保证元素仍然是有序的:每次比较当前指针指向的两个元素的大小,较小的拿出来作为当前元素并将指针向前移......
  • 易优CMS出现:Allowed memory size of 134217728 bytes exhausted (tried to allocate 2
    当你遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误时,这意味着PHP的内存限制已经耗尽。这种错误通常发生在处理大量数据或执行复杂计算时。为了解决这个问题,可以采取以下几种方法:方法1:修改 php.ini 文件(推荐)找到 php......
  • 易优CMS登录后台报Allowed memory size of 134217728 bytes ex hausted (tried to alo
    当你在登录后台时遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误提示时,通常是由于PHP的内存限制不足导致的。以下是一些具体的解决步骤:步骤1:检查PHP配置登录宝塔面板登录宝塔面板。在左侧菜单栏选择“软件商店”。......
  • 题解 QOJ837 / ZROI1287【Giant Penguin】
    PetrozavodskWinter2020.Day3.300iqContest3.ProblemG.GiantPenguinGiantPenguin-Problem-QOJ.ac题目描述有一个\(n\)个点\(m\)条边的连通无向无权图,满足每个节点在至多\(k\)个简单环上(没有重复顶点的环是简单环)。\(q\)次操作支持:1.标记一个点;2.询问......
  • CEG2136: Computer Architecture I
    CEG2136:ComputerArchitectureILAB4           BASICCOMPUTERORGANIZATION1. ObjectivesIn this laboratory, students will analyse the structure of a basic computer, will devise, design, implement,simulateinQuartusa......