这次考试还算可以(吧),暴力都没打满,但是还差很多。

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总结的更多相关文章

随机推荐

  1. 【Java】 生成32位随机字符编号

    /** * 生成32位编码 * @return string */ public static String getUUID(){ String uuid = UUID.randomUUID().to ...

  2. XCTF-Misc

    最近无聊在做一下杂项,随便总结一下关于杂项的知识. 一. xcaliflag 这个直接拖进stegsolve里面,大约是在Blue的第3位左右就很清楚了 二.

  3. 在我的新书里,尝试着用股票案例讲述Python爬虫大数据可视化等知识

    我的新书,<基于股票大数据分析的Python入门实战>,预计将于2019年底在清华出版社出版. 如果大家对大数据分析有兴趣,又想学习Python,这本书是一本不错的选择.从知识体系上来看, ...

  4. linux netlink通信机制简介

    一.什么是Netlink通信机制  Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口. Netlink 是一种特殊的 s ...

  5. 编程杂谈——std::vector与List<T>的性能比较

    昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...

  6. go语言正则表达式

    我们前两节课爬取珍爱网的时候,用到了很多正则表达式去匹配城市列表.城市.用户信息,其实除了正则表达式去匹配,还可以利用goquery和xpath第三方库匹配有用信息.而我利用了更优雅的正则表达式匹配. ...

  7. Linux 命令之 chmod

    命令格式 chmod有以下三种格式 chmod [-cfvR] MODE[,MODE]... FILE... chmod [-cfvR] OCTAL-MODE FILE... chmod [-cfvR ...

  8. C#调用RabbitMQ实现消息队列

    前言 我在刚接触使用中间件的时候,发现,中间件的使用并不是最难的,反而是中间件的下载,安装,配置才是最难的. 所以,这篇文章我们从头开始学习RabbitMq,真正的从头开始. 关于消息队列 其实消息队 ...

  9. springboot使用idea打jar包

    1.如果有本地jar包依赖,放到/WEB-INF/lib下,用system类型配到pom中 <dependency> <groupId>org.wechat</group ...

  10. JS中==运行机制

    1. 判断两边是否有NaN,如果有则一律返回false 2.判断两边是否含有布尔值,如果有的话则将true转化为1,false转化为0. 3.遇到null或者undefined,则不会进行类型转换,它 ...