cf933A dp题

一开始看错是连续子序列了,然后样例刚好能过。。

然后正解没想出来,网上看了题解:感觉正解是枚举2开始的位置,然后再枚举翻转的区间,pos左右两侧分别求出贡献最大的那个区间,左右两部分的贡献是独立计算的

#include <cstdio>
#include <cmath>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--) typedef long long ll;
const int maxn = ;
const ll mod = 1e9+;
const ll INF = 1e18+;
const double eps = 1e-; int n;
int a[maxn];
int pre1[maxn];
int pre2[maxn]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
pre1[i]=pre1[i-]+(a[i]==);
}
for(int i=n;i>=;i--) pre2[i]=pre2[i+]+(a[i]==);
int ans=;
for(int k=;k<=n+;k++) //枚举位置pos
{
int num1=,num2=;
for(int i=;i<=k;i++) num1=max(num1,pre1[i-]+pre2[i]-pre2[k]); //枚举l
for(int i=k;i<=n+;i++) num2=max(num2,pre2[i]+pre1[i-]-pre1[k-]); //枚举r
ans=max(ans,num1+num2);
}
printf("%d\n",ans);
}

然后是神仙做法,因为答案必定是11111222221111122222的前缀样式,所以只要从左到右扫一次即可。。

#include<bits/stdc++.h>
using namespace std; #define maxn 2000 int n;
int a[maxn+];
int f[maxn+][]; int main() {
scanf("%d",&n);
for(int i=; i<=n; i++) scanf("%d",&a[i]);
for(int i=; i<=n; i++) {
for(int j=; j<=; j++) {
f[i][j]=f[i][j-];
if(a[i]==(j+)%+) f[i][j]=max(f[i][j],f[i-][j]+);
else f[i][j]=max(f[i][j],f[i-][j]);
}
}
printf("%d",f[n][]);
return ;
}

cf938D 最短路+新建源点

第一次在cf上做这种题,这题就是把每个点权转化为到源点的边权,然后跑一次最短路即可

/*
给定无向图,有边权和点权
现在要求出每个点i的最小代价2*d(i,j)+aj,i可以等于j
建图:边权*2,建立源点和每个点连边,边权是ai
然后以源点为起点跑最短路即可
*/
#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define maxn 400005
#define ll long long
struct Edge{ll to,nxt,w;}edge[maxn<<];
ll head[maxn],tot,n,m,a[maxn];
void init(){
memset(head,-,sizeof head);
tot=;
}
void addedge(ll u,ll v,ll w){
edge[tot].to=v;edge[tot].w=w;
edge[tot].nxt=head[u];head[u]=tot++;
} ll d[maxn],v[maxn];
priority_queue<pair<ll,ll> >pq;
void dijkstra(){
memset(d,0x3f,sizeof d);
memset(v,,sizeof v);
d[n+]=;
pq.push(make_pair(,n+));
while(pq.size()){
pair<ll,ll>c=pq.top();pq.pop();
if(v[c.second])continue;
v[c.second]=;
ll x=c.second;
for(int i=head[x];i!=-;i=edge[i].nxt){
ll y=edge[i].to,w=edge[i].w;
if(v[y])continue;
if(d[y]>d[x]+w){
d[y]=d[x]+w;
pq.push(make_pair(-d[y],y));
}
}
}
} int main(){
init();
cin>>n>>m;
for(int i=;i<=m;i++){
ll u,v,w;
cin>>u>>v>>w;
addedge(u,v,*w);
addedge(v,u,*w);
}
for(int i=;i<=n;i++){
cin>>a[i];
addedge(i,n+,a[i]);
addedge(n+,i,a[i]);
}
dijkstra(); for(int i=;i<=n;i++)
cout<<d[i]<<" ";
}

cf939E 三分+简单公式

学了下三分的写法,能用来求单峰函数的极值

三分链接: https://blog.csdn.net/pi9nc/article/details/9666627

/*
1.往多重集合s里加数 ,每次给的数时单调不递减的
2.求子集ss,使max(ss)-mean(ss)最大
三分法来做即可
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 500005
#define ll long long
double sum[maxn],n;
ll len,Max;
double f(int i){
return ((double)sum[i]+Max)/(i+);
}
double sanfen(int l,int r){
while(l<r-){
int mid=(l+r)>>;
int mmid=(mid+r)>>;
if(f(mid)>f(mmid))
l=mid;
else r=mmid;
}
if(f(l)>f(r))return f(r);
return f(l);
}
int main(){
int q,op;
cin>>q;
while(q--){
cin>>op;
if(op==){
cin>>Max;
sum[++len]=Max+sum[len-];
}
else {
printf("%.10lf\n",Max-sanfen(,len-));
}
}
}

cf935D 概率递推dp

还是第一次做这种题。。要学一下概率dp了。。

/*
概率递推+逆元取模运算
从末尾往前推比从前往后推要更简单
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define maxn 100005
ll a[maxn],b[maxn],n,m,dp[maxn];
ll inv2,invm;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==){x=,y=;return a;}
ll d=exgcd(b,a%b,x,y);
ll z=x;x=y;y=z-a/b*x;
return d;
} int main(){
cin>>n>>m;
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=n;i++)cin>>b[i];
ll x,y;
exgcd(,mod,x,y);inv2=(x+mod)%mod;
exgcd(m,mod,x,y);invm=(x+mod)%mod;
for(int i=n;i>=;i--){
if(a[i] && b[i]){//第i位都是固定的数
if(a[i]==b[i])dp[i]=dp[i+];
else dp[i]=a[i]>b[i];
}
else if(b[i])//ai填数,ai==bi的概率+ai>bi的概率
dp[i]=dp[i+]*invm%mod+(m-b[i])*invm%mod;
else if(a[i])//bi填数,ai==bi的概率+ai>bi的概率
dp[i]=dp[i+]*invm%mod+(a[i]-)*invm%mod;
else if(!a[i] && !b[i])//都填数,ai==bi的概率+ai!=bi且ai>bi的概率
dp[i]=dp[i+]*invm%mod+(m-)*inv2%mod*invm%mod;
}
cout<<dp[]%mod<<endl;
}

cf自训4.10的更多相关文章

  1. 沈逸老师PHP魔鬼特训笔记(10)

    为了防止代码让我们混淆不清,大家看视频中的分离方法 1.新建了一个文件夹叫code (这代表是代码) 2.再新建一个文件夹叫page (这代表是页面) 代码该怎么写呢? 这里要记住口诀 1.index ...

  2. CF Educational Codeforces Round 10 D. Nested Segments 离散化+树状数组

    题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段. 方法是对所有线段的端点 ...

  3. cf自训6

    cf946D 背包+区间dp 好题 /* 先预处理出每行消去i个1后可以的到的最小时间: 先求每行的前缀和,枚举左端点和右端点,消去的1 cost=tot-sum[r]+sum[l-1],区间长度=r ...

  4. Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)

    C.Insertion Sort 题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1. 思路:我们把数字看成[1,M],[N-M+1,N ...

  5. 沈逸老师PHP魔鬼特训笔记(9)--进化

    回到第一课,我们学过PHP母体,了解过解析PHP程序.PHP其实内置了一个web服务器,专门给我们开发测试使用,那么接下来我们要完成的是:生成后创建一个web 服务,在浏览器中可以访问. PHP的母体 ...

  6. 10、QT分析之WebKit

    该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的 ...

  7. H3C查看CF卡内的文件

    查看CF卡内的文件 <H3C>dir             //查看文件及目录文件 Directory of cf:/ -------------查看的是CF卡的内容      0    ...

  8. hbase开发实例

    1.put/checkAndPut package com.testdata; import java.io.IOException; import org.apache.hadoop.conf.Co ...

  9. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)

    A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...

随机推荐

  1. SQL中ON和WHERE的区别

    SQL中ON和WHERE的区别 - 邃蓝星空 - 博客园 https://www.cnblogs.com/guanshan/articles/guan062.html

  2. Object的所有方法

    Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. const object1 = { a: 1, b: 2, c: 3 }; const ...

  3. 妙解Servlet四大域对象

    pageContext pageContext作用域为page(页面执行期). request request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域仅在当前请求中有效. ...

  4. JAVA多线程-内存模型、三大特性、线程池

    一.线程的三大特性 原子性.可见性.有序性 1)原子性,即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.原子性其实就是保证数据一致.线程安全一部分. 2)可见性,即 ...

  5. JAVA多线程-初体验

    一.线程和进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 进程是所有线程的集合,每一个线程是进程中的一条执行路径. 二.为什么使用多线程,哪些场景下使用 多线程的好处是提高程序 ...

  6. 番外篇-AppService服务

    一. public async Task<ListResultDto<ArchitectureDto>> GetArchitecture() { var architectur ...

  7. 如何升级centos到最新版本

    本文将教你如何升级centos到最新版本.centos中“update”命令可以一次性更新所有软件到最新版本.注意:不推荐使用update的y选项,-y选项会让你在安装每项更新前都进行确认(译者注:这 ...

  8. servlet篇 之 跳转问题

    servlet中的跳转: 跳转本质上是对文件传输操作 进行 封装. 例如:客户端访问一个servlet,在servlet中需要把已经写好的页面hello.html返回给客户端浏览器,需要用io来实现这 ...

  9. Qt 自定义按钮

    自定义控件的实现思路如下: a1.新建一个类,该类继承QPushbutton,由于QPushbutton继承于QWidget,因此可以直接在该继承类里面进行布局管理和挂载控件: a2.新建两个QLab ...

  10. EasyTouch5ForSiki学院

    总结: 这里面的一些功能,就可以拿来做移动或者PC的很多功能了,这是一个很有用的插件. 禁用0618错误 EasyTouch4_x的写法: using HedgehogTeam.EasyTouch; ...