[3.24校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢。
-----------------------------------------------------------------------------
hzwer这次不都出省选题了,干脆直接扔出了APIO三道+一道NOI,然后按照惯例最后留了一个模板题。有两道apio是2014的,以前做过了,剩下的题调来调去,还剩20分钟终于做完了。
-------------------------------------------------------------------------------
A.[apio2012] dispatching派遣
给定一棵n个点的树和一个费用m,每个点有一个忍者,派遣它的费用是ci,它的领导力是li。你要选择一个点作为领导,并且在它的子树中(包括它)选出尽可能多的点,满足费用不超过m且选出的点的数量*领导的领导力最大。n<=100000 m,c,l<=10^9
题解:这道题很多做法吧..首先费用少的肯定先选,我们每次肯定是从费用小的开始选,所以题目可以转换为求所有点的子树中最多能选几个点。
做法1:平衡树/优先队列+启发式合并
把费用装进一个平衡树/优先队列里面,然后启发式合并,合并次数是nlogn,总复杂度nlog^2n
我的做法:树剖那样子标号,满足子树的dfs序连续,然后主席树,复杂度是nlogn
#include<iostream>
#include<cstdio>
#include<queue>
#define MN 100000
#define MM 5000000
#define INF 2000000000
#define ll long long
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} int n,dfn=,cnt=,mx[MN+],size[MN+],nl[MN+],nr[MN+],head[MN+],id[MN+],rt[MN+];
ll c[MN+],l[MN+],ans=,m;
struct edge{
int to,next;
}e[MN+];
struct TREE{
int l,r,size;ll x;
}T[MM+]; void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
} void dfs1(int x)
{
size[x]=;mx[x]=;int maxn=;
for(int i=head[x];i;i=e[i].next)
{
dfs1(e[i].to);
size[x]+=size[e[i].to];
if(size[e[i].to]>maxn){maxn=size[e[i].to];mx[x]=e[i].to;}
}
} void dfs2(int x)
{
nl[x]=++dfn;id[dfn]=x;
if(mx[x]) dfs2(mx[x]);
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=mx[x])
dfs2(e[i].to);
nr[x]=dfn;
} void ins(int x,int nx,ll c)
{
T[nx].size=T[x].size+;T[nx].x=T[x].x+c;
ll l=,r=INF,mid;
while(l<r)
{
mid=l+r>>;
if(c<=mid)
{
T[nx].r=T[x].r;T[nx].l=++cnt;
r=mid;nx=T[nx].l;x=T[x].l;
}
else
{
T[nx].l=T[x].l;T[nx].r=++cnt;
l=mid+;nx=T[nx].r;x=T[x].r;
}
T[nx].size=T[x].size+;T[nx].x=T[x].x+c;
}
} int query(int x,int nx,ll cc)
{
ll l=,r=INF,mid,num=;
while(l<r)
{
mid=l+r>>;
// cout<<T[T[nx].l].x-T[T[x].l].x<<" "<<T[T[nx].l].size-T[T[x].l].size<<endl;
if(T[T[nx].l].x-T[T[x].l].x<=cc)
{
cc-=T[T[nx].l].x-T[T[x].l].x;
num+=T[T[nx].l].size-T[T[x].l].size;
x=T[x].r;nx=T[nx].r;l=mid+;
}
else
{
x=T[x].l;nx=T[nx].l;
r=mid;
}
}
if(T[nx].size-T[x].size>)
{
int x=cc/((T[nx].x-T[x].x)/(T[nx].size-T[x].size));
num+=x;
}
return num;
} main()
{ n=read();m=read();
for(int i=;i<=n;i++)
{
int fa=read();c[i]=read();l[i]=read();
if(fa) ins(fa,i);
}
dfs1();dfs2();cnt=;
for(int i=;i<=n;i++)
ins(rt[i-],rt[i]=++cnt,c[id[i]]);
for(int i=;i<=n;i++)
ans=max(ans,l[i]*1LL*query(rt[nl[i]-],rt[nr[i]],m));
// for(int i=1;i<=n;i++)
// cout<<i<<" "<<l[i]*1LL*query(rt[nl[i]-1],rt[nr[i]],m)<<endl;
cout<<ans;
return ;
}
B.C是APIO2014的两道题,我已经写过题解啦 http://www.cnblogs.com/FallDream/p/apio2014.html
D.[NOI2010]超级钢琴
给定n个数,你要选出不同的k段区间,满足长度属于[l,r]并且总和最大。 n<=500000
题解:我们发现以每个点作为左边界点,能选的区间都是连续的一段。我们可以从这一段中找到最值,然后扔到pq里面。
每次我们从pq中取出最大的,然后那一段区间被我们选的那个数劈成了两半,我们对两半同样的做法,找到最值之后扔到pq,一直这么做直到拿出k个,就行啦。
至于区间查最值 st表~线段树~看情况乱搞~
复杂度nlogn
#include<iostream>
#include<cstdio>
#include<queue>
#define MN 500005
#define N 524288
#define RG register
#define ll long long
#define INF 1000000000000000000LL
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} ll ans=;
int n,k,L,R,s[MN+];
struct data{
ll x;int from;
data operator + (data y)
{
return x>y.x?*this:y;
}
data operator -(ll num)
{
return (data){x-num,from};
}
}t[N*+];
struct node{int l,r,rg;data s;
bool operator < (const node & y) const
{
return s.x<y.s.x;
}
}now;
priority_queue<node> q; data query(data*T,int l,int r)
{
data sum=(data){-INF,};
for(l+=N-,r+=N+;l^r^;l>>=,r>>=)
{
if(~l&) sum=sum+T[l+];
if( r&) sum=sum+T[r-];
}
return sum;
} main()
{
n=read();k=read();L=read();R=read();
for(int i=;i<=N*+;i++)t[i]=(data){-INF,};
for(RG int i=;i<=n;i++)s[i]=read()+s[i-];
for(RG int i=;i<=n;i++) t[i+N]=(data){s[i],i};
for(RG int i=N;i;i--) t[i]=t[i<<]+t[i<<|];
for(int i=;i+L-<=n;i++)
q.push((node){i+L-,min(i+R-,n),i,query(t,i+L-,min(i+R-,n))-s[i-]});
for(int i=;i<=k;i++)
{
now=q.top();q.pop();
ans+=now.s.x;
if(now.s.from->=now.l)
q.push((node){now.l,now.s.from-,now.rg,(query(t,now.l,now.s.from-)-s[now.rg-])});
if(now.s.from+<=now.r)
q.push((node){now.s.from+,now.r,now.rg,(query(t,now.s.from+,now.r)-s[now.rg-])});
}
cout<<ans;
return ;
}
E.
给定n个物品,每个物品有一个编号num和一个价值。你要取出一些物品,满足不存在一个非空子集满足异或和等于0,且价值最大。
n<=1000 num<=10^18
题解:显然排序之后按照价值大小添加最优,然后就是线性基裸题啦。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1005
#define ll long long
using namespace std;
inline ll read()
{
ll x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} int n;
ll p[];
struct node{ll num;int x;}s[MAXN+]; bool cmp(node x,node y){return x.x>y.x;} int main()
{
n=read();
for(int i=;i<=n;i++) s[i].num=read(),s[i].x=read();
sort(s+,s+n+,cmp);
int ans=;
for(int i=;i<=n;i++)
{
for(int j=;j>=;j--)
if(s[i].num&(1LL<<j))
if(!p[j]) {p[j]=s[i].num;break;}
else s[i].num^=p[j];
if(s[i].num>)ans+=s[i].x;
//cout<<i<<" "<<s[i].num<<endl;
}
cout<<ans;
return ;
}
[3.24校内训练赛by hzwer]的更多相关文章
- [4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- 【7.24校内交流赛】T3【qbxt】复读警告
数据范围:N,key<=1000; 首先看题目背景,显然不是DP就是图论,但是这显然不是个图论,因此这就是个DP: 接下来考虑怎么DP 我们定义dp[i][j]表示现在dp到了第i个数,当前i个 ...
- 【7.24校内交流赛】T1&T2
T1: 一个脑洞很大的题,将输入的所有数异或起来输出就好了: (话说我为什么这么喜欢用异或啊) #include<bits/stdc++.h> using namespace std; i ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 10.0.0.55_12-16训练赛部分writeup
0x1 - MISC MISC100 一张帅行的照片 目测是图片隐写,但是binwalk并没有出来,应该是对文件头进行了修改 010editor查看一下,发现在jpg文件尾之后还有大量的数据 而且在灰 ...
- Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)
Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...
- Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)
Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...
- 7.30 正睿暑期集训营 A班训练赛
目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...
随机推荐
- [SDOI2014]旅行
洛谷 P3313 [SDOI2014]旅行 https://www.luogu.org/problem/show?pid=3313 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接 ...
- 从Nest到Nesk -- 模块化Node框架的实践
文: 达孚(沪江Web前端架构师) 本文原创,转至沪江技术 首先上一下项目地址(:>): Nest:https://github.com/nestjs/nest Nesk:https://git ...
- kubernetes 手绘画,先收藏一下
- JS解析JSON字符串
问题描述:后台需要传递给前台一些数据,用于页面数据显示,因为是一些Lable标签,所以数据传递到前台需要解析. 思路:因为数据比较杂乱,所以我选择传递的数据类型是Json格式,但是数据展示时需要解析成 ...
- CentOS7为firewalld添加开放端口
运行.停止.禁用firewalld 启动:# systemctl start firewalld 查看状态:# systemctl status firewalld 或者 firewall-cmd ...
- 页面获取Web控件ID不能正常获取,它惹得祸
今天碰到个比较奇葩的问题,因为动了一下目标框架,又原来的4.5.1改为3.5,然后又改回来了4.5.1,结果运行项目的时候发现界面js的计算,不能正常获值计算. 于是就开始找问题呗,先是发现这个二手项 ...
- API验证及AES加密
API验证 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快,会窃 ...
- hive:导出数据记录中null被替换为\n的解决方案
在hive中,一般情况下通过 use my_hive_db; set hive.merge.mapfiles=true; set hive.merge.mapredfiles=true; ; ; in ...
- Hibernate(四):Hello World
下载hibernate开发包: 在本章之前需要继承hibernate开发插件到eclipse,详细操作请参考我的博文:<Hibernate(一):安装hibernate插件到eclipse环境& ...
- [Kaggle] dogs-vs-cats之建立模型
建立神经网络模型,下面要建立的模型如下: (上图来源:训练网络时,打开tensorboard即可观察网络结构,在下一节模型训练的时候会讲到) 下面为具体步骤: Step 0:导入相关库 import ...