cf自训4.10
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的更多相关文章
- 沈逸老师PHP魔鬼特训笔记(10)
为了防止代码让我们混淆不清,大家看视频中的分离方法 1.新建了一个文件夹叫code (这代表是代码) 2.再新建一个文件夹叫page (这代表是页面) 代码该怎么写呢? 这里要记住口诀 1.index ...
- CF Educational Codeforces Round 10 D. Nested Segments 离散化+树状数组
题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段. 方法是对所有线段的端点 ...
- cf自训6
cf946D 背包+区间dp 好题 /* 先预处理出每行消去i个1后可以的到的最小时间: 先求每行的前缀和,枚举左端点和右端点,消去的1 cost=tot-sum[r]+sum[l-1],区间长度=r ...
- Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)
C.Insertion Sort 题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1. 思路:我们把数字看成[1,M],[N-M+1,N ...
- 沈逸老师PHP魔鬼特训笔记(9)--进化
回到第一课,我们学过PHP母体,了解过解析PHP程序.PHP其实内置了一个web服务器,专门给我们开发测试使用,那么接下来我们要完成的是:生成后创建一个web 服务,在浏览器中可以访问. PHP的母体 ...
- 10、QT分析之WebKit
该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的 ...
- H3C查看CF卡内的文件
查看CF卡内的文件 <H3C>dir //查看文件及目录文件 Directory of cf:/ -------------查看的是CF卡的内容 0 ...
- hbase开发实例
1.put/checkAndPut package com.testdata; import java.io.IOException; import org.apache.hadoop.conf.Co ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)
A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...
随机推荐
- Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
阅读目录(Content) 一.Hadoop客户端配置 二.Java访问HDFS集群 2.1.HDFS的Java访问接口 2.2.Java访问HDFS主要编程步骤 2.3.使用FileSystem A ...
- redis简介与持久化
一 . redis简介 redis属于NoSQL学名(not only sql) 特点: 存储结构与mysql这一种关系型数据库完全不同,nosql存储的是key value形式 nosql有很多产品 ...
- 数据交换格式与SpringIOC底层实现
1.数据交换格式 1.1 有哪些数据交换格式 客户端与服务器常用数据交换格式xml.json.html 1.2 数据交换格式应用场景 1.2.1 移动端(安卓.iOS)通讯方式采用http协议+JSO ...
- Python——Flask框架
Flask框架相关知识构架 程序的基本结构 模板 Web表单 数据库 电子邮件 程序的结构 用户认证
- 指数型生成函数 及 多项式求ln
指数型生成函数 我们知道普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题 对于数列\(\{a_n\}\),我们定义其指数型生成函数为 \[G(x) = a_0 + a_1x + a_2 ...
- VirtualBox下安装linux虚拟机
下载VirtualBox 下载地址:https://www.virtualbox.org/wiki/Downloads 安装VirtualBox 安装虚拟机 如果选择不到64位系统, 开机按 F1 进 ...
- 洛谷 P4302 【[SCOI2003]字符串折叠】
又来填一个以前很久很久以前挖的坑 首先如果先抛开折叠的内部情况不谈,我们可以得到这样的一个经典的区间DP的式子 $ f[l][r]=min(f[l][r],f[l][k]+f[k+1][r])(l&l ...
- hdu 2829 Lawrence(四边形不等式优化dp)
T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...
- CentOS7使用firewalld防火墙配置端口
安装启用firewalld防火墙 CentOS7默认的防火墙是firewalld 如果没有firewalld防火墙,可以执行yum install firewalld 命令进行安装 firewalld ...
- vegas 为盖斯
vegas 为盖斯 S键 分割素材U键 分开视频和音频I键渲染开始O渲染结束 默认布局 为盖斯新建项目的参数 剪好后渲染 插入字幕