首页 > 其他分享 >CF1965D Missing Subarray Sum题解

CF1965D Missing Subarray Sum题解

时间:2024-05-15 09:33:14浏览次数:30  
标签:ch int 题解 Sum long CF1965D FF void define

题目链接

点击打开链接

题目解法

感觉一点都不好想\fn

因为最后的序列 \(a\) 是回文的,所以只有以中心点对称的子段和出现次数为奇数,其他都为偶数
考虑有没有什么知道所有子段和的做法,可以方便推出缺失一个的答案
令 \(g_{l,r}\) 为 \(l\) 到 \(r\) 的子段和

  1. 知道 \(g_{1,n}\)
    删除 \(g_{1,n}\) 之后,\(s\) 的最大值一定是 \(g_{1,n-1}\),这可以推出 \(a_1\) 和 \(a_n\)
    如何得到 \(g_{1,n-2}\)?比 \(g_{1,n-2}\) 大的只可能是 \(g_{1,n-1}\) 和 \(g_{2,n-1}\),把这两个在 \(s\) 中删掉,剩下的 \(s\) 中的最大值就是 \(g_{1,n-2}\)
    以此类推,我们就可以得出答案
  2. 不知道 \(g_{1,n}\)
    把出现奇数次的数拉出来,从小到大排序,不难得出 \(a_2,...,a_{n-1}\)
    \(a_1\) 和 \(a_n\) 只要用 \(g_{1,n-1}\) 减去 \(g_{2,n-1}\) 即可

时间复杂度 \(O(n^2\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);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=2010;
int n,a[N];
map<int,int> mp;
void del(int v){ mp[v]--;if(mp[v]<=0) mp.erase(v);}
int ED(){ return (*mp.rbegin()).first;}
void solve1(){
    int prv=ED();del(prv);
    int sum=prv;
    int i=1,j=n;
    while(i<=j){
        int x=ED();
        a[i]=a[j]=prv-x;prv=x;
        sum-=a[i]+a[j];
        int cur=sum;del(cur);
        DF(k,i,1) cur+=a[k],del(cur),del(cur);
        i++,j--;
    }
}
int b[N];
void solve2(){
    int len=0;
    for(auto [x,y]:mp) if(y&1) b[++len]=x;
    int i=(n+1)/2,j=n/2+1;
    F(k,1,len) a[i]=a[j]=(b[k]-b[k-1])/2,i--,j++;
    if(n&1) a[(n+1)/2]=b[1];
    a[1]=a[n]=ED()-b[len];
}
void work(){
    mp.clear();
    read(n);
    F(i,1,n*(n+1)/2-1){ int x;read(x);mp[x]++;}
    if(mp[ED()]==1) solve1();else solve2();
    F(i,1,n) printf("%d ",a[i]);puts("");
}
int main(){
    int T;read(T);
    while(T--) work();
    return 0;
}

标签:ch,int,题解,Sum,long,CF1965D,FF,void,define
From: https://www.cnblogs.com/Farmer-djx/p/18192733

相关文章

  • 64 - Minimum Path Sum 最小路径和
    64-MinimumPathSum最小路径和问题描述Givenamxngridfilledwithnon-negativenumbers,findapathfromtoplefttobottomright,whichminimizesthesumofallnumbersalongitspath.Note:Youcanonlymoveeitherdownorrightatanypointinti......
  • P9175 [COCI2022-2023#4] Mreža 题解
    P9175[COCI2022-2023#4]Mreža题解前言我发现,有整体二分与主席树的地方总有莫队(不是那个莫队,是那个莫队)。知识点(树上)倍增,(树上)莫队,树状数组(“树”含量满满),分块。题意分析给定一棵树,每条边有一个权值\(v\),以及可以用一个花费\(c\)将它变成更大的权值\(s\)。再给定一......
  • AtCoder Beginner Contest 351 E - Jump Distance Sum
    题目链接Hint1:只能斜着走,容易想到黑白棋盘,\((x+y)\%2==0\)位于一个团,\((x+y)\%2==1\)位于另一个团,分别求和。Hint2:\(dist=max(|x1-x2|,|y1-y2|)\),这是切比雪夫距离,将坐标系倾斜\(45^{\circ}\),改为曼哈顿距离\(dist=|x1-x2|+|y1-y2|\),即\(X=x+y,Y=x-y\),这样就可以将横纵坐标......
  • Little Pony and Lord Tirek 题解
    LittlePonyandLordTirek题解\(\texttt{ProblemLink}\)题目大意给定长度为\(n\)的序列,第\(i\)个数有三个值:\(s_i,m_i,r_i\),每秒对于每个数执行\(s_i\leftarrow\min\{s_i+r_i,m_i\}\)。有\(m\)个查询,每次查询三个值:\(t,l,r\)查询时刻\(t\),\([l,......
  • [H&NCTF] maybe_xor题解
    maybe_xor感觉这道逆向题与其说是考逆向水平,倒不如说是考编写脚本的能力首先题目给了个远程地址,nc连接会回显ELF:接一串base64编码的东东,解码后发现是ELF文件。用IDA打开发现是从数据段读取24个字节到栈上并进行异或,每个字节异或的值都不同,但异或后的结果不会写回栈程序的目......
  • [题解] Flipping Game
    题目描述有n盏灯,每个灯有开和关两种状态。每按一次灯会变成相反的状态。给定灯初始的开关状态和结束的开关状态,若操作k轮,每轮要按m个不同的灯,问有多少种方法使灯由初始状态变到结束状态。题解需注意每轮要按不同的灯,若无这个条件,暴力计算组合数即可。要操作多轮,且每轮按灯的......
  • 题解:SP10232 AMR11E - Distinct Primes
    前话这咋人名都和HP一模一样了,SPOJ出题人里是不是全是哈迷啊。思路非常直观的一个思路:从前往后枚举每一个数,看是否满足条件,输出满足条件的第一个。CODE#include<bits/stdc++.h>usingnamespacestd;boolis(intn){//判断质数if(n<2)return0;for(inti=2;i<......
  • 题解:CF1337A Ichihime and Triangle
    看到大佬们基本都是直接输出\(b\)\(c\)\(c\)了事儿,一身反骨有其它构造方法的我表示不服,遂作此篇。众所周知,两边之和大于第三边,所以,如果\(b+c>d\),那么\(b\)、\(c\)、\(d\)就是正确的。那如果不满足呢?在题目条件下\(b+c>b+c-1\),那么这一组就是合理的。分别验......
  • NOIP真题题解
    2001T4Car的旅行路线ybtluogu建图+最短路1.建图时细节较多已知三点求第四点的坐标勾股定理判断斜边2.最短路时多起点多终点2013D1T3货车运输ybtluogu最大生成树+倍增LCA答案的边一定在最大生成树上将原图建出最大生成树在树上使用倍增LCA提取路径2014D2T2寻......
  • 5.13 模拟赛题解(没写完)
    T1P4304[TJOI2013]攻击装置快进到HZOI2023超越HZOI2020(人均场切了紫)考虑将棋盘黑白染色成这个样子容易发现相同颜色的点直接一定没有冲突,满足二分图的性质,需要求出最小点覆盖,所以直接按冲突建好双向边,从\(1\)到\(n^2\)节点跑最大匹配即可。设求出的最大匹配为\(......