【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)

题面

CF
洛谷

题解

吼题啊。
对于每个边,我们用一个 map m a p 维护它出现的时间,
发现询问单点,边的出现时间是区间,所以线段树分治。
既然路径最小值就是异或最小值,并且可以不是简单路径,
不难让人想到 WC2011 W C 2011 那道最大 Xor X o r 路径和。
用一样的套路,我们动态维护一棵生成树,碰到一个非树边,
就把这个环的异或和丢到线性基里面去,这样子直接查就好了。
动态维护生成树直接用并查集就好了,没有必要 LCT L C T
大概就是永远不进行路径压缩,每次启发式合并。
询问的时候暴跳父亲。
然后撤销操作的话,维护一个栈,每次存下当前的修改操作,
撤销的时候倒序还原就好了。
细节很多,第一次写这样的东西,调了好久啊。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define MAX 200200
#define ll long long
#define pi pair<int,int>
#define mp(x,y) make_pair(x,y)
#define lson (now<<1)
#define rson (now<<1|1)
inline int read()
{
    int x=0;bool t=false;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
struct xxj
{
    int p[31];
    void insert(int x)
        {
            for(int i=30;~i;--i)
                if(x&(1<<i))
                {
                    if(!p[i]){p[i]=x;break;}
                    x^=p[i];
                }
        }
    int Query(int x){for(int i=30;~i;--i)x=min(x,x^p[i]);return x;}
}G;
struct Node{int u,v,w;}p[MAX<<1];
pi q[MAX];
int n,m;
map<pi,int> M;
vector<Node> seg[MAX<<2];
void Modify(int now,int l,int r,int L,int R,Node e)
{
    if(L>R)return;if(L<=l&&r<=R){seg[now].push_back(e);return;}
    int mid=(l+r)>>1;
    if(L<=mid)Modify(lson,l,mid,L,R,e);
    if(R>mid)Modify(rson,mid+1,r,L,R,e);
}
int tim,cnt,L[MAX<<1],R[MAX<<1];
int f[MAX],sz[MAX],Xor[MAX];
int getf(int x){while(x!=f[x])x=f[x];return x;}
int getxor(int x){int ret=0;while(x!=f[x])ret^=Xor[x],x=f[x];return ret;}
void Divide(int now,int l,int r,xxj G)
{
    vector<Node> c;c.clear();
    for(int i=0,lim=seg[now].size();i<lim;++i)
    {
        int u=seg[now][i].u,v=seg[now][i].v,w=seg[now][i].w;
        int f1=getf(u),f2=getf(v);
        if(f1==f2)G.insert(getxor(u)^getxor(v)^w);
        else
        {
            if(sz[f1]>sz[f2])swap(f1,f2),swap(u,v);
            w^=getxor(v)^getxor(u);
            c.push_back((Node){f1,f2,sz[f2]});
            Xor[f1]=w;f[f1]=f2;sz[f2]+=sz[f1];
        }
    }
    if(l==r)
        printf("%d\n",G.Query(getxor(q[l].first)^getxor(q[l].second)));
    else
    {
        int mid=(l+r)>>1;
        Divide(lson,l,mid,G);Divide(rson,mid+1,r,G);
    }
    for(int i=c.size()-1;~i;--i)
    {
        int u=c[i].u,v=c[i].v,w=c[i].w;
        sz[v]=w;f[u]=u;Xor[u]=0;
    }
}
int main()
{
    //freopen("938G.in","r",stdin);
    //freopen("938G.out","w",stdout);
    n=read();m=read();
    for(int i=1;i<=m;++i)
    {
        int x=read(),y=read(),w=read();
        p[++cnt]=(Node){x,y,w};
        L[cnt]=1;M[mp(x,y)]=cnt;R[cnt]=-1;
    }
    int Q=read();
    for(int i=1;i<=Q;++i)
    {
        int opt=read(),x=read(),y=read();
        if(x>y)swap(x,y);
        if(opt==1)
        {
            p[++cnt]=(Node){x,y,read()};
            L[cnt]=tim+1;R[cnt]=-1;M[mp(x,y)]=cnt;
        }
        else if(opt==2)R[M[mp(x,y)]]=tim;
        else q[++tim]=mp(x,y);
    }
    for(int i=1;i<=cnt;++i)if(R[i]==-1)R[i]=tim;
    for(int i=1;i<=cnt;++i)Modify(1,1,tim,L[i],R[i],p[i]);
    for(int i=1;i<=n;++i)f[i]=i,sz[i]=1;
    Divide(1,1,tim,G);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Practice 1 Date: Monday, March 18th, 2013 We highly encourage being environment friendly and trying all problems on your own. Implement exercise 2.3-7. Implement priority queue. Implement Quicksort and answer the following questions. (1) How many comparisons will Quicksort do on a list of n elements that all have the same value? (2) What are the maximum and minimum number of comparisons will Quicksort do on a list of n elements, give an instance for maximum and minimum case respectively. Give a divide and conquer algorithm for the following problem: you are given two sorted lists of size m and n, and are allowed unit time access to the ith element of each list. Give an O(lg m + lgn) time algorithm for computing the kth largest element in the union of the two lists. (For simplicity, you can assume that the elements of the two lists are distinct). Practice 2 Date: Monday, April 1st, 2013 We highly encourage being environment friendly and trying all problems on your own. Matrix-chain product. The following are some instances. Longest Common Subsequence (LCS). The following are some instances. X: xzyzzyx Y: zxyyzxz X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD Y:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG Longest Common Substring. The following are some instances. X: xzyzzyx Y: zxyyzxz X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD Y:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG Max Sum. The following is an instance. (-2,11,-4,13,-5,-2) Shortest path in multistage graphs. Find the shortest path from 0 to 15 for the following graph.   A multistage graph is a graph (1) G=(V,E) with V partitioned into K >= 2 disjoint subsets such that if (a,b) is in E, then a is in Vi , and b is in Vi+1 for some subsets in the partition; and (2) | V1 | = | VK | = 1.     Practice 3 Date: Monday, April 15th, 2013 We highly encourage being environment friendly and trying all problems on your own. Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem both as fractional knapsack and 0/1 knapsack. A simple scheduling problem. We are given jobs j1, j2… jn, all with known running times t1, t2… tn, respectively. We have a single processor. What is the best way to schedule these jobs in order to minimize the average completion time. Assume that it is a nonpreemptive scheduling: once a job is started, it must run to completion. The following is an instance. (j1, j2, j3, j4) : (15,8,3,10) Single-source shortest paths. The following is the adjacency matrix, vertex A is the source.  A B C D E A -1 3 B 3 2 2 C D 1 5 E -3 All-pairs shortest paths. The adjacency matrix is as same as that of problem 3.(Use Floyd or Johnson’s algorithm)     Practice 4 Date: Monday, May 8th, 2013 We highly encourage being environment friendly and trying all problems on your own. 0/1 Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem using back-tracking algorithm and try to draw the tree generated. Solve the 8-Queen problem using back-tracking algorithm.    

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值