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. 【Java基础】java中的反射机制与动态代理

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

  2. MySQL中的字符串

    MySQL的字符串是从1开始编号的,这与计算机编程语言有所不同,在MySQL中1代表第一个字符,-1代表最后一个字符,以此类推. MySQL中百分号“%”代表的是任意个字符,下划线“_”代表的是任意一 ...

  3. (32)zabbix分布式监控proxy vs nodes

    概述 zabbix为IT基础设施提供有效和可用的分布式监控,zabbix提供了两种解决方案,分别为:proxy和nodes.proxy代替zabbix server在本地检索数据,然后提交给zabbi ...

  4. zabbix:告警、恢复消息次数

    之前zabbix配置告警,存在告警信息发送多次并且恢复信息也跟着发送多次了,导致企业微信流量不够用,没有找到恢复信息单独的设置项 动作中的步骤我个人理解为:1-5的意思是发送5条告警消息      3 ...

  5. 在已编译安装nginx上动态添加模块

    一.添加nginx模块 找到安装nginx的源码根目录,如果没有的话下载新的源码 wget http://nginx.org/download/nginx-1.8.1.tar.gz 查看ngixn版本 ...

  6. Python中如何将数据存储为json格式的文件

    一.基于json模块的存储.读取数据 names_writer.py import json names = ['joker','joe','nacy','timi'] filename='names ...

  7. django第13天(auth组件,forms组件,中间件,csrf)

    django第13天(auth组件,forms组件) auth组件 -auth组件 -auth是什么? -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... -怎么用? -( ...

  8. 大数据学习——sql练习

    1. 现有如下的建表语句和数据: 建表语句 create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)row ...

  9. 【转】DCOM远程调用权限设置

    原文:https://blog.csdn.net/ervinsas/article/details/36424127 最近几天被搞得焦头烂额,由于DCOM客户端程序是在32位系统下开发的,调试时DCO ...

  10. 【JavaScript 1—基础知识点】:宏观概述

    导读:JavaScript是一门新的(也可以说是旧的或者半新语言),里面有很多的知识点都能和已有的知识产生共鸣.但是,虽然简单,相同点也有很多,也有不同点.我脑袋也不好使,所以对于我来说,还是有必要再 ...