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的更多相关文章

  1. Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)

    听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 \(n\) 个点的树 , 每个节点有两个权值 \(a_i, b_i\) . 从 \( ...

  2. 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 ...

  3. Codeforces Round #463

    A - Palindromic Supersequence /* 题目大意:给出一个串,构造一个包含该串的回文串 */ #include <cstdio> #include <alg ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ----------------------------------------------------------我是分 ...

  8. 【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[ ...

  9. 【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) C】 Permutation Cycle

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] p[i] = p[p[i]]一直进行下去 在1..n的排列下肯定会回到原位置的. 即最后会形成若干个环. g[i]显然等于那个环的大 ...

随机推荐

  1. js最高效的数组去重方法

    var arr=[1,2,33,2,4,5,33,5,7,8,1,3];var result=[];var temp={};for( var i=0;i<arr.length;i++){ if( ...

  2. Safari不能保存session的处理方法

    在vue单页应用项目中,safari浏览器验证码登陆提示'验证码过期'或者验证码校验不通过的问题 原因:验证码存储在了session里,接着验证时又发起了一次会话,因为Safari不保存cookie, ...

  3. PHP方法之 substr

    简单描述: substr 主要用于字符串的截取,但是不适用于中文字符串,易出现乱码,中文字符串可使用mbstring. 方法申明: substr(string,start,length) string ...

  4. logging模块,程序日志模板

    6.11自我总结 1.logging模块 用于程序的运行日志 1.初级 #首先程序运行分会出现5中情况 1.logging.info('info') #程序正常运行级别为10 2.logging.de ...

  5. python--BOM和DOM

    一. 介绍 什么是BOM和DOM? 简要答案:BOM是浏览器对象模型,用来获取或设置浏览器的属性.行为,例如:新建窗口.获取屏幕分辨率.浏览器版本号等. DOM是文档对象模型,用来获取或设置文档中标签 ...

  6. python面向对象(C3算法)(六)

    1. 了解python2和python3类的区别 python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类 2. 经典类的MRO 树形结构的深度优先遍历 -> 树形结构遍历 cl ...

  7. 基础训练 FJ的字符串

    FJ的字符串 #include<iostream> #include<string.h> using namespace std; int main(){ string str ...

  8. IE浏览器部分js代码不生效的问题

    [小小坑记录] 问题描述:IE浏览器写好功能代码之后,在调试模式下程序能正常运行.不开启调试模式正常访问时js部分功能代码不生效. 原因:在测试时用了console对象在控制台输出一一些内容,而IE的 ...

  9. Disqus 升级到3.0以上版本的评论同步问题

    Disqus从2.*升级3.*时,Knowlege Base的文章不显示Disqus评论, 解决方法:在Disqus的Advanced Settings中勾选Render Comments JavaS ...

  10. vim 第三章 插入模式

    vim 第三章  插入模式 在普通模式下可以删除  复制   及粘贴的命令    在插入模式下也存在以中方便快捷的方式    能够粘贴寄存器中文本   两种方式来插入键盘上不存在的非常用字符 替换模式 ...