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总结的更多相关文章
随机推荐
- kubernetes垃圾回收器GarbageCollector Controller源码分析(二)
kubernetes版本:1.13.2 接上一节:kubernetes垃圾回收器GarbageCollector Controller源码分析(一) 主要步骤 GarbageCollector Con ...
- Nullable Reference Types 可空引用类型
在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...
- 年薪500K工程师告诉你,python都能用来做什么?
一提到python,大家脑袋中都会想到「数据分析」.「爬虫」.「人工智能」这些词. 其实python并没有像如上所说的这样「专业」.「高深」的应用,对于初学者来说更是可以从一些超简单又有趣的小项目开始 ...
- 设计模式 - 动态代理原理及模仿JDK Proxy 写一个属于自己的动态代理
本篇文章代码内容较多,讲的可能会有些粗糙,大家可以选择性阅读. 本篇文章的目的是简单的分析动态代理的原理及模仿JDK Proxy手写一个动态代理以及对几种代理做一个总结. 对于代理模式的介绍和讲解,网 ...
- 腾讯新闻抢金达人活动node同构直出渲染方案的总结
我们的业务在展开的过程中,前端渲染的模式主要经历了三个阶段:服务端渲染.前端渲染和目前的同构直出渲染方案. 服务端渲染的主要特点是前后端没有分离,前端写完页面样式和结构后,再将页面交给后端套数据,最后 ...
- 实验吧之【who are you?】(时间盲注)
地址:http://ctf5.shiyanbar.com/web/wonderkun/index.php 这道题点开看见your ip is :xxx.xxx.xx.xxx 试了一些 最后发现是XFF ...
- My Idea About ID wly_sh (关于用户名 wly_sh 的猜想)
I Wanna Say Is That- There's a guy called wsh in our computer room. That guy registered a blog in CS ...
- 真——Springcloud支持Https
很久不写了,因为一直没有一个项目的需求推动,担心写的东西可能不是太实际.其间学习的事倒是做了不少,设计模式.领域开发.Antlr.kubernetes等等,其实大部分都记在纸质笔记上了.. 基于对新技 ...
- 浑身尖刺的服务可用性守护者——hystrix熔断器实践记录
netflix公司的产品hystrix(长满刺的豪猪),在高可用目标下具有一定熔断.限流.降级的作用.这里主要写一些自己在使用时的问题解决思路,原理请自行理解,包括线程池与信号量模式等. 注意三个参数 ...
- 浏览器标签tab窗口切换时事件状态侦听
做到 是大屏项目,用的websocket,在浏览器切换标签窗口后,过了一段时间回来,页面会非常卡,所以想页面切回来的时候刷新页面,找到了这个方法,这是原来的例子.这段代码可以自己复制去做下测试 var ...