「NOI2014」购票

写完了后发现写的做法是假的...然后居然过了,然后就懒得管正解了。

发现需要维护凸包,动态加点,询问区间,强制在线

可以二进制分组搞,然后你发现在树上需要资瓷撤回,然后暴力撤回(雾

然后就被卡了

卡法,在\(2^k-1\)位置搞一朵菊花

先留坑,以后要是会了一些神奇的姿势就来搞

这题叉积会爆ll,坑


Code:

#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define ll long long
const int N=2e5+10;
using std::min;
template <class T>
void read(T &x)
{
x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
int head[N],to[N],Next[N],cnt;ll edge[N];
int n,t;
void add(int u,int v,ll w)
{
to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
}
struct Point
{
ll x,y;
Point(){}
Point(ll X,ll Y){x=X,y=Y;}
Point friend operator -(Point a,Point b){return Point(a.x-b.x,a.y-b.y);}
bool friend operator <(Point a,Point b){return a.x==b.x?a.y<b.y:a.x<b.x;}
};
long double Cross(Point a,Point b){return 1.0*a.x*b.y-1.0*a.y*b.x;}
std::vector<Point> s[N<<2],pot[N<<2],yuu;
void ins(int id,Point x)
{
int tot=s[id].size()-1;
while(tot>0&&Cross(s[id][tot]-s[id][tot-1],x-s[id][tot])<=0) --tot,s[id].pop_back();
s[id].push_back(x);
}
void build(int id)
{
yuu=pot[id];
std::sort(yuu.begin(),yuu.end());
s[id].clear();
for(int i=0;i<yuu.size();i++) ins(id,yuu[i]);
}
#define ls id<<1
#define rs id<<1|1
void add(int id,int l,int r,int p,Point ins)
{
pot[id].push_back(ins);
if(pot[id].size()==r+1-l) build(id);
if(l==r) return;
int mid=l+r>>1;
if(p<=mid) add(ls,l,mid,p,ins);
else add(rs,mid+1,r,p,ins);
}
void del(int id,int l,int r,int p)
{
pot[id].pop_back();
if(l==r) return;
int mid=l+r>>1;
if(p<=mid) del(ls,l,mid,p);
else del(rs,mid+1,r,p);
}
ll cal(Point a,ll k){return a.y-k*a.x;}
ll yuucute(int id,ll k)
{
int l=0,r=s[id].size()-1;
while(l<r)
{
int mid=l+r>>1;
if(cal(s[id][mid],k)>cal(s[id][mid+1],k)) l=mid+1;
else r=mid;
}
return cal(s[id][l],k);
}
ll query(int id,int L,int R,int l,int r,ll k)
{
if(l==L&&r==R) return yuucute(id,k);
int Mid=L+R>>1;
if(r<=Mid) return query(ls,L,Mid,l,r,k);
else if(l>Mid) return query(rs,Mid+1,R,l,r,k);
else return min(query(ls,L,Mid,l,Mid,k),query(rs,Mid+1,R,Mid+1,r,k));
}
int f[N][20],dep[N];ll fd[N][20];
int Find(int x,ll d)
{
for(int i=18;~i;i--)
if(fd[x][i]<=d)
d-=fd[x][i],x=f[x][i];
return dep[x];
}
ll ans[N],p[N],q[N],l[N];
void dfs(int now,ll d,int rp)
{
dep[now]=rp;
for(int i=1;i<=18;i++) f[now][i]=f[f[now][i-1]][i-1],fd[now][i]=fd[now][i-1]+fd[f[now][i-1]][i-1];
int lp=l[now]>=d?1:Find(now,l[now]);
ans[now]=query(1,1,n,lp,rp-1,p[now])+q[now]+d*p[now];
add(1,1,n,rp,Point(d,ans[now]));
for(int i=head[now];i;i=Next[i])
dfs(to[i],d+edge[i],rp+1);
del(1,1,n,rp);
}
int main()
{
read(n),read(t);
for(int i=2;i<=n;i++)
{
read(f[i][0]),read(fd[i][0]);
add(f[i][0],i,fd[i][0]);
read(p[i]),read(q[i]),read(l[i]);
}
add(1,1,n,1,Point(0,0));dep[1]=1;
for(int i=head[1];i;i=Next[i])
dfs(to[i],edge[i],2);
for(int i=2;i<=n;i++) printf("%lld\n",ans[i]);
return 0;
}

2019.2.22

「NOI2014」购票 解题报告的更多相关文章

  1. 「NOI2014」购票

    「NOI2014」购票 解题思路 先列出 \(dp\) 式子并稍微转化一下 \[ dp[u] =\min(dp[v]+(dis[u]-dis[v]) \times p[u] + q[u])) \ \ ...

  2. 「ZJOI2016」旅行者 解题报告

    「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...

  3. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  4. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  5. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

  6. 「HAOI2018」染色 解题报告

    「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...

  7. 「HNOI2016」最小公倍数 解题报告

    「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...

  8. 「SCOI2016」围棋 解题报告

    「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...

  9. 「SCOI2016」妖怪 解题报告

    「SCOI2016」妖怪 玄妙...盲猜一个结论,然后过了,事后一证,然后假了,数据真水 首先要最小化 \[ \max_{i=1}^n (1+k)x_i+(1+\frac{1}{k})y_i \] \ ...

随机推荐

  1. Java 中的String、StringBuilder与StringBuffer的区别联系(转载)

    1 String 基础 想要了解一个类,最好的办法就是看这个类的源代码,String类源代码如下: public final class String implements java.io.Seria ...

  2. Mysql 5.7 Windows 版本(zip)的安装简单过程

    1. 下载zip包 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-winx64.zip 2. 找一个目录解压缩 3. 简单进行安装: ...

  3. css3特殊图形(气泡)

    一.气泡 效果: body{ background: #dd5e9d; height: 100%; } .paopao { position: absolute; width: 200px; heig ...

  4. 剑指offer(15)

    题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 书中的思路: 按照这个思路我们很容易写出以下代码: import java.util.S ...

  5. js尾递归函数

    普通递归: function fac(n) { if (n === 1) return 1; return n * fac(n - 1); } fac(5) // 120 这是个阶乘.但是占用内存,因 ...

  6. python爬虫之线程池和进程池

    一.需求 最近准备爬取某电商网站的数据,先不考虑代理.分布式,先说效率问题(当然你要是请求的太快就会被封掉,亲测,400个请求过去,服务器直接拒绝连接,心碎),步入正题.一般情况下小白的我们第一个想到 ...

  7. Operation not allowed on a unidirectional dataset错误?

    关于网友提出的“ Operation not allowed on a unidirectional dataset错误?”问题疑问,本网通过在网上对“ Operation not allowed o ...

  8. PLSQL 错误问题:ora-12154:TNS:could not resolve the connect identifier

    错误问题: ORA-12154: TNS:could not resolve the connect identifier specified 即无法解析指定的连接,这说明缺少了一个环境变量,TNS_ ...

  9. LODOP.FORMAT格式转换【回调和直接返回值】

    Lodop中有一些格式转换函数,这些函数和其他众多函数一样,c-lodop需要使用回调函数On_Return返回,Lodop插件方式直接返回,通常混合部署,写法要兼容两个控件.可以用if (LODOP ...

  10. linux读取Windows的txt文件问题

    问题:Windows下生成的txt文件,在Linux下读取时会读取到多余字符(如: ^M) 原因:Windows和Linux下的换行符不一致 解决:在Linux代码中将多余字符去掉 ) buf = b ...