test20190903 JKlover
100+65+100=265,T2就差了一点。
乌合之众
给出一个 n × n 的, 元素为自然数的矩阵.这个矩阵有许许多多个子矩阵, 定义它的所有子矩阵形成的集合为 S .
对于一个矩阵 k , 定义 f(k) 为 k 中所有元素的 AND 值 (按位与).
对于一个矩阵 k , 定义 g(k) 为 k 中所有元素的 OR 值 (按位或).
请求出所有子矩阵的 f(k) 之和与所有子矩阵的 g(k) 之和, 即 ∑k∈Sf(k) 与 ∑k∈Sg(k) .
由于答案可能很大, 只需要输出答案对 998244353 取模的结果.
对于 100% 的数据, n ≤ 103, 矩阵中的每个元素都在 int 范围内. 数据有一定梯度.
题解
各个二进制位无关,可以每位分开做。
发现 AND 求的就是全1子矩阵的个数,OR 类似。
那么用单调栈解决即可。时间复杂度 O(n2)。
#include<bits/stdc++.h>
using namespace std;
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T> T read(T&x){
return x=read<T>();
}
#define co const
#define il inline
typedef long long LL;
co int mod=998244353,i2=499122177;
il int add(int a,int b){
return (a+=b)>=mod?a-mod:a;
}
il int mul(int a,int b){
return (LL)a*b%mod;
}
co int N=1000+10;
int n,a[N][N];
int h[N],s[N],st[N],top;
int main(){
freopen("mob.in","r",stdin),freopen("mob.out","w",stdout);
read(n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) read(a[i][j]);
int ans=0;
for(int c=0;c<31;++c){
fill(h+1,h+n+1,0);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j) h[j]=a[i][j]>>c&1?h[j]+1:0;
int sum=0;
top=0;
for(int j=1;j<=n+1;++j){
while(top&&h[st[top]]>=h[j])
sum=add(sum,mod-s[top]),--top;
st[++top]=j,s[top]=mul(h[j],j-st[top-1]);
sum=add(sum,s[top]),ans=add(ans,mul(sum,1<<c));
}
}
}
printf("%d\n",ans);
ans=0;
int bas=mul(n*(n+1)/2,n*(n+1)/2);
for(int c=0;c<31;++c){
ans=add(ans,mul(bas,1<<c));
fill(h+1,h+n+1,0);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j) h[j]=~a[i][j]>>c&1?h[j]+1:0;
int sum=0;
top=0;
for(int j=1;j<=n+1;++j){
while(top&&h[st[top]]>=h[j])
sum=add(sum,mod-s[top]),--top;
st[++top]=j,s[top]=mul(h[j],j-st[top-1]);
sum=add(sum,s[top]),ans=add(ans,mod-mul(sum,1<<c));
}
}
}
printf("%d\n",ans);
return 0;
}
圣战
有 n 个人想要加入圣战, 每个人需要选择一个阵营加入.
但他们私下有 m 对敌对关系, 有敌对关系的两个人不会加入同一个阵营.
很快, 他们发现这会让他们难以加入到圣战中, 于是有一对敌人和好了, 即去除了一对敌对关系.
请找出去除哪一对关系后, 能找到一种加入阵营的方案, 使得剩余有敌对关系的人都不在同一个阵营.
为了避免输出文件过大, 你只需要输出所有符合题意的关系编号的异或和.
对于 100% 的数据, n, m ≤ 5 × 105
数据保证不会给出重复的敌对关系, 也保证自己不会与自己是敌对关系.
题解
二分图就是图中不存在奇环的图, 所以一张二分图删掉若干条边之后, 一定还是一张二分图.
先假设原图连通, 于是可以做出原图的一棵生成树.
然后再加入剩余的非树边. 若加入了非树边 (u, v) , 那么树上 u → v 的路径上的边都被这条非树边覆盖了.
记 dis(u, v) 表示 u, v 在树上的距离.
若 dis(u, v) 为奇数, 则加入 (u, v) 后会形成偶环, 称这条边合法.
若 dis(u, v) 为偶数, 则加入 (u, v) 后会形成奇环, 称这条边不合法.
记不合法边的总数为 cnt , 然后分类讨论.
- cnt = 0 , 答案为所有边.
- cnt = 1 , 答案为唯一的那条不合法边, 以及树上被它覆盖, 但未被合法边覆盖
的边. - cnt > 1 , 答案为树上被所有不合法边覆盖, 但未被合法边覆盖的边.
考虑正确性的证明, 若一条树边被所有不合法边覆盖, 也被若干条合法边覆盖.
那么断掉它之后, 原来的奇环走到对应位置时可以走一个偶环回来, 仍存在奇环.所以还要求不被合法边覆盖.
判断覆盖次数可以树上差分, 被不合法边覆盖权值 +1 , 被合法边覆盖权值 −1 .
若最后的权值 = cnt , 则这条边就可以计入答案.
原图可以不连通, 所以对每个联通块分别执行以上算法, 注意 cnt 是所有联通块的 cnt 之和.
时间复杂度 O(n) , 期望得分 100 分.
#include<bits/stdc++.h>
using namespace std;
template<class T> T read(){
T x=0,w=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*w;
}
template<class T> T read(T&x){
return x=read<T>();
}
#define co const
#define il inline
typedef long long LL;
co int N=500000+10;
struct edge {int to,id,next;}e[N*2];
int head[N],ecnt=1;
void add_edge(int u,int v,int id){
e[++ecnt]=(edge){v,id,head[u]},head[u]=ecnt;
e[++ecnt]=(edge){u,id,head[v]},head[v]=ecnt;
}
int dfn[N],tag[N],cnt,tmp;
void dfs(int x,int in_edge){
for(int i=head[x];i;i=e[i].next){
if(i==(in_edge^1)) continue;
int y=e[i].to;
if(!dfn[y]){
dfn[y]=dfn[x]+1,dfs(y,i);
tag[x]+=tag[y];
}
else if(dfn[y]<dfn[x]){
if((dfn[x]-dfn[y]+1)&1){ // invalid edge
++tag[x],--tag[y];
++cnt,tmp=e[i].id;
}
else --tag[x],++tag[y]; // valid edge
}
}
}
int vis[N],ans[N],tot;
void calc(int x){
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(vis[y]) continue;
if(tag[y]==cnt) ans[++tot]=e[i].id;
calc(y);
}
}
int main(){
freopen("crusade.in","r",stdin),freopen("crusade.out","w",stdout);
int n=read<int>(),m=read<int>();
for(int i=1;i<=m;++i) add_edge(read<int>(),read<int>(),i);
for(int i=1;i<=n;++i)
if(!dfn[i]) dfn[i]=1,dfs(i,0);
if(!cnt){
printf("%d\n",m);
int sum=0;
for(int i=1;i<=m;++i) sum^=i;
printf("%d\n",sum);
return 0;
}
for(int i=1;i<=n;++i)
if(!vis[i]) calc(i);
if(cnt==1) ans[++tot]=tmp;
printf("%d\n",tot);
int sum=0;
for(int i=1;i<=tot;++i) sum^=ans[i];
printf("%d\n",sum);
return 0;
}
这题刘老爷数据出锅,详见博客。
花火之声不闻于耳
有一个长度为 n 的正整数序列 a , 你需要进行 m 次操作, 每次操作有如下两种类型:
修改: (L, R, x) , 表示将区间 [L, R] 内的 ai 都乘上一个正整数 x .
询问: (L, R) , 询问区间 [L, R] 内每个数的乘积的欧拉函数值, 即 φ(∏i=L~Rai)
由于答案可能很大, 你只需要输出答案对 998244353 取模的结果.
这里的欧拉函数 φ(x) 定义为小于等于 x 的正整数中, 与 x 互质的数的个数.
对于 100% 的数据, op ∈ {1, 2}, n, m ≤ 4 × 105, x ≤ 300 , 初始的 ai ≤ 300 .
题解
将欧拉函数定义式写出来,我们就知道我们要维护乘积和质因子。
300以内质数个数有62个,用long long压位即可。
注意预处理卡常,因为每次都求逆元是两个 log 的。
时间复杂度 O(n log n)。
test20190903 JKlover的更多相关文章
- test20190904 JKlover
100+100+100=300.最后十分钟极限翻盘. 树链剖分 给一棵以1为根的有根树,开始只有1有标记. 每次操作可以给某个点打上标记,或者询问从某个点开始向上跳,遇到的第一个有标记的点. 对于 1 ...
- Codeforces1113F. Sasha and Interesting Fact from Graph Theory(组合数学 计数 广义Cayley定理)
题目链接:传送门 思路: 计数.树的结构和边权的计数可以分开讨论. ①假设从a到b的路径上有e条边,那么路径上就有e-1个点.构造这条路径上的点有$A_{n-2}^{e-1}$种方案: ②这条路径的权 ...
- LG4455 【[CQOI2018]社交网络】
分析 这题我们先转化为图论模型,发现求的其实就是有向图中以1为根的生成树数量.而关于这一问题存在O(3^n * n^2)的算法,一看数据n=250,发现不行.于是需要更高效的算法--Matrix-Tr ...
- POJ3764,BZOJ1954 The xor-longest Path
题意 In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of ...
- LOJ10050 The XOR Largest Pair
题意 在给定的 \(N\) 个整数 \(A_1,A_2,-,A_N\) 中选出两个进行异或运算,得到的结果最大是多少? 对于 \(100\%\) 的数据,\(1\le N\le 10^5, 0\le ...
- LOJ10042 收集雪花
题意 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望有重 ...
- LOJ2823 「BalticOI 2014 Day 1」三个朋友
题意 给定一个字符串 S,先将字符串 S 复制一次(变成双倍快乐),得到字符串 T,然后在 T 中插入一个字符,得到字符串 U. 给出字符串 U,重新构造出字符串 S. 所有字符串只包含大写英文字母. ...
- LOJ10034 图书管理
题意 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需要支 ...
- LOJ103 子串查找
题意 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A 中的出现次数.A 和 B 中的字符均为英语大写字母或小写字母. A 中不同位置出现的 B 可重叠. 分析 参照jklov ...
随机推荐
- replace的回调函数。
今天在看算法时,看到一些题目,感觉replace的回调函数好奇葩,$0 .$1什么的: JS的replace方法: str.replace(regexp|substr, newSubStr|funct ...
- SQL Server 系统库的备份与恢复
master数据库 master作为数据库的主要数据库,记录着SQL Server系统的所有系统级信息,例如登录用户.系统配置设置.端点和凭证以及访问其他数据服务器所需要的信息.master数据库还记 ...
- [BZOJ4382][POI2015]Podział naszyjnika (神奇HASH)
[问题描述] 长度为n 的一串项链,每颗珠子是K 种颜色之一.第i 颗与第i-1,i+1 颗珠子相邻,第n 颗与第1 颗也相邻. 切两刀,把项链断成两条链.要求每种颜色的珠子只能出现在其中 ...
- U9单据打印模板自定义扩展字段显示名称
UBF打印模板中,单据自定义扩展字段显示均为扩展字段值集值编码,而在实际运用过程中打印时需要显示扩展字段名称,具体实现方法如下 方式一:采用SQL系统定义函数[dbo].[fn_GetSegName] ...
- 解决使用RabbitTemplate操作RabbitMQ,发生The channelMax limit is reached. Try later.问题
使用RabbitTemplate操纵RabbitMQ,每个RabbitTemplate等于一个connection,每个connection最多支持2048个channel,当hannel达到2048 ...
- 【已解决】ArcMap的界面如何恢复默认设置
解决方案:在C盘内搜索“Normal.mxt”,将它删除,然后重启ArcMap,即可. 效果图:
- JVM性能优化--字节码技术
一.字节码技术应用场景 AOP技术.Lombok去除重复代码插件.动态修改class文件等 二.字节技术优势 Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于 ...
- P1349 广义斐波那契数列(矩阵乘法)
题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...
- DOS之del命令
基本 del命令是用来删除一个或多个文件的,删除文件夹的话还要用rd命令. 举个栗子: 例如我们要删除C盘中的a.txt,我们就可以 del a.txt 也可以同时删除多个,用空格,逗号或分号分开文件 ...
- CSS揭秘(引言)
1.标准的制定过程 a 人员结构:W3C会员公司的成员.特邀专家.W3C工作人员 b 尽管“CSS3”非常流行,但它实际上并没有在任何规范中定义过.它实际上是指一个非正式的集合,包括CSS规范第三版再 ...