首页 > 其他分享 >CF2004 EDU169 F. Make a Palindrome

CF2004 EDU169 F. Make a Palindrome

时间:2024-08-19 12:06:00浏览次数:3  
标签:Palindrome val int Make EDU169 端点 mod ll define

首先考虑对于一个序列直接怎么 \(O(n)\) 求 \(f\) 值,就发现考虑维护两个指针 \(l,r\),如果 \(a_l=a_r\),则 \(l+1,r-1\),否则我们就让小的那一个分裂,那么每次操作一定可以减少长度,所以最优。
然后就可以 \(O(n^3)\),考虑换一种可优化的方式计算 \(f\),通过猜想大概就是看一下前缀后缀集合有多少个不相等的数字。
发现能够过拍。

考虑优化,我们考虑枚举区间,区间的和为 \(val\),且这个区间作为某个前缀,其左端点为 \(l\),右端点为 \(r\)。
问题就是找有多少个 \(j(j\ge l)\) 满足:
\(\forall i(l\le i)~ s_{i,j} \ne val\)
于是我们考虑枚举了 \(l,r\) 之后看看有多少个 \(j\) 不满足条件即可。

然后发现某一个 \(j\) 所对应的 \(i\) 也一定只有至多一个满足 \(s_{i,j}=val\)。
问题就是问有多少个区间 \([i,j]\) 满足和 \(s_{i,j}=s_{l,r},(l\le i,r\le j)\)。
于是我们用 map 维护一个 int, vector<pair<int, int>> 表示值为 \(val\) 对应的区间。
然后按照左端点排序,对于每个区间看看它后面有多少个右端点大于它的右端点即可。
用树状数组维护。
时间复杂度:\(O(n^2\log n)\)。

Code:

#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for (int i = (l); i <= (r); i++)
#define per(i,r,l) for (int i = (r); i >= (l); i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define maxn(a, b) a = max(a, b)
#define minn(a, b) a = min(a, b)
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
const ll mod = 998244353;
mt19937 gen(114514);
ll rp(ll a,ll b) {ll res=1%mod;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
template<class T>
struct BIT {
    vector<T> bit;
    int size;
    void init(int n) {
        bit.clear(); bit.resize(n + 1, 0);
        size = n;
    }
    void update(int x, T v) {
        assert(x);
        while (x <= size) {
            bit[x] += v;
            x += (x & -x);
        }
    }

    T query(int x) {
        assert(x <= size);
        T res = 0;
        while (x) {
            res += bit[x];
            x -= (x & -x);
        }
        return res;
    }

    int find(T k) {
        assert(k); k--;
        int x = 0;
        for (int i = log2(size); i >= 0; i--) {
            int y = x + (1 << i);
            if (y <= size && bit[y] <= k) {
                x = y;
                k -= bit[y];
            }
        }
        return x + 1;
    }
};
BIT<int> t;
const int N = 2043;
int n;
int a[N];
map<int, vector<PII>> p;

void solve() {
    // init();
    scanf("%d", &n);
    rep(i,1,n) scanf("%d", &a[i]);
    ll ans = 0;

    p.clear();
    per(i,n,1) {
    	int sum = 0;
    	rep(j,i,n) {
    		sum += a[j];
    		p[sum].eb(i, j);
    	}
    }
    for (auto [val, ve] : p) {
        t.init(n);
        // cout << "val: " << val << endl;
    	for (auto [l, r] : ve) {
            ans += n - r - t.query(n - r + 1);
            // cout << l << ' ' << r << endl;
            t.update(n - r + 1, 1);
    	}
        // cout << ans << endl;
    }
    printf("%lld\n", ans);
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--)
        solve();
    return 0;
}

标签:Palindrome,val,int,Make,EDU169,端点,mod,ll,define
From: https://www.cnblogs.com/weirdoX/p/18367049

相关文章

  • Linux C++ 开发4 - 入门makefile一篇文章就够了
    1.make和Makefile1.1.什么是make?1.2.什么是Makefile?1.3.make与Makefile的关系2.Makefile的语法2.1.基本语法2.2.变量2.3.伪目标2.4.模式规则2.5.自动变量2.6.条件判断3.示例演示3.1.编译HelloWorld程序3.2.编译多文件项目3.2.1.项目......
  • cmake 常用命令记录
    cmake常用命令记录命令cmake_minimum_requiredprojectadd_executablesetconfigure_filetarget_**optionmessageadd_libraryadd_subdirectoryadd_definitionsinstallcpackmacrostringfileDEFINEDlistfind_packagectest构建类型扩展gtest命令cmake_minimum_required......
  • 20240110 windows安装make工具
    从https://sourceforge.net/projects/mingw/下载文件并安装安装后打开MinGW,依次选择如下3个红框的包,右键“Markforinstallation”勾选需要安装的包后,执行“installation/ApplyChanges”将c:\MinGW\bin\ming32-make.exe重命名为c:\MinGW\bin\make.exe将MinGW的......
  • make vic_image 失败
    make步骤如下:cdVIC/vic/drivers/imagednfinstallopenmpidnfinstallopenmpi-devel.x86_64moduleloadmpi/openmpi-x86_64dnfinstall-ynetcdf-develdnfinstall-ynetcdfnetcdf-devel报错如下:/usr/bin/ld:/tmp/ccaypzjZ.o:/home/VIC/vic/drivers/image/../../......
  • linux:有关目录、链接文件的函数 Makefil、gdb的使用
    目录函数1.getpwuidstructpasswd*getpwuid(uid_tuid);功能:   根据用户id到/etc/passwd文件下解析获得   结构体信息参数:uid:用户id返回值:   成功返回id对应用户的信息   失败返回NULLpasswd 结构体的定义通常如下所示structpasswd{......
  • Make Them Narrow
    题目大意:给你一个\(n\)和\(k\),再给你一个长度为\(N\)的序列\(A\),从\(A\)中任意选择\(K\)个元素并将其删除,然后按原来的顺序将剩余的元素连接起来,形成一个新的序列\(B\),然后求这个序列的极差。解题思路错误解法一开始我想到了贪心:把\(A\)数组排个序,然后把开头......
  • 【cmake】关于cmake链接库的顺序要求
    注意注意:在CMake中,你可以使用target_link_libraries命令来指定链接顺序。这个命令接受一个目标(target)和一系列库(库可以是库目标、库文件路径或导入的库目标)作为参数。链接顺序通常很重要,特别是当库之间存在依赖关系时。cmake_minimum_required(VERSION3.10)project(My......
  • 【CMake】掌握CMake基本操作
    @目录1.文件树和CMakeLists.txt一览1.1语法基本规则1.2文件目录讲解2.基本指令讲解2.1CMAKE_MINIMUM_REQUIRED(VERSIONXXX)2.2PROJECT(projectname)2.3SET()2.4ADD_SUBDIRECTORY(srcbin)2.5INCLUDE_DIRECTORIES(lib/)2.6ADD_EXECUTABLE(mainmain.cpp)2.7ADD_LIBRARY(......
  • Django 数据库迁移:makemigrations 和 migrate 命令详解及常见问题解决
    目录1.问题所示2.pythonmanage.pymakemigrations3.pythonmanage.pymigrate4.拓展1.问题所示最初始的状态是遇到这个问题由于刚开始跑pythonweb项目,开源项目附带的Readme,个别命令不太懂,对此详细研究其基本知识最终的解决方案如下:清理迁移文件:删除迁移目......
  • 视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库
            ch3中的所有代码,除了在kdevelop中运行,还可以在VScode中运行。下面将简要演示配置过程,代码不再做解答,详细内容在下面的文章中。(这一节中的pangolin由于安装过程中会出现很多问题,且后续内容用不到该平台,所以暂时不进行安装)视觉SLAMch3—三维空间的刚体运动http......