C. 【lxs Contest #140】Cac

【题意】

【题解】

仙人掌,考虑圆方树。

正常构建圆方树并在每两个树边之间加入方点。

考虑使用每个方点维护与他相连的圆点信息,发现每个方点只能维护他的儿子圆点信息,否则会算重。

题目中修改操作即将两个圆点在新树上的路径上方点都加上v,即表示路径上所有环上的圆点都加v。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e5+5;
const int mo=998244353;
int n,m,q,last[N],size,dfn[N],low[N],siz,dui[N],ans[N],size1,last1[N],dax[N],f[N][20],len,cnt,st[N],toptop,Dfn[N],gaga;
struct pigu
{
    int dao,ne;
}a[N<<3],b[N<<2];
inline void lingjiebiao(int x,int y)
{
    a[++size].dao=y;
    a[size].ne=last[x];
    last[x]=size;
}
inline void lingjiebiao2(int x,int y)
{
    b[++size1].dao=y;
    b[size1].ne=last1[x];
    last1[x]=size1;
}
inline int jia(int x,int y)
{
    return (((x+y)%mo)+mo)%mo;
}
inline int read()
{
    char c=getchar();
    int x=0,f=1;
    while(!isdigit(c)) {if(c==‘-‘) f=-1;c=getchar();}
    while(isdigit(c)) {x=(x<<3)+(x<<1)+c-‘0‘;c=getchar();}
    return x*f;
}
inline void tarjan(int now,int fa)
{
    dfn[now]=low[now]=++cnt;
    st[++toptop]=now;
    for(int i=last[now];i;i=a[i].ne)
    {
        if(dfn[a[i].dao]==0)
        {
            tarjan(a[i].dao,now);
            low[now]=min(low[now],low[a[i].dao]);
            if(low[a[i].dao]==dfn[now])
            {
                int k;
                ++siz;
                do
                {
                    k=st[toptop--];
                    lingjiebiao2(k,siz);
                    lingjiebiao2(siz,k);
                }while(k!=a[i].dao);
                lingjiebiao2(now,siz);
                lingjiebiao2(siz,now);
            }
        }
        else
            low[now]=min(low[now],dfn[a[i].dao]);
    }
}
int dep[N],sh[N],Siz[N];
inline int lowbit(int x)
{
    return x&(-x);
}
inline void modify(int zai,int zhi)
{
    for(int i=zai;i<=siz;i+=lowbit(i)) sh[i]=jia(sh[i],zhi);
}
inline int dquery(int x)
{
    int ha=0;
    for(int i=x;i;i-=lowbit(i)) ha=jia(ha,sh[i]);
    return ha;
}
inline int query(int x)
{
    return dquery(Dfn[x]+Siz[x]-1)-dquery(Dfn[x]-1)+mo;
}
inline void dfs(int now,int fa)
{
    f[now][0]=fa;dep[now]=dep[fa]+1;Dfn[now]=++gaga;Siz[now]=1;
    for(int i=1;f[f[now][i-1]][i-1];i++) f[now][i]=f[f[now][i-1]][i-1];
    for(int i=last1[now];i;i=b[i].ne)
    {
        if(b[i].dao==fa) continue;
        dfs(b[i].dao,now);
        Siz[now]+=Siz[b[i].dao];
    }
}
inline int get_lca(int x,int y)
{
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=19;i>=0;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
    if(x==y) return x;
    for(int i=19;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
    return f[x][0];
}
signed main()
{
//    freopen("cac.in","r",stdin);
    //freopen("cac.out","w",stdout);
    n=read();m=read();q=read();
    for(int i=1,x,y;i<=m;i++)
    {
        x=read();y=read();
        lingjiebiao(x,y);
        lingjiebiao(y,x);
    }siz=n;
    tarjan(1,0);
    dfs(1,0);
    for(int i=1,x,y,z,v;i<=q;i++)
    {
        x=read();y=read();
        if(x==0)
        {
            z=read();v=read();
            int lca=get_lca(y,z);
            modify(Dfn[y],v);
            modify(Dfn[z],v);
            modify(Dfn[lca],mo-v);
            if(f[lca][0]) modify(Dfn[f[lca][0]],mo-v);
            if(lca>n) ans[f[lca][0]]=jia(ans[f[lca][0]],v);
            else ans[lca]=jia(ans[lca],v);
        }
        else
        {
            int daan=jia(ans[y],f[y][0]?query(f[y][0]):0);
            cout<<daan<<"\n";
        }
    }
}

注意如果lca是圆点,则需将该圆点答案单独加上v,因为维护他的方点没法加。

查询即查询该点本身及他的父亲方点的权值即可,使用树链剖分或树上差分即可。

代码如下:

原文地址:https://www.cnblogs.com/betablewaloot/p/12210697.html

时间: 2024-08-30 14:49:31

C. 【lxs Contest #140】Cac的相关文章

floj 2265 【lxs Contest #141】航海舰队

首先抠出包围了阵形的最小矩形. 将地图拉伸成一条链,即将第一行.第二行.第三行按顺序连接.阵形也可以用同样的方法处理. 那么问题转化为,给定两个 01 串 S 和 T,问每个 S 中长度为 |T| 的子串是否存在 一个点,两个串对应字符都是 1. 将 T 串翻转,那么就变成了卷积的形式,FFT 计算即可. 在 BFS 求出所有可行的位置之后,对于答案的计算,也是卷积的形式,用 FFT 加速即可. 时间复杂度 O(nm log(nm)) 原文地址:https://www.cnblogs.com/b

【谜客帝国】第140届兰萱联想专场(2018.10.30)

 [谜客帝国]第140届兰萱联想专场(2018.10.30) 主持:瓷   计分:默沫 1.沧海桑田.抱布贸丝.金兵撼山.吹灰之力(一字)易 2.云长拒豪宅.逃出囹圄来.红杏春意闹.破门阖又开(三字)关不住 3.浅尝辄止.滑稽出演.少年之行.不大喝茶(二字)小品 4.余高阳之苗裔兮.滕王阁主今何在.董卓废之立新君.古诗有云君不见(二字)少帝 5.匈奴鲜卑并川渝.顽皮妖宝憨态掬.因何前倨后恭也.似闻主动点炮语(二字)胡巴 6.正是阿堵物.三强皆出色.一掷千金者.实乃囊羞涩(三字)不差钱 7.上书帝

【Codeforces:从头开始】contest 1

[Codeforces:从头开始]contest 1      1A      用 a × a 的石板覆盖 n × m 的长方形广场,允许石板覆盖的区域超出广场,不允许打破石板,石板的两侧应平行于广场两侧,要求覆盖完广场所需的石板数量最少是多少 样例图示: (显然,答案为每边必须铺的+铺出去(1个或0个)) 注意开 long long 代码: #include<bits/stdc++.h> using namespace std; typedef long double ld; typedef

HDU4081 Qin Shi Huang&#39;s National Road System【Kruska】【次小生成树】

Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3979    Accepted Submission(s): 1372 Problem Description During the Warring States Period of ancient China(4

【Sprint3冲刺之前】日历表的事件处理和管理(刘铸辉)

我的Sprint2冲刺--日历表的事件处理和管理(刘铸辉,刘静) 我的Sprint2冲刺计划领到的任务是和静姐结对编程,完成日历表的事件处理和管理,下面详细讲解下技术细节. 1.设计结构图 首先要画出整个UI设计图,方便理解这个日历布局和日历样式的绘制. 这里总共分解为两个 View 文件: 1:calender_main.xml(Calender.java用来绘制日历表和日历表中的事件) 作为启动的主画面,新建项目时,首先生成. schedule_toptext:用来显示年月日,闰几月,年份和

【.Net设计模式系列】工作单元(Unit Of Work)模式 ( 二 )

回顾 在上一篇博客[.Net设计模式系列]仓储(Repository)模式 ( 一 ) 中,通过各位兄台的评论中,可以看出在设计上还有很多的问题,在这里特别感谢 @横竖都溢 @ 浮云飞梦 2位兄台对博文中存在的问题给予指出,并提供出好的解决方案,同时也感谢其他园友的支持.欢迎各位园友对博文中出现的错误或者是设计误区给予指出,一方面防止“误人子弟”,另一方面则可以让大家共同成长. 对于上一篇博客,只是给大家提供了一种对于小型项目数据访问层的一种实现方式,通过Sql语句和传递参数来实现CRUD.并未

【最后的冲刺】android中excel表的导入和数据处理

[最后的冲刺]android中excel表的导入和数据处理 --学校课程的查询和修改 1.编写 The Class类把课程表courses.db当做一个实体类,hashcode和equals这两个类是为了判断输入的查询内容和Excel表中的内容是否一致. 并在java里面区别两个对象是否一致 1 public class TheClass { 2 private String classname; 3 private String type; 4 private String teacher;

【单页应用】view与model相关梳理

前情回顾 根据之前的学习,我们形成了一个view与一个messageCenterview这块来说又内建了一套mvc的东西,我们这里来理一下首先View一层由三部分组成:① view② dataAdpter③ viewController view一块两个重要数据是模板以及对应data,一个状态机status这里view只负责根据状态取出对应的模板,而后根据传入的数据返回组装好的html这里一个view多种状态是什么意思呢?比如我有一个组件,但是里面有一圈数据是需要Ajax请求的,所以我的view

POJ2492 A Bug&#39;s Life 【并查集】

A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 29011   Accepted: 9451 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders