A .DZY Loves Sequences

pro:给定长度为N的序列,你最多可以改变一个数的值,问最长严格上升子序列长度。 N<1e5.

sol:分几种情况,一种的不改变; 一种是改变,然后接上一个; 一个是改变中间一个,接上两段,而且满足a[mid-1]<a[mid]<a[mid+1]

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int maxn=;
int a[maxn],L[maxn],R[maxn];
int main()
{
int N,ans=; scanf("%d",&N);
rep(i,,N) scanf("%d",&a[i]);
rep(i,,N) {
L[i]=;
if(i>&&a[i]>a[i-]) L[i]=L[i-]+;
}
for(int i=N;i>=;i--){
R[i]=;
if(i<N&&a[i]<a[i+]) R[i]=R[i+]+;
}
rep(i,,N) ans=max(ans,L[i]);
rep(i,,N) ans=max(ans,R[i]);
rep(i,,N-) {
if(a[i]<a[i+]-) ans=max(ans,L[i]+R[i+]+);
}
rep(i,,N-) ans=max(ans,L[i]+);
rep(i,,N) ans=max(ans,R[i]+);
printf("%d\n",ans);
return ;
}

B .DZY Loves Modification

pro:给定N*M有数字的矩阵 ,现在你可以进行K次操作,每次操作,你会选择一行或者一列,把其对应的数字和加到sum里,然后对应的每个数字减少P,问K次操作后最大的sum是多少。 N,M<1e3, K<1e6, p<1e2;

sol:关键在于想到,如果取的行数和列数次数确定了,那么他们相互影响的值是固定的。 然后就可以行列分开考虑了,我们考虑行,我们要取前K大,那么就是单调队列贪心取最大即可搞定。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn=;
ll N,M,K,P,a[maxn][maxn],X[maxn],Y[maxn],t;
priority_queue<ll>A,B;
ll sumA[maxn*maxn],sumB[maxn*maxn],ans;
int main()
{
scanf("%lld%lld%lld%lld",&N,&M,&K,&P);
rep(i,,N) rep(j,,M) scanf("%lld",&a[i][j]);
rep(i,,N) rep(j,,M) X[i]=X[i]+a[i][j];
rep(i,,N) rep(j,,M) Y[j]=Y[j]+a[i][j];
rep(i,,N) A.push(X[i]);
rep(i,,M) B.push(Y[i]);
rep(i,,K){
t=A.top(); A.pop(); sumA[i]=t; A.push(t-M*P);
t=B.top(); B.pop(); sumB[i]=t; B.push(t-N*P);
}
rep(i,,K) sumA[i]+=sumA[i-],sumB[i]+=sumB[i-];
ans=sumB[K];
rep(i,,K){
ans=max(ans,sumA[i]+sumB[K-i]-1LL*i*(K-i)*P);
}
printf("%lld\n",ans);
return ;
}

C .DZY Loves Fibonacci Numbers

pro:给定一个大小为N的数组,现在进行Q次操作,1操作为区间加值,假如是区间[L,R],那么a[i]+=F[i-L+1],F是fib数列; 2操作为区间求和; N,Q<3e5;

sol:此题好像有几种方法,官方题解是用逆元blabla,感觉有点取巧。 然后线段树有两种解法。 一种是利用fib数列的性质,fib加fib还是有fib的性质,可以参考:

https://blog.csdn.net/johann_oier/article/details/49070067 。 但是这种方法的tag传递还是容易出错。

另外一种方法是利用fib数列的另外一个性质:Fn+m=Fn+1*Fm+Fn*Fm-1; 所以我们可以可以把相同的部分提出来,不相同的用前缀和操作。

即假如对区间[L,R]操作,对x增加F[x-L+1]=F[x+1]*F[-L]+F[x]*F[-1-L];而F[x+1]和F[x]我们可以预处理出来(代码里是A和B,而F[-L]我们不难倒推出来)

这种方法比较巧妙,这样救和普通lazy操作无异,所以常数很小。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int Mod=1e9+;
const int maxn=;
int sum[maxn],lazy1[maxn],lazy2[maxn],N;
int A[maxn],B[maxn],F[maxn],pre[maxn],fcy[maxn];
void MOD(int &x){ if(x>=Mod) x-=Mod;}
void pushup(int Now)
{
sum[Now]=(sum[Now<<]+sum[Now<<|])%Mod;
}
void build(int Now,int L,int R)
{
MOD(A[Now]=(pre[R+]-pre[L]+Mod));
MOD(B[Now]=(pre[R]-pre[L-]+Mod));
if(L==R){ scanf("%d",&sum[Now]); return;}
int Mid=(L+R)>>;
build(Now<<,L,Mid); build(Now<<|,Mid+,R);
pushup(Now);
}
void pushdown(int Now,int L,int R)
{
int Mid=(L+R)>>;
if(lazy1[Now]){
MOD(sum[Now<<]+=1LL*lazy1[Now]*A[Now<<]%Mod);
MOD(lazy1[Now<<]+=lazy1[Now]);
MOD(sum[Now<<|]+=1LL*lazy1[Now]*A[Now<<|]%Mod);
MOD(lazy1[Now<<|]+=lazy1[Now]);
lazy1[Now]=;
}
if(lazy2[Now]){
MOD(sum[Now<<]+=1LL*lazy2[Now]*B[Now<<]%Mod);
MOD(lazy2[Now<<]+=lazy2[Now]);
MOD(sum[Now<<|]+=1LL*lazy2[Now]*B[Now<<|]%Mod);
MOD(lazy2[Now<<|]+=lazy2[Now]);
lazy2[Now]=;
}
}
void update(int Now,int L,int R,int l,int r)
{
if(l<=L&&r>=R){
MOD(sum[Now]+=1LL*fcy[-l+N]*A[Now]%Mod);
MOD(sum[Now]+=1LL*fcy[-l+N]*B[Now]%Mod);
MOD(lazy1[Now]+=fcy[-l+N]);
MOD(lazy2[Now]+=fcy[-l+N]);
return;
}
pushdown(Now,L,R); int Mid=(L+R)>>;
if(l<=Mid) update(Now<<,L,Mid,l,r);
if(r>Mid) update(Now<<|,Mid+,R,l,r);
pushup(Now);
}
int query(int Now,int L,int R,int l,int r)
{
if(l<=L&&r>=R) return sum[Now];
int res=,Mid=(L+R)>>; pushdown(Now,L,R);
if(l<=Mid) (res+=query(Now<<,L,Mid,l,r))%=Mod;
if(r>Mid) (res+=query(Now<<|,Mid+,R,l,r))%=Mod;
pushup(Now); return res;
}
int main()
{
int M,opt,L,R;
scanf("%d%d",&N,&M);
F[]=; F[]=;
rep(i,,N+) MOD(F[i]=F[i-]+F[i-]);
rep(i,,N+) MOD(pre[i]=pre[i-]+F[i]);
fcy[N+]=; fcy[N]=; //对应负数的fib
for(int i=N-;i>=;i--) MOD(fcy[i]=fcy[i+]-fcy[i+]+Mod);
build(,,N);
rep(i,,M){
scanf("%d%d%d",&opt,&L,&R);
if(opt==) update(,,N,L,R);
else printf("%d\n",query(,,N,L,R));
}
return ;
}

D .DZY Loves Games

pro:给定N给点,有M条边的连通图,其中一些是黑点,一些是白点。 一开始在1号点,保证1号是白点,N号是黑点。 一开始有K滴血,每次走到一个黑点掉一滴血,每次在一个点会随机走到相邻的点,现在问第让他还有2滴血进入到N号点的概率。

sol:用高斯消元求出黑点之间走到的而不讲过其他黑点的概率,然后矩阵快速幂得到K-2次到N号点的概率。

(不会高斯消元,待补

。。。

CF446 (Div. 1)简单题解的更多相关文章

  1. CF449 (Div. 1简单题解)

    A .Jzzhu and Chocolate pro:现在给定一个大小为N*M的巧克力,让你横着或者竖着切K刀,都是切的整数大小,而且不能切在相同的地方,求最大化其中最小的块. (N,M,K<1 ...

  2. CF444(Div. 1简单题解)

    A .DZY Loves Physics 题意:给定带点权和边权的无向图,现在让你选一些点,使得 点权和/被选点对间的边权和 最大. 思路:不难证明,选择边和对应的两点是最优的. #include&l ...

  3. # Codeforces Round #529(Div.3)个人题解

    Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...

  4. Codeforces Round #557 (Div. 1) 简要题解

    Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...

  5. Codeforces Round #538 (Div. 2) (A-E题解)

    Codeforces Round #538 (Div. 2) 题目链接:https://codeforces.com/contest/1114 A. Got Any Grapes? 题意: 有三个人, ...

  6. Codeforces Round #531 (Div. 3) ABCDEF题解

    Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...

  7. Codeforces Round #499 (Div. 1)部分题解(B,C,D)

    Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

随机推荐

  1. auxre7使用安装

    auxre7安装     1● auxre7下载 2● 安装 D:\soft   axureuser 8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6IyP ...

  2. 顺序容器----顺序容器操作,vector对象如何增长,额外的string操作,容器适配器

    一.顺序容器操作 1.向顺序容器添加元素 向顺序容器(array除外)添加元素的操作: 操作 说明 c.push_back(t) 在c的尾部创建一个值为t的元素.返回void c.emplace_ba ...

  3. python 自然语言处理(二)____获得文本语料和词汇资源

    一, 获取文本语料库 一个文本语料库是一大段文本.它通常包含多个单独的文本,但为了处理方便,我们把他们头尾连接起来当做一个文本对待. 1. 古腾堡语料库 nltk包含古腾堡项目(Project Gut ...

  4. centos7.0 64位系统 安装PHP5.3 支持 nginx

    1  安装PHP所需要的扩展 yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel curl cur ...

  5. Java反射《四》获取方法

    package com.study.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.refl ...

  6. 每天CSS学习之text-indent

    text-indent是CSS的一个属性,其作用是定义首行文本的缩进.其值如下: 1.length:首行缩进固定的长度.默认值为0. 设置 首行缩进2em的长度. div{ width:300px; ...

  7. opencv3.0+vs2013安装记录

    为了能够更好的学习图像,我觉得opencv是一个必不可少的库,因此在以后的研究上使用opencv作为研究工具,与大家共同进步. 话归正题:先搭建opencv的环境. 1.下载安装包3.0 a,官网打开 ...

  8. 4.5 C++重载、覆盖和遮蔽

    参考:http://www.weixueyuan.net/view/6375.html 总结: 函数签名包括函数名和函数参数的个数.顺序以及参数数据类型. 需要注意的是函数签名并不包含函数返回值部分, ...

  9. Spring-data-JPA详细介绍

    Spring-data-JPA学习: 1. https://blog.csdn.net/liujianwd/article/details/75411009 2.http://www.cnblogs. ...

  10. 100Mbps和100MB/s

    作为毕业2年计算机专业的学生,现在才知道100Mbps和100MB/s的概念,实在是渣. Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写传输速率是指设备的的数 ...