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)简单题解的更多相关文章
-
CF449 (Div. 1简单题解)
A .Jzzhu and Chocolate pro:现在给定一个大小为N*M的巧克力,让你横着或者竖着切K刀,都是切的整数大小,而且不能切在相同的地方,求最大化其中最小的块. (N,M,K<1 ...
-
CF444(Div. 1简单题解)
A .DZY Loves Physics 题意:给定带点权和边权的无向图,现在让你选一些点,使得 点权和/被选点对间的边权和 最大. 思路:不难证明,选择边和对应的两点是最优的. #include&l ...
-
# Codeforces Round #529(Div.3)个人题解
Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...
-
Codeforces Round #557 (Div. 1) 简要题解
Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...
-
Codeforces Round #538 (Div. 2) (A-E题解)
Codeforces Round #538 (Div. 2) 题目链接:https://codeforces.com/contest/1114 A. Got Any Grapes? 题意: 有三个人, ...
-
Codeforces Round #531 (Div. 3) ABCDEF题解
Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...
-
Codeforces Round #499 (Div. 1)部分题解(B,C,D)
Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...
-
Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
-
Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】
Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...
随机推荐
-
利用Python进行数据分析(14) pandas基础: 数据转换
数据转换指的是对数据的过滤.清理以及其他的转换操作. 移除重复数据 DataFrame里经常会出现重复行,DataFrame提供一个duplicated()方法检测各行是否重复,另一个drop_dup ...
-
XHR2 和[FromBody]使用说明
[FromBody]必须是application/json 否则会报415 不支持的类型 //Forms function FormsPost(data) { //Default Type x-www ...
-
jQuery中的join方法
和JS 中的JOIN 方法一样,将一数组按照JOIN的参数连接起来.比如: var arr = [ "a", "b", "c", " ...
-
《C#并行编程高级教程》第3章 命令式任务并行 笔记
Task的使用 var t1 = new Task(() => GenerateAESKeys());var t2 = new Task(() => GenerateMD5Hashes() ...
-
js中push()方法
直接上代码: var roleIdsTemp = []; $("#addRole .modalcheckbox-all").each(function(key, value) { ...
-
.24-浅析webpack源码之事件流compilation(2)
下一个compilation来源于以下代码: compiler.apply(new EntryOptionPlugin()); compiler.applyPluginsBailResult(&quo ...
-
kvm虚拟化
1.kvm虚拟化介绍 什么是虚拟化 虚拟化就是通过模拟计算机硬件(cpu,内存,硬盘,网卡)来实现在一台物理服务器上运行同时多个不同的操作系统,并且使每个操作系统之间都是互相隔离的 为什么要学习虚拟化 ...
-
Net Core集成Exceptionless分布式日志功能以及全局异常过滤
Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...
-
Allegro PCB Design GXL (legacy) 使用slide推挤走线,走线的宽度就发生改变的原因
Allegro PCB Design GXL (legacy) version 16.6-2015 使用slide推挤走线,走线的宽度就会发生改变. 后来发现是因为约束管理器(Constraint M ...
-
Linux下运行Shell脚本或者可执行文件Executable方法
绝对路径 /xxx/xxx/something.sh /xxx/xxx/executable 相对路径 ./something.sh ./executable 注意:前边得加./,可不是像window ...