首页 > 其他分享 >[luogu P11189] 水杯降温

[luogu P11189] 水杯降温

时间:2024-11-01 10:49:07浏览次数:1  
标签:int luogu mid 水杯 while read P11189 getchar define

纯粹是自己太唐导致的

我们发现其实这两种操作是独立的,并不需要考虑操作的相对顺序。

这时候就有两种解决顺序:

  1. 先子树加再链减

  2. 先链减再子树加

由于我一开始看错题了,所以我选了第一种思路,然后就爆炸了。

所以我们选第二种,钦定 \(d_x = a_{fa_x} - a_x\),那么最后子树加的时候要保证的就是 \(d_x \ge 0\) 且 \(a^{'}_1 \le 0\)

我们考虑维护一个 \(g_x\) 表示 \(x\) 节点最多能被减多少次,然后我们就二分找到最多能减的次数即可。

具体来说就是考虑减 \(mid\) 次,其中 \(v\) 最多只能被减 \(g_v\) 次。

我们每操作一次,除了选的减的那个值之外其他的的 \(d_v\) 都会减 \(1\)。

所以再转换一下就变成了所有 \(d_v\) 都被减了 \(mid\) 次,你每次操作选择一个 \(d\) 加 \(1\),使得 \(\forall_v,d_v \ge 0\),且对于每个 \(v\) 最多操作 \(g_v\) 次。

这样就可以二分了。

点击查看代码
#include<bits/stdc++.h>
#define fir first
#define sec second
#define int long long
#define lowbit(x) x&(-x)
#define mkp(a,b) make_pair(a,b)
using namespace std;
typedef pair<int,int> pir;
inline int read(){
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
	while(isdigit(c)){x=x*10+(c^48); c=getchar();}
	return x*f;
}
const int inf=1e13,N=1e5+5;
int C;
int T;
int n,a[N],fa[N];
vector<int> ed[N];

int g[N];
inline bool chk(int x,int val){
    int sum=0;
    for(auto v:ed[x]){
        int num=a[x]-a[v]-val;
        if(num>=0) continue;
        if(g[v]<-num) return 0;
        sum-=num;
    }
    return sum<=val;
}
inline void dfs(int x){
    if(ed[x].empty()){g[x]=inf; return ;}
    int l=0,r=0;
    for(auto v:ed[x]) dfs(v),r+=g[v];
    while(l<=r){
        int mid=(l+r)>>1;
        if(chk(x,mid)) g[x]=mid,l=mid+1;
        else r=mid-1;
    }
}

inline void solve(){
    n=read();
    for(int i=1;i<=n;i++) ed[i].clear();
    for(int i=2;i<=n;i++) fa[i]=read(),ed[fa[i]].push_back(i);
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=2;i<=n;i++) if(a[fa[i]]<a[i]){puts("Shuiniao"); return ;}
    dfs(1);
    if(g[1]>=a[1]){puts("Huoyu"); return ;}
    puts("Shuiniao");
}
signed main(){
    // freopen("water.in","r",stdin);
    // freopen("water.out","w",stdout);
    C=read();
    T=read();
    while(T--) solve();
}

标签:int,luogu,mid,水杯,while,read,P11189,getchar,define
From: https://www.cnblogs.com/Cyan0826/p/18519719

相关文章

  • LUOGU_进阶算法思想
    进阶算法思想单调数据结构单调队列,单调栈都是均摊\(O(1)\),是不支持撤销的,只能按照正常过程加入。单调栈求最近的大于小于其的值CF280BMaximumXorSecondary:枚举最大值,次大值并不容易确定,但枚举次大值的位置,这样最大值就是其左右两边第一个比其大的值,用单调栈可求出。其实就......
  • LUOGU_图论
    LUOGU_图论ST表+DFN序LCA每次在自己的DFN序位置放入自己的父亲询问的时候l+1ST表+欧拉序LCA\(u,v\)在欧拉序中的第一个位置之间的深度最小位置就是LCA树的直径相距最远的两个点\(\max_{u,v}dis(u,v)=\max_{u,v}(dep_u+dep_v-2dep_{lca(u,v)})\)边权非负:两次BFS边权有......
  • LUOGU_进阶数据结构
    LUOGU_进阶数据结构二叉堆P10977CuttheSequence:因为DP的值是单调递增的,所以可能的决策点只有最远的合法位置与那些后缀最大值段的左端点,用单调队列+可删除堆(懒标记)做。如果\(\exista<0\),怎么做?CDQ优化DP,可以做!!并查集P10350ModernizacjaBajtocji:把二选一的居民放进一......
  • Luogu 的脚本
    1. extend-luogu//==UserScript==//@nameextend-luogu//@namespacehttp://tampermonkey.net///@descriptionMakeluogumorepowerful.//@description:zh使洛谷拥有更多功能//@iconhttps://raw.fastgit.org/extend-luogu/extend-lu......
  • P11189 「KDOI-10」水杯降温
    P11189「KDOI-10」水杯降温-洛谷|计算机科学教育新生态(luogu.com.cn)庆贺吧,第一个真正意义上的自己干出来的紫题。总用时4h。时间复杂度\(O(n\logn)\),对于每个点我们去找它可以吹气的最大次数和最小次数。如果一个点的最小次数大于它的最大次数,或者在计算父节点u最......
  • luogu P3842 [TJOI2007] 线段
    link好题,考虑如何设定状态。设\(dp_{i,0/1}\)表示到了第\(i\)行走完后停在这一行的最左侧/最右侧。设定\(l_i\)表示这一行该线段的最左侧,\(r_i\)表示这一行的最右侧。思考如何转移。1.当我处在这一行的最左侧时,我需要从这一行的右端点转移过来,所以你的贡献要加上这个线段的长......
  • luogu 模拟赛
    A.带余除法我们不难考虑找出\(q\)的上下界,不难发现范围是\([\lfloor\frac{n}{k+1}\rfloor+1,\lfloor\frac{n}{k}\rfloor]\)。当然这个区间可能为空。只需算出区间长度即可。B.奖牌排序不难考虑到分别按照三个关键字排序,然后对于每个小朋友找到每个关键字下的排名(同分取第一......
  • [lnsyoj2378/luoguAT_arc107_d]Number of Multisets
    题意给出两个正整数\(N,K\),求有多少有理数集满足以下所有条件集合有且只有\(N\)个元素,并且元素和为\(K\);每个元素须可表示为\( \frac{1}{2^{i}}\) $(i\inN)$.sol考虑dp,容易想到记\(f_{i,j}\)表示选\(i\)个数恰好和为\(j\)考虑到会出现诸如\(\dfrac{1}......
  • Luogu P5663 CSP-J2019 加工零件 题解 [ 绿 ] [ 同余最短路 ]
    加工零件:非常好的一道图论题。CCF普及组的题目大概也只有图论出的比较巧妙了。题意简述:给你一张无向图,\(q\)次询问,判断是否存在一条从\(a\)到\(1\)且长度为\(L\)的路径。看到\(L\)很大,我们立刻想到了要撇开\(L\)的限制思考问题。首先,对于一条路径,我们肯定能找到从......
  • 题解:Luogu CF548A Mike and Fax
    CF548AMikeandFax题解题面翻译给定一个字符串和一个整数\(k\),问是不是恰好存在\(k\)个子字符串是回文串,并且所有子字符串的长度一样长。题目上说有\(k\)个子字符串,我们就可以把字符串分成\(k\)份,如果分不成\(k\)份(也就是说长度不是\(k\)的倍数)的话,直接输出NO。......