设每个点的权值为和它相连的所有边的权值的异或和,那么等价于选若干个点,使得点权异或和最大,这显然只需要维护一组线性基,然后从高位到低位贪心选取即可。

对于本题,因为有修改操作,所以考虑按时间分治,并用bitset加速,时间复杂度$O(\frac{m\log mL^2}{64})$。

针对插入操作,可以用Four Russian Method进一步优化。

将$1000$个基$4$个一组分成$250$组,每组对于$2^4$种可能的插入向量预处理出消元后的结果。

那么插入只需要$250$次消元,插入之后重新预处理那块即可。

时间复杂度$O(\frac{m\log mL^2}{64\log L})$。

#include<cstdio>
#include<cstring>
#include<bitset>
#include<vector>
#define N 505
using namespace std;
typedef bitset<1000>bs;
int n,m,i,x,y,cnt,vis[N],cur,idb[N],idg[N];
bs B[1000],fin,w,a[N],q[2010],pb[N];
struct P{int l,r,p;P(int _l,int _r,int _p){l=_l,r=_r,p=_p;}};
vector<P>V;
struct Block{
bs a[16];int b[16];
void build(int x){
for(int S=1;S<16;S++){
int j;
for(j=3;~j;j--)if(S>>j&1)break;
if(B[x+3-j][x+3-j]){
a[S]=B[x+3-j];
int ret=S;
for(int i=j;~i;i--)if(B[x+3-j][x+3-i])ret^=1<<i;
if(ret)a[S]^=a[ret],b[S]=b[ret];else b[S]=0;
}else a[S].reset(),b[S]=1<<j;
}
}
}G[250],pg[N];
inline void ins(bs x){
int i,j,k;
for(i=j=0;i<250;i++){
int S=0;
for(k=0;k<4;j++,k++){
S<<=1;
if(x[j])S++;
}
if(!S)continue;
x^=G[i].a[S];
if(G[i].b[S]){
int k=j-1-__builtin_ctz(G[i].b[S]);
cur++;
idb[cur]=k;
idg[cur]=i;
pb[cur]=B[k];
pg[cur]=G[i];
B[k]=x;
G[i].build(j-4);
break;
}
}
}
inline void get(){
static char s[1010];
scanf("%s",s);
w.reset();
int n=strlen(s);
for(int i=0;i<n;i++)if(s[i]=='1')w[1000+i-n]=1;
}
inline void retrace(int x){
while(cur>x){
B[idb[cur]]=pb[cur];
G[idg[cur]]=pg[cur];
cur--;
}
}
void solve(int l,int r,vector<P>V){
int t=cur;
vector<P>S;
for(vector<P>::iterator it=V.begin();it!=V.end();it++)
if(it->l<=l&&r<=it->r)ins(q[it->p]);
else S.push_back(*it);
if(l==r){
fin.reset();
for(int i=0;i<1000;i++)if(!fin[i])if(B[i][i])fin^=B[i];
bool flag=0;
for(int i=0;i<1000;i++)if(fin[i])putchar('1'),flag=1;else if(flag)putchar('0');
if(!flag)putchar('0');
puts("");
retrace(t);
return;
}
int mid=(l+r)>>1;
solve(l,mid,S),solve(mid+1,r,S);
retrace(t);
}
int main(){
scanf("%d",&n);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
get();
x--,y--;
if(vis[x])q[++cnt]=a[x],V.push_back(P(vis[x],i-1,cnt));
if(vis[y])q[++cnt]=a[y],V.push_back(P(vis[y],i-1,cnt));
vis[x]=vis[y]=i;
a[x]^=w,a[y]^=w;
}
for(i=0;i<n;i++)if(vis[i])q[++cnt]=a[i],V.push_back(P(vis[i],m,cnt));
for(i=0;i<250;i++)G[i].build(i<<2);
solve(1,m,V);
return 0;
}

  

BZOJ4644 : 经典傻逼题的更多相关文章

  1. BZOJ4644: 经典傻逼题【线段树分治】【线性基】

    Description 这是一道经典傻逼题,对经典题很熟悉的人也不要激动,希望大家不要傻逼. 考虑一张N个点的带权无向图,点的编号为1到N. 对于图中的任意一个点集 (可以为空或者全集),所有恰好有一 ...

  2. [BZOJ]4644: 经典傻逼题

    某天我觉得一切题目都是那么不可做,于是百度了一下"傻逼题"-- 题目大意:对于图中的任意一个点集(可以为空或者全集),所有恰好有一个端点在这个点集中的边组成的集合被称为割.一个割的 ...

  3. BZOJ-1625 宝石手镯 01背包(傻逼题)

    傻逼题,懒得打,复制蛋蛋的.. 1625: [Usaco2007 Dec]宝石手镯 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1076 Solved: ...

  4. Codeforces Gym 100338I TV Show 傻逼DFS,傻逼题

    Problem I. TV ShowTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...

  5. BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】

    2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status ...

  6. BZOJ1718: [Usaco2006 Jan] Redundant Paths 分离的路径【边双模板】【傻逼题】

    LINK 经典傻逼套路 就是把所有边双缩点之后叶子节点的个数 //Author: dream_maker #include<bits/stdc++.h> using namespace s ...

  7. Codeforces Round #303 (Div. 2) D. Queue 傻逼题

    C. Woodcutters Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/545/probl ...

  8. BZOJ2761: [JLOI2011]不重复数字【set】【傻逼题】

    Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 ...

  9. UVA11019 Matrix Matcher【hash傻逼题】【AC自动机好题】

    LINK1 LINK2 题目大意 让你在一个大小为\(n*m\)的矩阵中找大小是\(x*y\)的矩阵的出现次数 思路1:Hash hash思路及其傻逼 你把一维情况扩展一下 一维是一个bas,那你二维 ...

随机推荐

  1. ASCII 非打印字符

    项目出了问题,因为AscII非打印字符的原因,后来找了一下啊ASCII的非打印字符,总共有31个,然后我们直接全部替换成问号了. 解决方式为先找到非打印字符,这是我从网上找的非打印字符表: 进制 十六 ...

  2. NYOJ题目198数数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAAK1CAIAAABEvL+NAAAgAElEQVR4nO3drXLkurvv8X0T4bmQYF

  3. postgresql导入及导出

    导入命令 psql -d GAME -U postgres -f /root/plubic.sql 出现如下错误: psql: FATAL:  Peer authentication failed f ...

  4. php文件上传进度条例子

    <?php session_start(); ?> <!DOCTYPE html> <html lang="zh-CN"> <head&g ...

  5. EasyUi – 5.修改$.messager.show() 弹出窗口在浏览器顶部中间出现

    由于在easyui中$.messager.show() 只有一种弹出方式(在浏览器的或下角弹出),我最近在做一个项目的时候需要在浏览器的顶部中间出现.由于自己写花那么多的时间,所以就去修改了原码(不推 ...

  6. 你可能不知道的java、python、JavaScript以及jquary循环语句的区别

    一.概述 java循环语句分为四种形式,分别是 while, do/while, for, foreach: python中循环语句有两种,while,for: JavaScript中循环语句有四种, ...

  7. Linux 下编译自己的 OpenJDK7 包括JVM和JDK API

    1.首先去 这里 http://download.java.net/openjdk/jdk7/ 下载OpenJDK7的源码zip包 2. 简要介绍下OpenJDK7中的目录 hotspot: 放有Op ...

  8. 序列化悍将Protobuf-Net,入门动手实录

    最近在研究web api 2,看了一篇文章,讲解如何提升性能的, 在序列化速度的跑分中,Protobuf一骑绝尘,序列化速度快,性能强,体积小,所以打算了解下这个利器 1:安装篇 谷歌官方没有提供.n ...

  9. Java Hour 63 反射

    首先要感谢下这位可爱的作者: http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html. 本文是基于其模板的模仿实验. 获得C ...

  10. Linggle: 英语写作学习搜索引擎

    Linggle 搜索引擎是一个可用于英语写作的语法.句子工具,可帮助学习者分析更准确的英文写作建议,能够根据词性来推测短句和句子,可精准的分享出完整英文句子如何撰写. Linggle 是台湾学术团队研 ...