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个(奇数时). /************************************************ ...
随机推荐
- $(function(){})简述
用jQ的人很多人都是这么开始写脚本的: $(function(){ // do something }); 其实这个就是jq ready()的简写,他等价于: $(document).ready(fu ...
- /usr/bin/ld: .build_release/tools/alignment_tools.o: undefined reference to symbol 'omp_get_thread_num@@OMP_1.0'
问题:/usr/bin/ld: .build_release/tools/alignment_tools.o: undefined reference to symbol 'omp_get_threa ...
- 2.1 re 模块
正则表达式 简单的范围的字符组 字符 量词 字符集 分组 转义字符 flags 方法 .findall() .finditer() .search() .match() .sub() .subn( ...
- 【BZOJ5506】[GXOI/GZOI2019]旅行者(最短路)
[BZOJ5506][GXOI/GZOI2019]旅行者(最短路) 题面 BZOJ 洛谷 题解 正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更 ...
- 洛谷P1880 石子合并(环形石子合并 区间DP)
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 洛谷P2822 组合数问题(题解)
https://www.luogu.org/problemnew/show/P2822(题目传送) 先了解一下有关组合数的公式:(m在上,n在下) 组合数通项公式:C(n,m)=n!/[m!(n-m) ...
- beego框架返回json数据
一.routers路由 package routers import ( "mybeego/controllers" "github.com/astaxie/beego& ...
- linux镜像下载
https://blog.csdn.net/qq_42570879/article/details/82853708
- usb输入子系统键盘(四)
目录 usb输入子系统键盘 设计思路 内核的上报代码 完整代码 title: usb输入子系统键盘 tags: linux date: 2018/12/20/ 17:05:08 toc: true - ...
- python django(forms组件)
forms组件最大的作用,就是做数据校验. 普通做法,一个一个写校验规则,没有解耦.校验规则,都在视图函数里面. 网页校验 修改urls.py,增加路径addbook from app01 impor ...