Problem A  sum

给出$n$个元素的序列$\{a_i\}$,求出两个不相交连续子序列的最大元素和。

即对于$1 \leq A \leq B \leq C \leq D \leq n$最大化 $\sum\limits_{i=A}^B a_i + \sum\limits_{i=C}^D a_i   $

对于$100\%$的数据满足 $1 \leq n \leq 10^5$ , $0 \leq |a_i| \leq 10^9$

Sol: 考虑一个$O(n^2)$暴力,枚举分割点,左右各求一遍最大连续字段和,然后相加求max。

  显然,上述做法内层$O(n)$的枚举没有必要,我们可以均摊$O(1)$求出前缀、后缀最大连续字段和。

  于是上述暴力算法可以优化到$O(n)$

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e5+;
int a[N],n,f[N],b[N];
signed main()
{
scanf("%lld",&n);
for (int i=;i<=n;i++) scanf("%lld",&a[i]);
int Max=-0x3f3f3f3f,ret=;
for (int i=;i<=n;i++) {
if (ret<) ret=;
ret+=a[i]; Max=max(Max,ret);
f[i]=Max;
}
Max=-0x3f3f3f3f,ret=;
for (int i=n;i>=;i--) {
if (ret<) ret=;
ret+=a[i]; Max=max(Max,ret);
b[i]=Max;
}
int ans=-0x3f3f3f3f;
for (int i=;i<=n-;i++)
ans=max(f[i]+b[i+],ans);
printf("%lld\n",ans);
return ;
}

A.cpp

Problem B  sequence

维护一个初始全为0的$n$个元素的数列$a_i$,有$m$次操作,每一次可以对区间$l,r$加一个等差数列。

格式为 :"l r s e"表示在$i \ in [l,r] , l < r $对其加一个等差数列,保证等差数列每一项都是整数。

最后询问最终的元素异或和。

对于$100\%$的数据,$1 \leq n,m \leq 5 \times 10^5$,序列中的元素任意时刻都不超过$long \ long$范围

Sol: 对数列的差分数组进行维护,区间$[l,r]$加等差数列就相当于对起始点加一个$s$,对终止点后一位减去$e$

对区间$[l+1,r]$加一个公差$d$。显然可以再对差分数组维护一个差分然后用树状数组完成。

最后求2遍前缀和即可。

  复杂度是$O(n \ log_2 \ n)$

# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=5e5+;
int c[N],n,m,w[N];
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
# define lowbit(x) ((x)&(-x))
void update(int x,int y){for (;x<=n;x+=lowbit(x)) c[x]+=y;}
int query(int x){int ret=;for (;x;x-=lowbit(x)) ret+=c[x]; return ret;}
void modify(int l,int r,int d){update(l,d); update(r+,-d);}
signed main()
{
n=read();m=read();
for (int i=;i<=m;i++) {
int l=read(),r=read(),s=read(),e=read();
int d=(e-s)/(r-l);
modify(l,l,s);
modify(l+,r,d);
modify(r+,r+,-e);
}
for (int i=;i<=n;i++) w[i]=query(i);
for (int i=;i<=n;i++) w[i]+=w[i-];
int ans=;
for (int i=;i<=n;i++) ans^=w[i];
printf("%lld\n",ans);
return ;
}

B.cpp

Problem C  mod

给定正整数$n$,定义一个长度为$n$ 的排列$A$ 的价值$w_A$:

若不存在长度为$n$ 且字典序比$A$大的排列,则$w=0$;

否则令$B$为长度为$n$的字典序恰好比$A$大1的排列,$w$ 为$A$ 和$B$不相同的位数的个数。

给定$n$和$p$,求所有长度为$n$的排列的$w$的和对$p$取模的结果。

对于$100\%$的数据满足$n \leq 10^7$

Sol : 考虑枚举$1$个元素,可能的取值是$[1,n]$,

而$[2,n]$的问题就变成了一个子问题。 注意到此时还没有计算进的情况,还需要加上$n(n-1)$

  然后若$n$为偶数,那么需要减去一个$d = 2$的等差数列,于是我们的dp方程就会是:

  $f_ i = i \times f_{i-1} +  i \times (i-1) - (i\%2==0)?(i-2):0 $

  复杂度是$O(n)$

# include <bits/stdc++.h>
# define int long long
using namespace std;
int f[],n,p;
signed main()
{
int T; scanf("%lld",&T);
while (T--) {
scanf("%lld%lld",&n,&p);
f[]=f[]=; int t=;
for (int i=;i<=n;i++) {
t^=;
f[t]=(i&)?(f[t^]*i+i*(i-))%p:(f[t^]*i+i*(i-)-i+)%p;
}
printf("%lld\n",(f[t]+p)%p);
}
return ;
}

C.cpp

Problem D   merge

维护$n$个元素$[a_1,a_n]$,初始所有元素都属于不同的集合。

维护两个操作:

1 x y 将$a_x$元素所在集合$S_x$ 与$a_y$元素所在元素$S_y$ 合并

2 x y 将$a_x$元素所在集合$S_x$中所有元素$+y$

对于$100\%$的数据$n\leq 5\times 10^5$

Sol: 对于第一个操作,直接找出$S_x$的代表元素(也就是该子树的树根),然后在根节点累加标记。

  对于第二个操作,直接新增一个节点,把$S_x$的代表元素和$S_y$的代表元素并到这个节点上即可。

  然后最后形成的是一棵森林,然后对于森林里的每一棵树从根节点开始做一遍dfs求出前缀和即是答案。

  注意到这样子每一次暴力向上跳找代表元素这个过程可以用并查集压缩向上跳的路径,原来的树形结构是不能变化的。

  这样子复杂度就是$O(n+m)$了。

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e6+;
struct rec{ int pre,to;}a[N<<];
int f[N],ans[N],d[N],tot,n,m,head[N],du[N],g[N];
bool vis[N];
int father(int x)
{
if (f[x]==x) return x;
//return father(f[x]);
return f[x]=father(f[x]);
}
void adde(int u,int v)
{
a[++tot].pre=head[u];
a[tot].to=v;
head[u]=tot;
}
void dfs(int u)
{
vis[u]=;
for (int i=head[u];i;i=a[i].pre) {
int v=a[i].to; if (vis[v]) continue;
ans[v]=ans[u]+d[v];
dfs(v);
}
}
signed main()
{
scanf("%lld%lld",&n,&m);
for (int i=;i<=n+m;i++) f[i]=g[i]=i;
int cnt=n;
while (m--) {
int op,x,y; scanf("%lld%lld%lld",&op,&x,&y);
if (op==) {
int fx=father(x),fy=father(y);
++cnt; g[fx]=f[fx]=cnt; g[fy]=f[fy]=cnt;
} else {
int fx=father(x);
d[fx]+=y;
}
}
for (int i=;i<=cnt;i++)
if (i!=g[i]) adde(i,g[i]),adde(g[i],i),du[i]++;
for (int i=;i<=cnt;i++)
if (du[i]==&&!vis[i]) ans[i]=d[i],dfs(i);
for (int i=;i<=n;i++) printf("%lld ",ans[i]);
puts("");
return ;
}

D.cpp

HGOI20190808 省常中互测1的更多相关文章

  1. HGOI 20190816 省常中互测8

    Problem A  有两条以(0,0)为端点,分别经过(a,b),(c,d)的射线,你要求出夹在两条射线中间,且距离(0,0)最近的点(x,y) 对于$100\%$的数据满足$1 \leq T \l ...

  2. HGOI20190814 省常中互测7

    Problem A 中间值 对于$2$个非严格单增序列$\{A_n\} , \{B_n\}$,维护下列两个操作: 1 x y z: (x=0)时将$A_y = z$ , (x=1)时将$B_y = z ...

  3. HGOI20190813 省常中互测6

    Problem A 蛋糕 将$n \times m $大小的蛋糕切成每块为$1 \times 1$大小的$n\times m$块. 交换任意两块蛋糕的切割顺序的方案算作一种. 对于$100 \%$的数 ...

  4. HGOI20190811 省常中互测4

    Problem A magic 给出一个字符串$S$,和数字$n$,要求构造长度为$n$只含有小写字母的字符串$T$, 使得在$T$中存在删除且仅删除一个子串使得$S=T$成立. 输出$T$的构造方案 ...

  5. HGOI20190810 省常中互测3

    Problem A  夏洛特 若当前处在点$(x,y)$下一时刻可以向该点四周任意方向走动一步, 初始在$(0,0)$是否存在一条合法的路线满足下列$n$个限制: 每一个限制形如$t_i , x_i ...

  6. HGOI20190809 省常中互测2

    Problem A 时之终结 构造一个含有$n$个节点的无重边无自环的有向图, 使得从$1$出发,每一次经过一条$(u,v) (u < v)$的边到达节点$n$的方案恰好有$y$种. 对于$10 ...

  7. HGOI20190812 省常中互测5

    Task 1 辩论 有N 个参加辩论的候选人,每个人对这两个议题都有明确的态度,支持或反对.作为组织者,小D 认真研究了每个候选人,并给每个人评估了一个非负的活跃度,他想让活跃度之和尽可能大.选出的候 ...

  8. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  9. 【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)

    Description 给定一颗 \(n\) 个点的树,带边权. 你可以选出一个包含 \(1\) 顶点的连通块,连通块的权值为连接块内这些点的边权和. 求一种选法,使得这个选法的权值是所有选法中第 \ ...

随机推荐

  1. (public丶private丶protected) 的理解

    public(公有):公有的类成员可以在任何地方被访问. protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问. private(私有):私有的类成员则只能被其定义所在的类访 ...

  2. USB fuzzing

    简介 最近看一些USB fuzzing方面的东西,总结一下.主要是软件方面的工作. vUSBf 文章在这里:https://www.blackhat.com/docs/eu-14/materials/ ...

  3. 如何用纯 CSS 创作一个晃动的公告板

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/wjZoGV 可交互视频教 ...

  4. C++ 对象构造顺序、构析函数、临时对象。

    对象的构造顺序: 1.对于局部对象,构造顺序是根据程序执行流进行构造,从上到下. #include <stdio.h> class Test { int mi; public: Test( ...

  5. WPF文本输入框关闭Win10输入法设置

    今天一个同事突然站起来给了我一个眼神,我就知道没啥好事.果然给我指出了一些bug,其中一个是这样的,密码输入框只能输入一个字符,再输入就输入不了. 这种降档次的错误咱也能出,果断夺过键盘,疯狂输入一番 ...

  6. MySQL性能优化(五):分表

    原文:MySQL性能优化(五):分表 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...

  7. sql server truncate语句

    truncate语句 --truncate table '表名' --这样就利用SQL语句清空了该数据表,而不保留日志

  8. execjs执行js代码报错:Exception in thread Thread-1

    最近在爬一个js数据加密的网站的时候,出了点问题,困扰了我两天 直接运行js文件的时候正常,但是用execjs运行js代码的时候总是会报错 最后翻了很多博客之后,终于找到了原因:原因是有一个程序在使用 ...

  9. CF407D Largest Submatrix 3

    cf luogu 被自己菜到自闭了/kk 既然是子矩阵,那么惯用套路为枚举矩阵上下边界,然后\(O(n)\)扫描求解.这题里要从左往右枚举右端点,然后看左端点最多能放到哪,那就对于每个数求出在上下边界 ...

  10. 18 Python之初识面向对象

    1. 类与对象 class Car: #类名首字母大写,严格遵守驼峰命名规范 pass #造车 c = Car() #类名() #创建对象 ##出场之后进行改装 c.color = "红色& ...