JZOJ 5373. 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
2017-09-18 22:43
661 查看
Description
Input
Output
Sample Input
3 3 01 1 7
1 1 6
1 3 2
Sample Output
10
1
7
0
5
Data Constraint
Solution
看到这种“真假条件”,首先要想到的就是——并查集。设 F[x] 表示 x 的祖先,G[x] 表示从 x 到 x 的祖先的异或和。
注意:并集时编号大的要连到编号小的,这样方便处理区间;Get_Father 时顺便处理 G[x] 即可。
那么对于读入的 l,r,k ,先查找出 l−1 和 r 的祖先 fl 和 fr 。
若 fl=fr ,则再判断 G[l−1] xor G[r] 是否等于 k 即可,等于则为真,不等则为假。
若 fl≠fr ,将两集合合并,fr 向 fl 连一条 k ,即:F[fr]=flG[fr]=G[l−1] xor G[r] xor k
最后输出答案,则设 sum[i] 表示从 1 到 i 的异或和,且 sum[1] 到 sum[i−1] 都已求出了。
于是显然,第 i 为的答案就是 sum[i] xor sum[i−1]] 。那怎么求出 sum[i] 呢?
当 i 为一个集合的祖先时,说明 i 的取值不受限制,取 0 显然最优,则:sum[i]=sum[i−1]
当 i 不为一个集合的祖先,设其祖先为 j ,那么 i 这个点要填的就是 G[i] ,于是: sum[i]=sum[j] xor G[i] 。
这样的时间复杂度就是 O(M α(N)) 。
Code
#include<cstdio> #include<algorithm> using namespace std; const int N=200001; int last; int f ,g ,sum ; inline int read() { int X=0,w=1; char ch=0; while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();} while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar(); return X*w; } inline void write(int x) { if(x>9) write(x/10); putchar(x%10+'0'); } inline int get(int x) { if(f[x]==x) return x; int y=get(f[x]); g[x]^=g[f[x]]; return f[x]=y; } int main() { int n=read(),m=read(),czy=read(); for(int i=1;i<=n;i++) f[i]=i; while(m--) { int l=read(),r=read(),k=read(); if(czy) l^=last,r^=last,k^=last; int f1=get(l-1),f2=get(r); if(f1!=f2) { if(f1>f2) swap(f1,f2); f[f2]=f1; g[f2]^=g[l-1]^g[r]^k; write(last=1); }else write(last=(g[l-1]^g[r])==k); putchar('\n'); } for(int i=1;i<=n;i++) { int j=get(i); if(i==j) sum[i]=sum[i-1]; else sum[i]=sum[j]^g[i]; write(sum[i]^sum[i-1]); putchar('\n'); } return 0; }
相关文章推荐
- JZOJ5373. 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人 并查集+启发式合并
- JZOJ5373. 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
- JZOJ5373【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
- JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题
- JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情
- 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
- JZOJ5372. 【NOIP2017提高A组模拟9.17】猫 链表+贪心+堆优化
- JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫
- 【JZOJ 5358】【NOIP2017提高A组模拟9.12】BBQ
- jzoj5402 【NOIP2017提高A组模拟10.8】God Knows
- JZOJ5384. 【NOIP2017提高A组模拟9.23】四维世界 组合数学
- JZOJ4919. 【NOIP2017提高组模拟12.10】神炎皇
- 【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇
- 【jzoj5289】【NOIP2017提高组A组模拟8.17】【偷笑】【数据结构】
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C
- JZOJ 5389. 【NOIP2017提高A组模拟9.26】解梦
- 【JZOJ5328】【NOIP2017提高组模拟】世界线(STL)
- JZOJ 4787 【NOIP2016提高A组模拟9.17】数格子
- jzoj5335 【NOIP2017提高A组模拟8.24】早苗 (递推优化矩乘)
- JZOJ5187. 【NOIP2017提高组模拟6.30】tty's maze