NOIP 模拟 $34\; \rm Equation$
题解 \(by\;zj\varphi\)
发现每个点的权值都可以表示成 \(\rm k\pm x\)。
那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x_v=s\)。
如果 \(x\) 项系数为 \(0\),那么就只需判断 \(\rm x_u+x_v=s\) 有无解。
若不为 \(0\),那么直接解出 \(x_1\) 并判断是否是小数即可。
修改操作就是对一段区间的值加或减,直接树状数组,复杂度 \(\mathcal O\rm((n+q)logn)\)
Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf;
    #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
    struct nanfeng_stream{
        template<typename T>inline nanfeng_stream operator>>(T &x) {
            ri f=0;x=0;register char ch=gc();
            while(!isdigit(ch)) f|=ch=='-',ch=gc();
            while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
            return x=f?-x:x,*this;
        }
    }cin;
}
using IO::cin;
namespace nanfeng{
    #define FI FILE *IN
    #define FO FILE *OUT
    template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
    template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
    typedef long long ll;
    static const int N=1e6+7;
    int first[N],dep[N],ld[N],rd[N],ww[N],n,q,tot,t=1,opt,u,v;
    ll W[N],s;
    struct BIT{
        #define lowbit(x) ((x)&-(x))
        ll c[N];
        inline void update(int x,ll k) {for (ri i(x);i<=n;i+=lowbit(i)) c[i]+=k;}
        inline ll query(int x) {
            ll res(0);
            for (ri i(x);i;i-=lowbit(i)) res+=c[i];
            return res;
        }
    }B;
    struct edge{int v,w,nxt;}e[N];
    inline void add(int u,int v,int w) {e[t].v=v,e[t].w=w,e[t].nxt=first[u],first[u]=t++;}
    void dfs(int x,ll w) {
        W[ld[x]=p(tot)]=w;
        for (ri i(first[x]),v;i;i=e[i].nxt) {
            dep[v=e[i].v]=dep[x]+1;
            if (dep[v]&1) dfs(v,w-e[i].w);
            else dfs(v,w+e[i].w);
        }
        rd[x]=tot;
    }
    inline int main() {
        //FI=freopen("nanfeng.in","r",stdin);
        //FO=freopen("nanfeng.out","w",stdout);
        cin >> n >> q;
        for (ri i(2),f;i<=n;p(i)) cin >> f >> ww[i],add(f,i,ww[i]);
        dfs(1,0);
        for (ri i(1),w;i<=tot;p(i)) w=W[i]-W[i-1],B.update(i,w);
        for (ri i(1);i<=q;p(i)) {
            cin >> opt;
            if (opt==2) {
                cin >> u >> s;
                if (dep[u]&1) B.update(ld[u],-s+ww[u]),B.update(rd[u]+1,s-ww[u]);
                else B.update(ld[u],s-ww[u]),B.update(rd[u]+1,-s+ww[u]);
                ww[u]=s;
            } else {
                cin >> u >> v >> s;
                ri jd(0);
                register ll tmp1=B.query(ld[u]),tmp2=B.query(ld[v]);
                if (dep[u]&1) --jd,tmp1*=-1ll;else p(jd);
                if (dep[v]&1) --jd,tmp2*=-1ll;else p(jd);
                if (!jd) {
                    if (tmp1+tmp2!=s) puts("none");
                    else puts("inf");
                } else if (jd==2) {
                    register ll ans=(s-tmp1-tmp2)>>1ll;
                    if ((ans<<1ll)+tmp1+tmp2==s) printf("%lld\n",ans);
                    else puts("none");
                } else {
                    register ll ans=(tmp1+tmp2-s)>>1ll;
                    if ((ans<<1ll)+s==tmp1+tmp2) printf("%lld\n",ans);
                    else puts("none");
                }
            }
        }
        return 0;
    }
}
int main() {return nanfeng::main();}
NOIP 模拟 $34\; \rm Equation$的更多相关文章
- NOIP 模拟 $34\; \rm Rectangle$
		
题解 \(by\;zj\varphi\) 对于没有在同一行或同一列的情况,直接枚举右边界,左边界从大到小,用树状数组维护上下边界即可. 而对于有多个在一列或一行的情况,这些点将左右分成了几个区间,枚举 ...
 - NOIP 模拟 $34\; \rm Merchant$
		
题解 \(by\;zj\varphi\) 对于选的物品,总值一定有在前一段区间递减,后一段递增的性质,那么就可以二分. check()时只递归归并大的一段,用nth_element即可 Code #i ...
 - noip模拟34[惨败]
		
noip模拟34 solutions 我从来不为失败找借口,因为败了就是败了,没人听你诉说任何事情 今天很伤感,以来考试没考好,二来改题改半天也改不出来 这次算是炸出来了我经常范的一些错误,比如除以0 ...
 - NOIP模拟 1
		
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
 - 2021.5.22 noip模拟1
		
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
 - NOIP模拟3
		
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...
 - 7.22 NOIP模拟7
		
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...
 - 20190725 NOIP模拟8
		
今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...
 - 20190902+0903合集-NOIP模拟
		
一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...
 
随机推荐
- Linux 命令行通配符及转义符的实现
			
我们想对一类文件批量操作,例如批量查看硬盘文件属性,那么正常命令会是: [root@linuxprobe ~]# ls /dev/sda [root@linuxprobe ~]# ls /dev/sd ...
 - QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置
			
引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...
 - varnish配置语言(1)
			
目录 1. vcl语法 1.1 主体语法 1.2 操作符 1.3 Subroutines 1.4 关键字 2. 内置的Subroutines 2.1 client-side vcl_recv vcl_ ...
 - Lua控制语句
			
目录 1. 控制结构 if-else 单个 if 分支 型 两个分支: if-else 型 多个分支: if-elseif-else型 2. while 型控制结构 3. repeat控制结构 4. ...
 - WORD加目录
			
1.WORD2010样式右下角小按钮,打开"样式"对话框,打开"管理样式"按钮 2.选择"标题1"--显示--上移(1) 3.依次再选择&q ...
 - C语言:随机数
			
在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌.在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机 ...
 - DEV C++自定义函数顺序与printf用法
			
#include <stdio.h> //int gys(int a,int b);//函数声明 int main() { int a = 520; int c1=98; int c2=5 ...
 - js学习-apply,call,bind的实现
			
目录 apply call bind demo apply 简单说:构建一个和调用aplly函数一样的字符串,用eval执行,完了之后删除掉,最后返回执行的结果. Function.prototype ...
 - 【字符串+排序】宇宙总统 luogu-1781
			
题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 分析 给字符串排个序. AC代码 #include & ...
 - 第七篇 -- photoshop cs6 激活
			
下载photoshop cs6破解版 下载amtlib.dll 破解就是将amtlib.dll替换,路径:C:\Program Files\Adobe\Adobe Photoshop CS6 (64 ...