首页 > 其他分享 >CF1286E Fedya the Potter Strikes Back 题解

CF1286E Fedya the Potter Strikes Back 题解

时间:2024-08-28 22:47:55浏览次数:8  
标签:cur int 题解 Fedya Potter str ans border mx

题目链接

点击打开链接

题目解法

牛题!

题目实际上是要每次加入一个字符,求所有的 \(border\) 的神秘度之和
考虑从前 \(i-1\) 个字符到前 \(i\) 个字符 \(border\) 的变化
如果 \(str_1=str_i\),会加入长度为 \(1\) 的 \(border\),这一部分可以暴力加
且只会保留 \(i-1\) 的 \(border\) 中,下一位和 \(str_i\) 相同的
我们考虑暴力删去所有不合法的 \(i-1\) 的 \(border\),这一部分记录 \(to_{x,c}\) 表示 \([1,x]\) 的 \(border\) 中,最长的一个满足后一个字符为 \(c\) 的长度,就可以暴力跳了
因为每个 \(border\) 只会加一次,删一次,所以这部分的复杂度是可以接受的

现在考虑已经维护出了当前所有 \([1,i]\) 的 \(border\) 的除了 \(w_i\) 的神秘度
加入 \(w_i\) 相当于对每个值取 \(\min\) 操作
这部分暴力取出 \(>min\) 的值,删去其贡献即可
每次会把若干个不同的 \(>w_i\) 的数变成一个 \(w_i\),所以复杂度是对的

时间复杂度 \(O(n\log n)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
typedef __int128_t i128;
const int N=600010;
int n,str[N],ne[N],to[N][26];
int st[N][20],lg[N];
i128 ans,res;
map<int,LL> mp;
int qry(int l,int r){
    int k=lg[r-l+1];
    return min(st[r][k],st[l+(1<<k)-1][k]);
}
void ins(int l,int r){
    int val=qry(l,r);
    mp[val]++,res+=val;
}
void del(int l,int r){
    int val=qry(l,r);
    mp[val]--,res-=val;
}
#define fi first
#define se second
void write(i128 x){
    if(!x) return;
    write(x/10),putchar(x%10+48);
}
int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
    cin>>n;
    F(i,2,n) lg[i]=lg[i>>1]+1;
    int mx=0;
    F(i,1,n){
        char add;cin>>add;
        str[i]=(add-'a'+ans)%26;
        int w;cin>>w;
        w^=(ans&((1<<30)-1));
        st[i][0]=w;
        F(j,1,lg[i]) st[i][j]=min(st[i][j-1],st[i-(1<<(j-1))][j-1]);
        if(str[1]==str[i]) ins(i,i);
        while(mx&&str[mx+1]!=str[i]) mx=ne[mx];
        if(i>1&&str[mx+1]==str[i]) mx++;
        ne[i]=mx;
        F(j,0,25) to[i][j]=to[mx][j];
        to[i][str[mx+1]]=mx;
        F(j,0,25) if(j!=str[i]){
            int cur=to[i-1][j];
            while(cur) del(i-cur,i-1),cur=to[cur][j];
        }
        LL tms=0;
        for(auto it=mp.upper_bound(w);it!=mp.end();){
            res-=(i128)(it->fi-w)*it->se,tms+=it->se;
            auto t=next(it);
            mp.erase(it),it=t;
        }
        mp[w]+=tms;
        ans+=res;
        if(!ans) puts("0");
        else write(ans),puts("");
    }
    return 0;
}

标签:cur,int,题解,Fedya,Potter,str,ans,border,mx
From: https://www.cnblogs.com/Farmer-djx/p/18385656

相关文章

  • 华为java岗经典面试题解析
    题目为在一个整形的数组中,在数组中只有一值个是不重复的,其他的值都是有两个重复的值,找出不重复的那个值。{11,11,12,13,13,16,16}解析为当用Java来解决这个问题时,可以使用异或运算来找出只出现一次的元素。以下是一个示例Java程序,演示了如何在一个整型数组中找出只出现一次的元......
  • 洛谷P5322 [BJOI2019] 排兵布阵 题解
    代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintdp[20001],a[101][101],s,n,m;signedmain(){ cin>>s>>n>>m; for(intj=1;j<=s;j++){ for(inti=1;i<=n;i++){ cin>>a[i][j]; } } for(inti=1;......
  • 局域网内两台设备只有一方可以ping通问题解决
    场景局域网内有两台笔记本,都是windows系统,都是连接的同一个路由器,在同一个网段中。但是其中的一台笔记本192.168.1.101,另外一台是192.168.1.100ping命令测试发现192.168.1.101无法ping通192.168.1.100这是为什么呢?排查与修复首先的两台电脑为了安全,防火墙都是开启的。既然......
  • Atcoder [AGC006D] Median Pyramid Hard 题解 [ 紫 ] [ 二分 ] [ adhoc ]
    MedianPyramidHard:二分trick加上性质观察题。trick我们可以二分值域,然后把大于等于它的数标记成\(1\),其他标记为\(0\)(有些题需要标记成\(-1\)),然后根据这个来check方案是否可行,这通常通过判断某个数是否是\(1\)来实现。本质上其实就是check大于等于它的数能否成为......
  • 文件排版 题解
    前言题目链接:HDU。题意简述给\(n\)个单词和一张图片排版。每个单词长度为\(a_i\)。图片占行不确定,但是占列始终为\([dw+1,dw+pw]\)。排版宽度为\(W\),高度无限制。要求单词间有长度为\(1\)的空格,单词不能超出宽度\(W\),不能覆盖在图片上,单词间相对顺序不能发生改变......
  • 题解 [ABC199F] Graph Smoothing(中文/English)
    本题解提供英文版,位于示例代码之后。Englishversionofthiseditorialisprovidedafterthesamplecode.设行向量:\[A^{(k)}=\begin{bmatrix}a_1^{(k)}&a_2^{(k)}&\cdots&a_n^{(k)}\end{bmatrix}\]表示\(k\)次操作后每个节点点权的期望。特别地,\(A^{(0)}\)表......
  • 递推配套P1192 & 题解:P1192 台阶问题
    我们现在考虑递推。现在的问题是,如何从前几个数据推导出下一个数据。我们现在先推导\(f(n)\)。设\(k=3\)。到\(n\)的方法就是到能一步到\(n\)的台阶的方法总和,所以我们可以推导出:\(f(n)=f(n-1)+f(n-2)+\dots+f(n-k)/f(1)\)。即为:\(f(n)=\sum_{i=......
  • LOJ #160. 树形背包 题解
    Description有\(N\)个物品,编号分别为\(1\ldotsN\)。物品\(i\)的重量为\(w_i\),价值为\(v_i\)。给出每个物品依赖于哪个物品。我们用\(d_i=j\(i>j>0)\)表示:如果要选取物品\(i\),就必须先选取物品\(j\)。另外,我们用\(d_i=0(i>0)\)表示:该物品不依赖于任何物品。......
  • CF1810G The Maximum Prefix 题解
    Description构造一个长度最多为\(n\)的数组\(a\),其每个元素均为\(1\)或\(-1\)。生成方式如下:选择任意整数\(k\in[1,n]\)作为\(a\)的长度。对于\(\foralli\in[1,k]\),有\(p_i\)的概率设\(a_i=1\),有\(1-p_i\)的概率设\(a_i=-1\)。在数列被生成后,计算\(s_i=a......
  • NOI2024 D1T3 口胡题解
    NOI2024D1T3口胡题解题目条件其实就是说对于点对\((a,b)\),从\(a\)到\(b\)的路径上至少要有一条从\(b\)指向\(a\)​的边。将初始状态记作\((T,S)\)​,其中\(T\)​是树,\(S\)​是二元组\((a,b)\)​的集合。注意到特殊性质A蕴含了:如果对于所有二元组\((a,b)\),\(a......