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总结的更多相关文章
随机推荐
- .NET斗鱼直播弹幕客户端(下)
.NET斗鱼直播弹幕客户端(下) 在上篇文章中,我们提到了如何使用.NET连接斗鱼TV直播弹幕的基本操作.然而想要做得好,做得容易扩展,就需要做进一步的代码整理. 本文将涉及以下内容: 介绍如何使用R ...
- HTML块元素与内联元素嵌套规则
HTML存在许多种类型的标签,有的标签下面只允许特定的标签存在,这就叫HTML嵌套规则.不按HTML嵌套规则写,浏览器就不会正确解析,会将不符合嵌套规则的节点放到目标节点的下面,或者变成纯文本.关于H ...
- UVA - 12099 The Bookcase
No wonder the old bookcase caved under the massive piles of books Tom had stacked on it. He had bett ...
- yum安装出现No package vim available解决办法
[root@iZwz96wgquf8g6okusxr0uZ yum.repos.d]# yum install yum-downloadLoaded plugins: fastestmirrorLoa ...
- RF中的if判断
关键字run keyword if 格式如下: Run Keyword If 判断条件 其他关键字 ... ELSE IF 判断条件 其他关键字 ... ELSE ...
- RegExp实现字符替换
将字符串组中的所有Paul替换成Ringo,g:执行全局匹配,查找所有匹配而非在找到第一个匹配后停止;\b:匹配单词边界,划分匹配字符的起始范围 <!DOCTYPE html> <h ...
- 使用java语言实现一个动态数组(详解)(数据结构)
废话不多说,上代码 1.从类名开始(我真是太贴心了) public class Array<E> 首先数组类需要带有泛型,这个不多说.需要注意的是在java中,数组只能存放同一个类型的. ...
- HelloWin详解
(注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲) (注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲) (注意:遇到程序在弄懂之后一定要自己去敲,一定要 ...
- [Luogu4550] 收集邮票
题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所 ...
- .Net Core 3.0 IdentityServer4 快速入门
.Net Core 3.0 IdentityServer4 快速入门 一.简介 IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架. 将 ...