• 【YbtOJ#883】最大的割


    题目

    题目链接:https://www.ybtoj.com.cn/contest/118/problem/3

    (nleq 500,m,Lleq 1000)(L) 表示边权二进制下位数最大值。

    思路

    我们设一个点的点权为它所连接的边的边权异或和。这样一个割的异或和就与一个点集的点权异或和等价了。
    我们需要知道任意时刻的线性基。由于线性基不好删除,考虑采用离线算法。事实上这道题有在线支持线性基删除的做法,没听懂 /kel。
    因为每一个点的点权可以划分成若干个区间且每个区间的点权相同,所以我们可以把每一个点在不同时间的点权映射到线段树上。然后线段树分治,在每一层新开一个线性基,从父亲的线性基那里复制信息过来,然后再插入这个区间的点的点权。到达叶子节点后线性基查询最大值即可。
    由于所有点划分成的区间总数是 (O(n+m)) 的,所以线性基用 bitset 时间可以优化到 (O(frac{mLlog n+m^2L}{omega}))。空间 (O(frac{mLlog m}{omega}))

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N=1010;
    int n,m,last[N];
    char ch[N];
    bitset<N> sav,val[N];
    
    struct Xor
    {
    	bitset<N> d[N];
    	
    	void ins(bitset<N> x)
    	{
    		for (int i=N-1;i>=0;i--)
    			if (x[i])
    			{
    				if (!d[i][i]) { d[i]=x; return; }
    				x^=d[i];
    			}
    	}
    	
    	void query()
    	{
    		bitset<N> res;
    		for (int i=N-1;i>=0;i--)
    			if (!res[i]) res^=d[i];
    		int i=N-1;
    		while (i && !res[i]) i--;
    		for (;i>=0;i--) printf("%d",(int)res[i]);
    		printf("
    ");
    	}
    }a[N];
    
    struct SegTree
    {
    	vector<bitset<N> > b[N*4];
    	
    	void update(int x,int l,int r,int ql,int qr,int k)
    	{
    		if (ql>qr) return;
    		if (ql<=l && qr>=r)
    		{
    			b[x].push_back(val[k]);
    			return;
    		}
    		int mid=(l+r)>>1;
    		if (ql<=mid) update(x*2,l,mid,ql,qr,k);
    		if (qr>mid) update(x*2+1,mid+1,r,ql,qr,k);
    	}
    	
    	void solve(int dep,int x,int l,int r)
    	{
    		for (int i=0;i<N;i++)
    			a[dep].d[i]=a[dep-1].d[i];
    		for (int i=0;i<b[x].size();i++)
    			a[dep].ins(b[x][i]);
    		if (l==r) { a[dep].query(); return; }
    		int mid=(l+r)>>1;
    		solve(dep+1,x*2,l,mid);
    		solve(dep+1,x*2+1,mid+1,r);
    	}
    }seg;
    
    int main()
    {
    	freopen("cut.in","r",stdin);
    	freopen("cut.out","w",stdout);
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++) last[i]=1;
    	for (int i=1,x,y;i<=m;i++)
    	{
    		scanf("%d%d%s",&x,&y,ch);
    		seg.update(1,1,m,last[x],i-1,x);
    		seg.update(1,1,m,last[y],i-1,y);
    		last[x]=last[y]=i;
    		int len=strlen(ch);
    		sav=0;
    		for (int j=0;j<len;j++) sav[j]=ch[len-j-1]-48;
    		val[x]^=sav; val[y]^=sav;
    	}
    	for (int i=1;i<=n;i++)
    		seg.update(1,1,m,last[i],m,i);
    	seg.solve(1,1,1,m);
    	return 0;
    }
    
  • 相关阅读:
    pytest文档29-allure-pytest(最新最全,保证能搞成功!)
    使用 JMeter 进行压力测试
    web自动化针对PO模式进行二次封装之basepage
    关于面试总结-http协议相关面试题 -----转载
    移动APP测试基础分享
    基于python+requests+unittest框架接口自动化测试设计开发
    jmeter断言接口响应字段大小
    csv文件转换为xlsx文件
    钉钉机器人发群消息笔记
    docker学习笔记
  • 原文地址:https://www.cnblogs.com/stoorz/p/14416410.html
Copyright © 2020-2023  润新知