日期:

八月六号

 总分:

300分

 难度:

提高 ~ 省选  

 得分:

10分(MMP)

题目目录:

  T1:Tree

  T2:异或运算

  T3:Tree Restoring

赛后反思:

Emmmmmmm……

一直在打第一题…… 结果考完才发现dp少了一种情况……

除此之外,我无话可说…… Emmmmmm……

题解:

T1:Tree

树形背包dp,设$f[i][j][k(0/1/2)]$为$i$的子树中,选$j$条边,0:从$i$出发,到$i$结束/1:从$i$出发,到$i$的某个后代结束/2:后代开始,经过$i$,后代结束:

状态转移:

 f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);

这样就能树形dp,时间复杂度 $O(n^2)$

COMPLETE CODE:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int n,k,x,y,z,tot=,h[],siz[];
long long f[][][],ans=1e18;
struct Edge{
int x,y,dis,next;
}e[];
bool vis[]; inline void add_edge(int x,int y,int z){
e[++tot].x=y,e[tot].dis=z;
e[tot].next=h[x],h[x]=tot;
} void dfs(int x,int fa){
siz[x]=;
f[x][][]=;
f[x][][]=;
for(int i=h[x];i;i=e[i].next){
if(e[i].x==fa)continue;
dfs(e[i].x,x);
int y=e[i].x;
for(int j=siz[x]-;j>=;j--)
for(int k=siz[y]-;k>=;k--){
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);
f[x][j+k+][]=min(f[x][j+k+][],f[x][j][]+f[y][k][]+*e[i].dis);
}
siz[x]+=siz[e[i].x];
}
} int main(){
memset(f,0x7f,sizeof(f));
scanf("%d%d",&n,&k);
for(int i=;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
add_edge(y,x,z);
}
dfs(,-);
for(int i=;i<=n;i++)
ans=min(ans,min(f[i][k-][],f[i][k-][]));
printf("%lld",ans);
}

T2:异或运算

可持久化Trie树,我之前还不知道可持久化,现在才知道,这跟主席树是一样的,是通过差分,维护区间。

我们按位贪心,由于$n$很小,对于每一位枚举$a$序列,统计现在的位置往优了走会有多少个值,如果大于$k$,可以走,如果小于$k$,所有反着走。

问题就这么迎刃而解了。(貌似这题用动态开点的主席树维护值域也能做……)

CODE:

 #include<iostream>
#include<cstdio>
using namespace std; int n,m,q,x,y,l,r,k,cnt=,tot=;
int a[],b[],root[];
struct Trie{
int siz,next[];
}v[];
struct Node{
int l,r,val;
}s[]; void insert(int &o,int last,int x){
o=++tot;
int p=o,q=last;
for(int i=;i>=;i--){
v[p]=v[q],v[p].siz++;
v[p].next[(x>>i)&]=++tot;
p=v[p].next[(x>>i)&];
q=v[q].next[(x>>i)&];
}
v[p].siz++;
} int find(int cnt,int k){
int ans=;
for(int i=;i>=;i--){
int sum=;
for(int j=;j<=cnt;j++){
bool c=(s[j].val>>i)&;
sum+=v[v[s[j].r].next[c^]].siz
-v[v[s[j].l].next[c^]].siz;
}
if(sum>=k){
ans=ans<<|;
for(int j=;j<=cnt;j++){
bool c=(s[j].val>>i)&;
s[j].r=v[s[j].r].next[c^];
s[j].l=v[s[j].l].next[c^];
}
}else{
k-=sum,ans=ans<<;
for(int j=;j<=cnt;j++){
bool c=(s[j].val>>i)&;
s[j].r=v[s[j].r].next[c];
s[j].l=v[s[j].l].next[c];
}
}
}
return ans;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",a+i);
for(int i=;i<=m;i++)scanf("%d",b+i);
for(int i=;i<=m;i++)
insert(root[i],root[i-],b[i]);
scanf("%d",&q);
for(int i=;i<=q;i++){
scanf("%d%d%d%d%d",&x,&y,&l,&r,&k);
cnt=;
for(int j=x;j<=y;j++)
s[++cnt]=(Node){root[l-],root[r],a[j]};
printf("%d\n",find(cnt,k));
}
}

T3:Tree Restoring

很容易发现离所有点最远的点定是树的直径的两个端点。(我怎么就没想到呢?)

所有点的距离只能在$\left\lceil{d\over 2}\right\rceil$到$d$之间,同时直径上的点两两对称,判断这些即可。

CODE:

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; int n,x,a,b,t[]; int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&x);
t[x]++,a=max(a,x);
}
b=a+>>;
for(int i=b+;i<=a;i++)
if(t[i]<){
printf("Impossible");
return ;
}
if(a&){
if(t[b]<){
printf("Impossible");
return ;
}t[b]-=;
}else{
if(t[b]<){
printf("Impossible");
return ;
}t[b]-=;
}
for(int i=;i<=b;i++)
if(t[i]){
printf("Impossible");
return ;
}
printf("Possible");
}

2018.8.6 Noip2018模拟测试赛(十九)的更多相关文章

  1. 2018.7.31 Noip2018模拟测试赛(十六)

     日期: 七月最后一天  总分: 300分  难度: 提高 ~ 省选  得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...

  2. 2018.8.7 Noip2018模拟测试赛(二十)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 100分(呵呵一笑) 题目列表: T1:SS T2:Tree Game T3:二元运算 赛后反思: Emmmmmm…… 开 ...

  3. 2018.8.8 Noip2018模拟测试赛(二十一)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 112分(OvO) 题目目录: T1:幸福的道路 T2:Solitaire T3:Flags 赛后心得: 第一题裸树d啊! ...

  4. 2017.8.2 Noip2018模拟测试赛(十八)

     日期: 八月二日  总分: 300分  难度: 提高 ~ 省选  得分: 40分(又炸蛋了!!) 题目列表: T1:分手是祝愿 T2:残缺的字符串 T3:树点涂色 赛后心得: 哎,T1求期望,放弃. ...

  5. 2017.8.1 Noip2018模拟测试赛(十七)

    日期: 八月第一天  总分: 300分  难度: 提高 ~ 省选    得分: 100分(不应该啊!) 题目目录: T1:战争调度 T2:选数 T3:由乃的OJ 赛后心得: MMP,首先第一题花了大概 ...

  6. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  7. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  8. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

  9. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

随机推荐

  1. FZOJβ #31.字符串

    http://1572m36l09.iask.in:30808/problem/31 首先转化为保留尽量少的段使得字典序最大.考虑逐字符确定,显然我们可以将相同的连续字符缩在一起.注意到字典序最大的字 ...

  2. shell脚本,awk取中间列的方法。

    解释 1.$(int(NF/2)+1) 中int(NF/2)等于3,然后加1,就得到中间的4了. 2.$(NF/2+0.5) 相当于得出的是整数.NF/2是3.5,再由3.5+0.5,所以就是4了,也 ...

  3. iOS 解决ipv6问题

    解决ipv6的方法有很多种,由于现在国内的网络运营商还在使用ipv4的网络环境,所以appstore应用不可能大范围去修改自己的服务器, 而且国内的云服务器几乎没有ipv6地址. 这里附上苹果开发平台 ...

  4. iOS开发之MVVM在项目中的应用

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  5. vue组件:canvas实现图片涂鸦功能

    方案背景 需求 需要对图片进行标注,导出图片. 需要标注N多图片最后同时保存. 需要根据多边形区域数据(区域.颜色.名称)标注. 对应方案 用canvas实现涂鸦.圆形.矩形的绘制,最终生成图片bas ...

  6. Python 建模步骤

    #%% #载入数据 .查看相关信息 import pandas as pd import numpy as np from sklearn.preprocessing import LabelEnco ...

  7. usb hub 设备流程图

    在此处负责而来:http://blog.csdn.net/xuelin273/article/details/38646851  下面的转载于:http://blog.csdn.net/qianguo ...

  8. eclipse使用技巧的网站收集——转载(一)

    Eclipse工具使用技巧总结(转载) 首先推荐一篇非常好的How to use eclipse文章 ,讲的是eclipse使用的方方面面,非常实用,推荐给大家! 一.常用快捷键:Ctrl+F11 运 ...

  9. iOS 中的视图函数 init initwithnib viewDidLoad viewWillAppear的总结

    我要总结的函数主要是这几个: UIView *view-如果view还没有被初始化的话,getter方法会先调用[self loadView],如果getter或者setter方法被重写了,子类中的g ...

  10. Linux之ssh服务介绍

    一.什么是SSH? 简单说,SSH(Secure Shell Protocol)是一种网络协议,用于计算机之间的加密登录.在默认状态下SSH服务提供俩个服务功能,一个是提供类似telnet远程联机服务 ...