csps63总结
这次考试还算可以(吧),暴力都没打满,但是还差很多。
T1 强烈推荐我的打法,很好理解并且很好打(虽然稍长)
维护指针指向的值及其是第几个数,然后分类讨论。
(诡异构造的序列==随机数据)??
#include<cstdio>
#include<iostream>
using namespace std;
const int N=1e8+7e7+9e6+4e5+2e4+5e3;
char v[N+];
int s[+],tot,prime[+];
void pre()
{
for(register int i=;i<=N;i++)
{
if(!v[i]) prime[++tot]=i;
for(register int j=;j<=tot&&prime[j]*i<=N;j++)
{
v[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
return ;
}
int c[];//维护指向的值,以及该值的第几个数
struct node{
int val,num;
inline void moveleft()
{
if(num>) {num--;return ;}
num=;val--;
while(!c[val]) val--;
num=c[val];
}
inline void moveright()
{
if(num<c[val]){num++;return ;}
val++;
while(!c[val]) val++;
num=;
}
inline void del(int x)
{
if(x==val)
{
if(c[x]<num) moveright();
return ;
}
if(x<val) moveright();
}
inline void add(int x)
{
if(x<val) moveleft();
}
}tl,tr;
int main()
{
pre();
int n,k,w;double ans=;
scanf("%d%d%d",&n,&k,&w);
for(register int i=;i<=n;i++) s[i]=(1ll*prime[i]*i)%w;
for(register int i=n;i>=;i--) s[i]=s[i]+s[i/+];
for(register int i=;i<=k;i++) c[s[i]]++;
if(k&)
{
int tmp=;
for(register int i=;i<=w*;i++)
{
if(tmp+c[i]>=k/+)
{
tl.val=i;
tl.num=k/+-tmp;
break;
}
tmp+=c[i];
}
for(register int i=;i<=n-k+;i++)
{
ans+=tl.val;
--c[s[i]],tl.del(s[i]);
if(i+k<=n) ++c[s[i+k]],tl.add(s[i+k]);
}
}
else
{
int tmp=;
for(register int i=;i<=w*;i++)
{
if(!tl.num&&tmp+c[i]>=k/)
tl.val=i,tl.num=k/-tmp;
if(tmp+c[i]>=k/+)
{
tr.val=i;
tr.num=k/+-tmp;
break;
}
tmp+=c[i];
}
for(register int i=;i<=n-k+;i++)
{
ans+=1.0*(tl.val+tr.val)/;
--c[s[i]];
tl.del(s[i]);tr.del(s[i]);
if(i+k<=n) ++c[s[i+k]],tl.add(s[i+k]),tr.add(s[i+k]);
}
}
printf("%.1lf",ans);
}
T2 也是维护指针,维护一个大小为n的序列,每次删掉$MAX$,然后插入一个,由于每次插入的如果比$MAX$大的话是板逼要被直接删掉的,
所以指针单调不增,复杂度$O(nk)$
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int a[],cnt[];
int b[];
int main()
{
int n,k,p,tot;
scanf("%d%d",&n,&k);
for(register int i=;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];tot=n;
sort(b+,b+n+);tot=unique(b+,b+n+)-b-;
for(register int i=;i<=n;i++) a[i]=lower_bound(b+,b+tot+,a[i])-b;
while(k--)
{
scanf("%d",&p);int tmp=;long long ans=;
for(register int i=;i<=p;tmp=max(tmp,a[i]),++cnt[a[i]],i++);
register int i=p+,cur=;
for(register int j=;j<=n;j++)
{
if(cur&) ans+=b[tmp];
else ans-=b[tmp];
cur^=;cnt[tmp]--;
while(tmp&&!cnt[tmp]) tmp--;
while(i<=n&&a[i]>tmp)
{
if(cur&) ans+=b[a[i]];
else ans-=b[a[i]];
j++;i++;cur^=;
}
if(i<=n) cnt[a[i++]]++;
}
printf("%lld\n",ans);
}
return ;
}
T3 树形DP,大样例一定要$freopen$,就因为这个我以为大样例没过调了一个多小时。
假设$dp[i][j][0/1]$表示到i点撒了j块面包到子树/子树到i点的最大值,直接维护然后合并。
/*
子树到i 直接转移即可 合并的时候i撒的贡献要减少p[y]
i到子树 直接转移即可
kx变成sb了 呜呜呜呜呜呜
#include<iostream>
using namespace std;
int main(){int a,b;cin>>a>>b;cout<<a+b<<endl;return 0;}
*/
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int n,t,head[],to[*],nxt[*],cnt,p[];
LL s[],f[][][],mx[][],ans;//0 子树到i (只考虑向下) 1 i到子树
inline void Add(int u,int v)
{
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
void dp(int x,int fa)
{
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(y==fa) continue;
dp(y,x);
}
memset(mx,,sizeof mx);
for(int i=head[x];i;i=nxt[i])
{
if(to[i]==fa) continue;
int y=to[i];
for(register int j=;j<=t;j++)
{
ans=max(ans,max(mx[t-j][]+f[y][j][],mx[t-j][]+f[y][j][]));
if(j^t) ans=max(ans,mx[t-j-][]+f[y][j][]+s[x]);
if(j) ans=max(ans,f[y][j-][]-p[y]+mx[t-j][]+s[x]);
}
for(register int j=;j<=t;j++)
{
mx[j][]=max(mx[j][],f[y][j][]);
mx[j][]=max(mx[j][],f[y][j][]);
mx[j][]=max(mx[j][],f[y][j][]-p[y]);
}
}
f[x][][]=s[x],f[x][][]=s[x]-p[fa];
for(register int i=head[x];i;i=nxt[i])
{
if(to[i]==fa) continue;
int y=to[i];
for(register int j=;j<=t;j++)
f[x][j][]=max(f[x][j][],max(f[y][j][],f[y][j-][]+s[x]-p[y])),
f[x][j][]=max(f[x][j][],max(f[y][j][],f[y][j-][]+s[x]-p[fa]));
}
}
signed main()
{
srand((unsigned)time());
scanf("%d%d",&n,&t);
for(register int i=;i<=n;i++) scanf("%d",&p[i]);
for(register int i=,a,b;i<n;i++) scanf("%d%d",&a,&b),Add(a,b),Add(b,a),s[a]+=p[b],s[b]+=p[a];
dp(,);
printf("%lld\n",ans);
return ;
}
csps63总结的更多相关文章
随机推荐
- mysql配置默认字符集为UTF8mb4
[client] default-character-set=utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = ut ...
- 学Python的第一天
第一天学习笔记 一.安装typroa 下载软件typroa用于日常学习笔记记录,该软件支持markdown语法 步骤: 官网地址:https://typora.io/ 选择版本安装(以windows为 ...
- B-经济学-基尼指数
目录 基尼指数 一.基尼指数简介 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/ni ...
- 基于Spring AOP实现的权限控制
1.AOP简介 AOP,面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术.系统是由许多不同的组件所组成的,每一个组件负责一块特定的功能.除了实现自身核心功能之外,这些组件还经常承担着额外的 ...
- 树莓派(4B)Linux + .Net Core嵌入式-初始化环境(一)
一.树莓派简单介绍 二.软&件准备 硬件:树莓派4B主机.电源线.TF卡&TF读卡器.PC 软件:win32diskimager(用于烧系统到TF卡).Xshell或Windows T ...
- 聊聊面试-int和Integer的区别
最近面试了很多候选人,发现很多人都不太重视基础,甚至连工作十几年,项目经验十几页的老程序员,框架学了一大堆,但是很多 Java 相关的基础知识却很多都答不上来.还有很多人会回答,只知道要用,但是从来不 ...
- snkrs web端分析,canvas中的fingerpint
snkrs web端分析,canvas中的fingerpint 代码如下 (()=>{ const canvas = document.createElement("canvas&qu ...
- [CF722C] Destroying Array
C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- opencv::直方图均衡化
直方图均衡化 图像直方图: 是指对整个图像像在灰度范围内的像素值是指对整个图像像在灰度范围内的像素值(~)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图. 直方图反映了图像灰度的分布情况. ...