日期:

八月六号

 总分:

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. linux交换分区调整

      SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用.它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且 ...

  2. redis的一个bug

    清楚redis缓存的时候,出现以下问题: (error) MISCONF Redis is configured to save RDB snapshots, but is currently not ...

  3. 控件中添加的成员变量value和control的区别

    control型变量是这个控件所属类的一个实例(对象)可以通过这个变量来对该控件进行一些设置.而value只是用来传递数据,不能对控件进行其它的操作.control型变量可以获得控件的实例,通过这个变 ...

  4. vue-highlightjs的使用小结

    万能的github真主,让我们强大!在vue的项目中想使用highlight.js这样的代码高亮?有人帮助我们实现了vue-highlightjs 安装 yarn add highlight.js - ...

  5. python 取余运算

    python中取余运算逻辑如下: 如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系: a = qd + r , q 为整数,且0 ≤ |r| < |d|. 经过测试可发现,pytho ...

  6. oracle如何保证读一致性 第一弹

    oracle保证读一致性原理   1:undo segment的概念                   当数据库进行修改的时候,需要把保存到以前的old的数据保存到一个地方,然后进行修改,用于保存o ...

  7. C与C++接口相互调用

    转载于:http://blog.csdn.net/lincoln_2012/article/details/50801080 项目中经常使用C和C++混合编程,那么,在调用对方接口时,总是不可避免地出 ...

  8. stm32独立看门狗实验

    //ALIENTEK Mini STM32开发板V1.9范例代码5//独立看门狗实验//正点原子@ALIENTEK//技术论坛:www.openedv.com STM32F103RBT6属于中容量版本 ...

  9. 字符串:HDU5371-Hotaru's problem(manacher 的应用)

    Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Pr ...

  10. Java观察者模式(Observer)

    一.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.主要应用在java的AWT事件机制 ...