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. noip_最后一遍_2-图论部分

    大体按照 数学 图论 dp 数据结构 这样的顺序 模板集 这个真的只有模板了……………… ·spfa #include<bits/stdc++.h> using namespace std ...

  2. mysql 备份解密脚本

    #!/bin/bash #by sk 备份解码脚本 echo "-------------------------------------------------" functio ...

  3. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  4. ST3使用

    创建新的构建系统 Tools -> Build System -> New Build System... 输入类似的构建指令(首先清除当前的运行程序后再重新运行): { "sh ...

  5. simulation clock gen unit (推荐)

    //Normal Clock Block always begin:clk_blk clk <=; # clk<=; #; end //Improved Clock Block, impr ...

  6. Mac下的Eclipse不能记住工作空间问题

    每次启动eclipse都要选择工作空间,即使你勾选了"选择这个作为默认"也不行. Eclipse版本 4.5, mac os版本10.12 找到这个目录下的config.ini文件 ...

  7. unittest断言方法的使用

    unittest框架的TestCase类提供以下方法用于测试结果的判断 方法 检查 版本 assertEqual(a, b) a ==b   assertNotEqual(a, b) a !=b   ...

  8. next_permutation

    实验了一下next_permutation 代码如下 #include <cstdio> #include <cstdlib> #include <cstring> ...

  9. 九度oj 1480

    题目描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ...,aN),我们可以得到一些上升的子序列( ...

  10. vue v-dialogDrag: 弹窗拖拽

    Vue.directive('dialogDrag', { inserted:function(el) { const dragDom = el.querySelector('.jsPropupLay ...