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个(奇数时). /************************************************ ...
随机推荐
- centos7之添加开机启动服务/脚本
一.添加开机启动脚本 #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to ...
- 上海上传数据重复-sftp端口关闭
关键: (1) sftp的测试指令:sftp -oPort=2125 meituan@220.248.104.170 (2)让上海那边自己试了一下,也不行,他们自己重置了一下sftp的密码,我们可以登 ...
- a = a + 1, a++, ++a ,a+=1区别在哪
a = a +1; 即最普通的写法,将a的值加1再赋给a:a+=1; 相当于 a = a+1; a++; 是先将a的值赋给一个变量, 再自增: ++a:是先自增, 再把a的值给一个变量
- [OI]Noip 2018总结(普及)
考砸了,还有原谅我代码十分有限的可读性. 一个人的真正伟大之处就在于他能够认识到自己的渺小.——保罗 从一年前初一九月到现在18年10月接触OI已经有一年了.几次模拟赛也自我感觉良好,都过了一等的线, ...
- #!/usr/bin/python3的作用 解决vscode ImportError: No module named xxxx
在 Python 脚本的第一行经常见到这样的注释: #!/usr/bin/env python3 或者 #!/usr/bin/python3 含义 在脚本中, 第一行以 #! 开头的代码, 在计算机行 ...
- 【XSY2843】「地底蔷薇」 NTT什么的 扩展拉格朗日反演
题目大意 给定集合\(S\),请你求出\(n\)个点的"所有极大点双连通分量的大小都在\(S\)内"的不同简单无向连通图的个数对\(998244353\)取模的结果. \(n\le ...
- SpringMvc的自动装箱和GET请求参数可以为自定义对象的思考
在我的概念里边,GET请求需要加上注解@RequestParam,然后它的参数类型只能是 基本数据类型 或者 基本数据类型的包装类,比如:@RequestParam String name(默认是必传 ...
- [manjaro]换源到中国并按照速度排序
sudo pacman-mirrors -i -c China -m rank 勾选第一行的源.
- 测试框架httpclent 2.配置优化方法
优化就是为了使代码看起来更简便,如果代码里面的每一个请求都写一次url,那么整体代码看起来很乱,而且一旦某个服务器的端口号或者域名有变动,那么所有的url都需要改变,成本太大.为了让代码看起来更简便, ...
- 2017-12-19python全栈9期第四天第二节之列表的增删查改之按索引改和按切片改
#!/user/bin/python# -*- coding:utf-8 -*-li = ['zs','ls','ww','zl','xx']li[0] = 'cxvb' #按索引位置print(li ...