【NOIP2016】补题
今天突然想到自己居然还没把NOIP2016补完
简直是傻逼、、、
所以开始写
D1T1:模拟
D1T2:NOIP最难的一道题,首先求LCA
离线下,把观察员单独提出来
然后可以维护一个类似桶排序的东西
#include<bits/stdc++.h>
#define N 400010
using namespace std;
int n,m,top[N],wson[N],size[N],tot=,head[N],w[N],fa[N],d[N];
struct Edge{int u,v,next;}G[N<<],E[N<<];
int f[N<<],g[N<<],ans[N],ind[N][],out[N][];
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
int head1[N],tot2=;
inline void addedge2(int &u,int v){
E[++tot2].u=u;E[tot2].v=v;E[tot2].next=u;u=tot2;
}
inline void addquery(int t,int x,int y,int lca){
addedge2(ind[x][t],lca);
if(y>)addedge2(out[fa[y]][t],lca);
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
void dfs1(int u,int f){
size[u]=;
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==f)continue;
fa[v]=u;d[v]=d[u]+;
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[wson[u]])wson[u]=v;
}
}
void dfs2(int u,int tp){
top[u]=tp;if(wson[u])dfs2(wson[u],tp);
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==fa[u]||v==wson[u])continue;
dfs2(v,v);
}
}
inline int qlca(int x,int y){
while (top[x]!=top[y]){
if(d[top[x]]<d[top[y]])swap(x,y);
x=fa[top[x]];
}
if(d[x]>d[y])swap(x,y);return x;
}
void dfs3(int u){
ans[u]-=f[w[u]+d[u]]+g[w[u]-d[u]+N];
for(int i=ind[u][];i;i=E[i].next)f[E[i].v]++;
for(int i=out[u][];i;i=E[i].next)f[E[i].v]--;
for(int i=ind[u][];i;i=E[i].next)g[E[i].v+N]++;
for(int i=out[u][];i;i=E[i].next)g[E[i].v+N]--;
for(int i=head[u];i;i=G[i].next)if(G[i].v!=fa[u])dfs3(G[i].v);
ans[u]+=f[w[u]+d[u]]+g[w[u]-d[u]+N];
}
int main(){
n=read();m=read();
for(int i=;i<n;i++){addedge(read(),read());}
for(int i=;i<=n;i++)w[i]=read();
dfs1(,);dfs2(,);
for(int i=;i<=m;i++){
int x=read(),y=read(),lca=qlca(x,y);
if(d[x]-d[lca]==w[lca])ans[lca]--;
addquery(,x,lca,d[x]);addquery(,y,lca,d[x]-*d[lca]);
}
dfs3();
for(int i=;i<=n;i++)printf("%d ",ans[i]);puts("");
}
D1T3:其实是很简单的概率dp,但是转移的时候讨论比较恶心。
#include<bits/stdc++.h>
#define inf 1000000007
using namespace std;
int n,m,v,e,c[],d[];double dis[][];
double p[],dp[][][];
inline void floyed(){
for(int k=;k<=v;k++)
for(int i=;i<=v;i++)
for(int j=;j<=v;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();v=read();e=read();
for(int i=;i<=n;i++)c[i]=read();for(int i=;i<=n;i++)d[i]=read();
for(int i=;i<=n;i++)scanf("%lf",&p[i]);
for(int i=;i<=v;i++)for(int j=;j<=v;j++)if(i==j)dis[i][j]=;else dis[i][j]=inf;
for(int i=;i<=e;i++){
int u,v;double w;scanf("%d%d%lf",&u,&v,&w);
dis[u][v]=dis[v][u]=min(dis[u][v],w);
}
floyed();
for(int i=;i<=n;i++)for(int j=;j<=m;j++)dp[i][j][]=dp[i][j][]=inf;
dp[][][]=;dp[][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
dp[i][j][]=min(dp[i-][j][]+dis[c[i]][c[i-]],dp[i-][j][]+dis[c[i]][c[i-]]*(-p[i-])+dis[c[i]][d[i-]]*p[i-]);
if(j>){
double tmp1=,tmp2=;
tmp1=(dp[i-][j-][]+dis[d[i]][c[i-]])*p[i]+(dp[i-][j-][]+dis[c[i]][c[i-]])*(-p[i]);
tmp2=(dp[i-][j-][]+dis[d[i]][d[i-]]*p[i-]+dis[d[i]][c[i-]]*(-p[i-]))*p[i]+(dp[i-][j-][]+dis[c[i]][d[i-]]*p[i-]+dis[c[i]][c[i-]]*(-p[i-]))*(-p[i]);
dp[i][j][]=min(tmp1,tmp2);
}
}
double ans=inf;for(int i=;i<=m;i++)ans=min(ans,min(dp[n][i][],dp[n][i][]));
printf("%.2lf\n",ans);
}
D2T1:参见之前blog
D2T2:比较妙的一道题,证明完之后三个单调队列即可。
#include<bits/stdc++.h>
#define N 7100007
#define inf 0x7fffffff
using namespace std;
typedef long long ll;
int n,m,q,u,v,tot;
ll k,t,ans,x,y,delt;
ll Q[][N],l[],r[];
bool cmp(int x,int y){return x>y;}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();q=read();u=read();v=read();tot=read();
for(int i=;i<=m+n;i++)Q[][i]=Q[][i]=Q[][i]=-inf;
for(int i=;i<=n;i++)scanf("%lld",&Q[][i]);
sort(Q[]+,Q[]+n+,cmp);
l[]=,r[]=n;l[]=l[]=;r[]=r[]=;
for(int i=;i<=m;i++){
delt=-inf;for(int j=;j<=;j++)if(Q[j][l[j]]>delt)delt=Q[j][l[j]],k=j;
ll t=delt+(i-)*q;l[k]++;
if(i%tot==)printf("%lld ",t);
x=t*u/v;y=t-x;
Q[][++r[]]=x-i*q;
Q[][++r[]]=y-i*q;
}
puts("");
for(int i=;i<=m+n;i++){
delt=-inf;for(int j=;j<=;j++)if(Q[j][l[j]]>delt)delt=Q[j][l[j]],k=j;
t=delt+m*q;l[k]++;
if(i%tot==)printf("%lld ",t);
}
}
D2T3:状压dp,参考之前blog。
【NOIP2016】补题的更多相关文章
- hdu5017:补题系列之西安网络赛1011
补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- [数]补题ver.
上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...
- 4.30-5.1cf补题
//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...
- ICPC南京补题
由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...
- 2018 CCPC 桂林站(upc复现赛)补题
2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...
- 【cf补题记录】Codeforces Round #608 (Div. 2)
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
随机推荐
- hdu 3339 In Action (最短路径+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 1596 find the safest road (最短路径)
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Trie字典树的学习及理解
字典树详解见此 我这里学习时主要是看了李煜东的进阶指南里的讲解,以下是书中介绍的内容. Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构,Tire的每个节点都拥有若干个字符指针,若在插入 ...
- bzoj 1221: [HNOI2001] 软件开发 (网络流)
注意说如果直接从每天的新的连向旧的,那整个图的最大流还是不变,答案就一直会是Σni*f type arr=record toward,next,cap,cost:longint; end; const ...
- POJ1523:SPF——题解
http://poj.org/problem?id=1523 这题明显就是求割点然后求割完之后的强连通分量的个数. 割点都会求,怎么求割完的分量个数呢? 我们可以通过万能的并查集啊!(具体做法看代码吧 ...
- 关于PDO取得结果集的数据类型为string的问题
很久没写些什么了, 正好今天工作中遇到了以前在意过的问题. 之前曾注意到过,php从数据库中取得的结果集后,其中的字段全都会变成string类型.今儿通过ajax调取数据, 有一个type字段是int ...
- UVALive.3708 Graveyard (思维题)
UVALive.3708 Graveyard (思维题) 题意分析 这标题真悲伤,墓地. 在周长为1e4的圆周上等距分布着n个雕塑,现在要加入进来m个雕塑,最终还要使得这n+m个雕塑等距,那么原来的n ...
- bzoj3302&bzoj2447&bzoj2103(树的重心)
三倍的幸福! 暴力的做法就是枚举每一条边断开,选的两个点就是左右两棵树的重心. 可以发现找重心的时候一定是往权和大的子树找的,需要维护一个点的最大和次大子树,因为最大子树可能被割掉了,实际效率为O(N ...
- SRM13 T3 花六游鸟小(结论题)
哇这题是真的喵,HR智商太高辣 这题的难点就是看了题解之后怎么证明题解里的结论... 结论①:深度大于logm的点肯定能达到最大值 证明:显然一个西瓜的属性里0数量一半1数量一半我们取到的1数量最少, ...
- spring的RestTemplate使用指南
前言:现在restful接口越来越广泛,而如今很多接口摒弃了传统的配置复杂的webService开发模式,在java领域只需要很简单的springMvc就可以声明为一个控制器,再加上service层, ...