codeforces #463
D(树上倍增)
题意:
刚开始有一个点1,权值为0。
接下来有q个操作,每个操作有两种:
1 R W:新加一个点,这个点的权值为W,这个点的父亲是R
2 R X:在从点R到1的路径上,取出从R开始的不降单调栈,问从栈底到栈顶这么多元素,最多能取出多少个点,使得这些点的点权和<=X
强制在线
q<=400000
分析:
虽然这个树的形态不是固定的,但仍旧可以倍增,因为每次加的都是叶子节点,对上面的形态是不改变的
我们可以先倍增求出每个点的最上方的不必它点权小的点fa
然后根据这个fa信息组成一个新的森林,再在这上面倍增去回答点权和<=X的询问
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5;
int fa[maxn+][],g[maxn+][];
ll mx[maxn+][],sum[maxn+][];
int dep[maxn+];
int n;
int last=;
int main()
{ int T;
scanf("%d",&T);
n=;
mx[][]=;
dep[]=;
while(T--)
{
int op;
long long r,w;
scanf("%d%lld%lld",&op,&r,&w); r^=last,w^=last;
//printf("operation : %d %lld %lld\n",op,r,w);
if(op==)
{
++n;
mx[n][]=w;
fa[n][]=r;
int x=fa[n][];
for(int i=;i>=;--i)
if(mx[x][i]<w) x=fa[x][i];
// if(n==3) printf("ce %d\n",x); //printf("ce %d %d\n",n,x);
for(int i=;i<=;++i)
{
mx[n][i]=max(mx[n][i-],mx[fa[n][i-]][i-]);
fa[n][i]=fa[fa[n][i-]][i-];
}
g[n][]=x;
dep[n]=dep[x]+;
sum[n][]=w;
for(int i=;i<=;++i)
{
sum[n][i]=sum[n][i-]+sum[g[n][i-]][i-];
g[n][i]=g[g[n][i-]][i-];
}
}
else
{
last=;
int x=r;
for(int i=;i>=;--i)
{
//printf("%d : %d ",i,sum[x][i]);
if(sum[x][i]<=w)
{
w-=sum[x][i];
x=g[x][i];
}
//printf("%d\n",x);
}
//printf("x %d\n",x);
last=dep[r]-dep[x];
printf("%d\n",last);
}
}
//printf("ce : %d\n",sum[2][0]);
return ;
}
E(斯特林数下降幂)
题意:

给定n,k,求这个式子的值n<=1e9,k<=5000
分析:
对于x^k这个可以用第二类斯特林数下降幂展开并化简,最后可以得出一个简单的式子
因为k比较小,所以可以直接递推求第二类斯特林数
#include<bits/stdc++.h>
using namespace std; const int N=,P=1e9+; int S[N][N]; inline int Pow(int x,int y){
int ret=;
for(;y;y>>=,x=1LL*x*x%P) if(y&) ret=1LL*ret*x%P;
return ret;
} inline int A(int n,int j){
int ret=;
for(int i=;i<j;i++)
ret=1LL*ret*(n-i)%P;
return ret;
} int main(){
S[][]=;
for(int i=;i<=;i++){
for(int j=;j<=i;j++)
S[i][j]=(S[i-][j-]+1LL*j*S[i-][j])%P;
}
int ans=;
int n,k; scanf("%d%d",&n,&k);
for(int j=;j<=k && j<=n;j++)
ans=(ans+1LL*S[k][j]*A(n,j)%P*Pow(,n-j))%P;
printf("%d\n",ans);
return ;
}
F(树上动态凸包)
题意:
有一个n个点的树,每个点有两个属性a和b,对于一个点u,dp[u]=min(dp[v]+a[u]*b[v]),其中v是u子树中的点,求出每个点的dp值
n<=100000
分析:
直接dp肯定会超时
这个如果不是树而是一条链,那是可以用凸包来优化的
如果是一颗树的话,那么自然而然想到就涉及到几个子树的凸包的合并
这个可以采取启发式合并,把小的凸包里的点往大的凸包里的点插,询问就在凸包上二分
凸包用set来维护
注意在set上二分的姿势
时间复杂度O(nlog^2n)
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
const int maxn=1e5;
typedef long long ll;
const ll inf=100000000000000000LL;
typedef pair<int,ll> Point;
ll a[maxn+],b[maxn+],dp[maxn+];
vector<int> g[maxn+];
int n;
set<Point> s[maxn+];
double cross(Point a,Point b,Point c)
{
ll x=b.first-a.first,y=b.second-a.second;
ll xx=c.first-b.first,yyy=c.second-b.second;
return (double)x*yyy-(double)y*xx;
}
void insert(set<Point> &s,Point p)
{
set<Point>::iterator it=s.lower_bound(p);
set<Point>::iterator jt=it;
if(it!=s.begin()) --jt;
if(it!=s.begin()&&it!=s.end()&&cross(*jt,p,*it)<=) return;
if(it!=s.begin())
{
it=jt;
while(it!=s.begin())
{
jt=it;
--jt;
if(cross(*jt,*it,p)<=) s.erase(it--);else break;
}
}
jt=s.lower_bound(p);
if(jt!=s.end()) it=jt++;
while(jt!=s.end())
{
if(cross(p,*it,*jt)<=) s.erase(it++);else break;
jt=it;
++jt;
}
s.insert(p);
}
ll query(set<Point> &s,ll k)
{
if(s.empty()) return ;
ll l=s.begin()->first,r=s.rbegin()->first,mid;
while(l<r)
{
mid=(l+r+)>>;
set<Point>::iterator it=s.lower_bound(mp(mid,-inf)),jt=it--;
if(k*(jt->first-it->first)>=jt->second-it->second) l=mid;else r=mid-;
}
Point res=*s.lower_bound(mp(l,-inf));
return (-k)*res.first+res.second;
}
void dfs(int k,int fa)
{
for(auto u:g[k])
{
if(u==fa) continue;
dfs(u,k);
if(s[k].size()<s[u].size()) s[k].swap(s[u]);
for(auto x:s[u])
insert(s[k],x);
set<Point>().swap(s[u]);
}
dp[k]=query(s[k],-a[k]);
insert(s[k],mp(b[k],dp[k])); }
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%lld",&a[i]);
for(int i=;i<=n;++i) scanf("%lld",&b[i]);
for(int i=;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v),g[v].push_back(u);
}
dfs(,);
for(int i=;i<=n;++i) printf("%lld ",dp[i]);
return ;
}
G(回文树)
待填坑
codeforces #463的更多相关文章
- Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)
听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 \(n\) 个点的树 , 每个节点有两个权值 \(a_i, b_i\) . 从 \( ...
- ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) A
2018-02-19 A. Palindromic Supersequence time limit per test 2 seconds memory limit per test 256 mega ...
- Codeforces Round #463
A - Palindromic Supersequence /* 题目大意:给出一个串,构造一个包含该串的回文串 */ #include <cstdio> #include <alg ...
- ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined)
靠这把上了蓝 A. Palindromic Supersequence time limit per test 2 seconds memory limit per test 256 megabyte ...
- Codeforces 932 C.Permutation Cycle-数学 (ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined))
C. Permutation Cycle time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Codeforces 932 B.Recursive Queries-前缀和 (ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined))
B. Recursive Queries time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Codeforces 932 A.Palindromic Supersequence (ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined))
占坑,明天写,想把D补出来一起写.2/20/2018 11:17:00 PM ----------------------------------------------------------我是分 ...
- 【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) D】Tree
[链接] 我是链接,点我呀:) [题意] 让你在树上找一个序列. 这个序列中a[1]=R 然后a[2],a[3]..a[d]它们满足a[2]是a[1]的祖先,a[3]是a[2]的祖先... 且w[a[ ...
- 【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) C】 Permutation Cycle
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] p[i] = p[p[i]]一直进行下去 在1..n的排列下肯定会回到原位置的. 即最后会形成若干个环. g[i]显然等于那个环的大 ...
随机推荐
- tp5对接支付宝支付简单集成
对于每个刚开始工作的新手来说,无论支付宝支付还是微信支付都是跑不掉的一个小门槛. 在加上本人比较技术比较渣(比较懒导致的),不太喜欢引用那么大的SDK,于是就简单集成了一下支付宝的支付. 但也只是只有 ...
- SpringMVC+Spring+Mybatis整合程序之整合
因为每个人思路不一样,所以我在这边先分享自己的思路对于mybatis开发持久层(DAO:DataBase Access Object 持久层访问对象)有两种.第一种:传统的开发持久层方式即需要程序员开 ...
- javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)
一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现T ...
- iOS Crash
常见原因及解决方法: 1. 访问数组类对象越界或插入了空对象NSMutableArray/NSMutableDictionary/NSMutableSet 等类下标越界,或者 insert 了一个 n ...
- 对于WebAssembly编译出来的.wasm文件js如何调用
WebAssembly也叫浏览器字节码技术 这里就不过多的解释了网上很多介绍 主要是让大家知道在js里面如何调用执行它,我之前看WebAssemblyAPI时候反正是看得一脸懵逼 也是为了大家能更快的 ...
- vue axios 请求本地接口端口不一致出现跨域设置代理
首先在config下面的index.js,设置跨域代理 在axios请求的时候 用'/api/' 替代baseURL 最重要的就是设置完必须重新 npm run dev 否则不生效
- 【模板】任意模数NTT
题目描述: luogu 题解: 用$fft$水过(什么$ntt$我不知道). 众所周知,$fft$精度低,$ntt$处理范围小. 所以就有了任意模数ntt神奇$fft$! 意思是这样的.比如我要算$F ...
- windows 下phpstudy 升级mysql版本5.7
今天在导入sql文件的时候遇到了sql执行错误.最后找到原因是因为mysql版本过低,导致出错 原因:在执行sql的时候出现了两次CURRENT_TIMESTAMP ,最后得知在5.7版本之前都是不支 ...
- (49)zabbix事件是什么?事件来源有哪些分类
什么是zabbix 事件 在trigger的文章内,我们已经有用到事件,这个事件要讲概念真心不知道怎么说,就拿trigger事件来说,如果trigger从当前值ok转变为problem,那么我们称之为 ...
- 九:SQL之DQL数据查询语言多表操作
前言: 一:数据准备 员工表emp 和部门表 dept 注意:我在录入员工表的时候,特意添加了两条没有部门的员工,他们的部门id对应为null; --分别创建部门和员工表,并实现一对多关系 DROP ...