某天我觉得一切题目都是那么不可做,于是百度了一下“傻逼题”……

题目大意:对于图中的任意一个点集(可以为空或者全集),所有恰好有一个端点在这个点集中的边组成的集合被称为割。一个割的权值被定义为所有在这个割上的边的异或和。现在有一张一开始只有n个点的图,m次操作,每次加入一条边并询问当前最大的割的权值。(n<=500,m<=1000,边权用二进制表示,二进制数长度L<=1000)

思路:把选割看成把图分成两部分,“脚踏两只船”的边就是割,考虑选每个点的贡献,实际上就是使答案异或上连向这个点的所有边的异或和,这样每条边如果两端点都选或都不选贡献为0,只有一个选贡献就是这个边权。问题转化成n个数,一开始都是0,每次把其中两个异或上一个数,询问当前最大的子集异或和。考虑用线性基解决,由于线性基只支持插入,我们用线段树分治解决。暴力计算二进制数复杂度有点大,用bitset加速即可。总复杂度O(mlogm*L^2/32)。

#include<cstdio>
#include<cstring>
#include<vector>
#include<bitset>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 500
#define ML 1000
bitset<ML> a[MN+],w,z[ML+],ans[ML+];
struct node{int l,r;vector<bitset<ML> > v;}t[ML*+];
char s[ML+];
int l[MN+];
vector<int> v[ML*+];
void build(int k,int l,int r)
{
if((t[k].l=l)==(t[k].r=r))return;
int mid=l+r>>;
build(k<<,l,mid);build(k<<|,mid+,r);
}
void ins(int k,int l,int r,bitset<ML>&x)
{
if(t[k].l==l&&t[k].r==r){t[k].v.push_back(x);return;}
int mid=t[k].l+t[k].r>>;
if(r<=mid)ins(k<<,l,r,x);
else if(l>mid)ins(k<<|,l,r,x);
else ins(k<<,l,mid,x),ins(k<<|,mid+,r,x);
}
void dfs(int x)
{
int i,j;
for(i=;i<t[x].v.size();++i)
for(j=ML;j--;)if(t[x].v[i][j])
if(z[j][j])t[x].v[i]^=z[j];
else{z[j]=t[x].v[i];v[x].push_back(j);break;}
if(t[x].l<t[x].r)dfs(x<<),dfs(x<<|);
else for(j=ML;j--;)if(!ans[t[x].l][j]&&z[j][j])ans[t[x].l]^=z[j];
for(i=;i<v[x].size();++i)z[v[x][i]].reset();
}
int main()
{
int n,m,i,j,k,x,y;
read();n=read();m=read();
build(,,m);
for(i=;i<=m;++i)
{
x=read();y=read();scanf("%s",s);k=strlen(s)-;
for(j=;j<=k;++j)w[k-j]=s[j]-'';for(;j<ML;++j)w[j]=;
if(l[x]+<i)ins(,l[x]+,i-,a[x]);a[x]^=w;l[x]=i-;
if(l[y]+<i)ins(,l[y]+,i-,a[y]);a[y]^=w;l[y]=i-;
}
for(i=;i<=n;++i)if(l[i]<m)ins(,l[i]+,m,a[i]);
dfs();
for(i=;i<=m;++i)
{
for(j=ML;--j;)if(ans[i][j])break;
for(;j>=;--j)x=ans[i][j],printf("%d",x);puts("");
}
}

[BZOJ]4644: 经典傻逼题的更多相关文章

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

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

  2. BZOJ4644 : 经典傻逼题

    设每个点的权值为和它相连的所有边的权值的异或和,那么等价于选若干个点,使得点权异或和最大,这显然只需要维护一组线性基,然后从高位到低位贪心选取即可. 对于本题,因为有修改操作,所以考虑按时间分治,并用 ...

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

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

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

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

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

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

  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. 初谈Git(本机克隆项目远程仓库)

    1. 码云注册与新建项目 注册并新建项目 2. Git安装并配置 安装 配置 3. clone项目 附:一些Git命令 git clone 拷贝并跟踪远程的master分支 git add 跟踪新文件 ...

  2. Python 线程复习

    修改全局变量,设立flag来避免线程间数据冲突,低效率版 from threading import Thread import time g_num=0 g_flag = 1 def test1() ...

  3. 视频聊天插件:AnyChat使用攻略之iOS开发指南

    AnyChat使用攻略之iOS开发指南 这套攻略主要指导刚开始使用AnyChat SDK For iOS的同学,快速搭建SDK环境,和实现音视频开发流程. (需要工程案例文件可联系我们) 在iOS平台 ...

  4. 6块300G SCSI RAID5,两块硬盘损坏的数据恢复总结

    [用户单位]XXXX网站[数据恢复故障描述]DELL POWEREDGE 2850服务器,内置6块300G SCSI硬盘 ,组成RAID5,安装LINUX REDHAT 4操作系统,存储大量照片,文件 ...

  5. django报错Manager isn't accessible via UserInfo instances

    出现这种错误是因为调用模型对象时使用了变量名,而不是对象名(模型类),例如: user = UserInfo()user_li = user.objects.filter(uname=username ...

  6. java 细说String

    String类内部用一个字符数组表示字符串,实例变量定义为: private final char value[]; String有两个构造方法,可以根据char数组创建String public S ...

  7. 阿里云API网关(12)为员工创建子账号,实现分权管理API:使用RAM管理API

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  8. Android开发——发布第三方库到JitPack上

    前言: 看到大神们的写的第三方控件,比较好用,我们使用的时候直接是在gradle上加上代码就可以使用了,现在到我们写了一个第三方控件,想要别人使用的时候也是直接在gradle加上相关的代码就可以用了, ...

  9. R数据分析 第一篇:温习概率论

    概率论是人们在长期实践中发现的理论,是客观存在的.自然界和社会上发生的现象是多种多样的,有一类现象,在一定条件下必然发生,称作确定性现象,而概率论研究的现象是不确定性现象,嗯嗯,醒醒,概率论研究的对象 ...

  10. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) B. Divisiblity of Differences

    http://codeforces.com/contest/876/problem/B 题意: 给出n个数,要求从里面选出k个数使得这k个数中任意两个的差能够被m整除,若不能则输出no. 思路: 差能 ...