AtCoder Regular Contest 115(without F)
ARC115 A - Two Choices
分析
可以发现正确答案数量相同当且仅当 \(S_i\) xor \(S_j\) 所含有的 1 的数量为偶数。
再将这个简化一下,正确答案相同当且仅当 \(S_i\) 和 \(S_j\) 所含有的 1 的数量同奇偶。
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,cnt[2];
signed main(){
scanf("%d%*d",&n);
for (rr int i=1;i<=n;++i){
rr char c=getchar(); rr int now=0;
while (!isdigit(c)) c=getchar();
while (isdigit(c)) now+=(c&1),c=getchar();
++cnt[now&1];
}
return !printf("%lld\n",1ll*cnt[0]*cnt[1]);
}
ARC115 B - Plus Matrix
分析
可以发现第 \(i\) 行可以由第 \(1\) 行 加减一个数得到,由此判无解,然后再选出最小的一行作为 \(B\) 即可
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,a[511][511],b[511][511],mn;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
signed main(){
scanf("%d",&n),mn=1;
for (rr int i=1;i<=n;++i){
for (rr int j=1;j<=n;++j) a[i][j]=iut();
for (rr int j=1;j<n;++j) b[i][j]=a[i][j+1]-a[i][j];
}
for (rr int i=1;i<n;++i)
for (rr int j1=1;j1<n;++j1)
for (rr int j2=j1+1;j2<=n;++j2)
if (b[j1][i]!=b[j2][i]) return !puts("No");
for (rr int i=2;i<=n;++i)
if (a[mn][1]>a[i][1]) mn=i;
puts("Yes");
for (rr int i=1;i<=n;++i) printf("%d%c",a[i][1]-a[mn][1],i==n?10:32);
for (rr int i=1;i<=n;++i) printf("%d%c",a[mn][i],i==n?10:32);
return 0;
}
ARC115 C - ℕ Coloring
分析
如果第一个位置填1,可以发现限制条件实际就是深度要超过约数的深度,直接建图跑最长路即可
代码
#include <cstdio>
#define rr register
using namespace std;
const int N=100011;
struct node{int y,next;}e[N<<4];
int a[N],as[N],n,et;
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void add(int x,int y){
e[++et]=(node){y,as[x]},as[x]=et;
}
signed main(){
scanf("%d",&n),a[1]=1;
for (rr int i=1;i<=n;++i)
for (rr int j=i*2;j<=n;j+=i) add(j,i);
for (rr int i=2;i<=n;++i)
for (rr int j=as[i];j;j=e[j].next)
if (a[i]<a[e[j].y]+1) a[i]=a[e[j].y]+1;
for (rr int i=1;i<=n;++i) print(a[i]),putchar(i==n?10:32);
return 0;
}
ARC115 D - Odd Degree
分析
如果将 \(k\) 个奇点连向一个虚点,那么题目就转化成求欧拉回路的问题,
由于每条非树边都独立出来,所以 \(n\) 个点,\(m\) 条边的合法生成子图为 \(2^{m-n+1}\),
然后连通块选择点作为奇点直接dp就可以了
代码
#include <cstdio>
#include <cctype>
using namespace std;
const int N=5011,mod=998244353;
struct node{int y,next;}e[N<<1];
int two[N],c[N][N],as[N],v[N],et=1,n,m,dp[N],sub,edge;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
void dfs(int x){
if (v[x]) return; v[x]=1,++sub;
for (int i=as[x];i;i=e[i].next)
dfs(e[i].y),++edge;
}
int main(){
n=iut(),m=iut(),c[0][0]=two[0]=dp[0]=1;
for (int i=1;i<=m;++i) two[i]=mo(two[i-1],two[i-1]);
for (int i=1;i<=m;++i){
int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
for (int i=1;i<=n;++i){
c[i][0]=c[i][i]=1;
for (int j=1;j<i;++j)
c[i][j]=mo(c[i-1][j-1],c[i-1][j]);
}
for (int i=1;i<=n;++i)
if (!v[i]){
sub=edge=0,dfs(i),edge>>=1;
for (int j=n;~j;--j){
if (j&1) continue;
dp[j]=1ll*dp[j]*two[edge-sub+1]%mod;
for (int k=2;k<=j;k+=2){
if (k>sub) break;
dp[j]=mo(dp[j],1ll*dp[j-k]*c[sub][k]%mod*two[edge-sub+1]%mod);
}
}
}
for (int i=0;i<=n;++i) print(dp[i]),putchar(10);
return 0;
}
ARC115 E - LEQ and NEQ
分析
考虑容斥。
\]
直接用单调栈预处理,然后奇数位置插入 \(dp\) 值的相反数即可
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int mod=998244353,N=500011; typedef long long lll;
int ww[N<<2],wc[N<<2],lazy[N<<2],stac[N],a[N],n,las[N],Top,dp[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline void upd(int k,int l,int r,int x,int y){
if (l==r) {ww[k]=wc[k]=y; return;}
if (lazy[k]){
wc[k<<1]=(lll)ww[k<<1]*lazy[k]%mod,
wc[k<<1|1]=(lll)ww[k<<1|1]*lazy[k]%mod,
lazy[k<<1]=lazy[k<<1|1]=lazy[k];
}
rr int mid=(l+r)>>1;
if (x<=mid) upd(k<<1,l,mid,x,y);
else upd(k<<1|1,mid+1,r,x,y);
ww[k]=mo(ww[k<<1],ww[k<<1|1]);
wc[k]=mo(wc[k<<1],wc[k<<1|1]);
}
inline void update(int k,int l,int r,int x,int y,int z){
if (l==x&&r==y) {wc[k]=(lll)ww[k]*z%mod,lazy[k]=z; return;}
rr int mid=(l+r)>>1;
if (lazy[k]){
wc[k<<1]=(lll)ww[k<<1]*lazy[k]%mod,
wc[k<<1|1]=(lll)ww[k<<1|1]*lazy[k]%mod,
lazy[k<<1]=lazy[k<<1|1]=lazy[k];
}
if (y<=mid) update(k<<1,l,mid,x,y,z);
else if (x>mid) update(k<<1|1,mid+1,r,x,y,z);
else update(k<<1,l,mid,x,mid,z),update(k<<1|1,mid+1,r,mid+1,y,z);
wc[k]=mo(wc[k<<1],wc[k<<1|1]);
ww[k]=mo(ww[k<<1],ww[k<<1|1]);
}
signed main(){
n=iut()+1,a[1]=-1e9,
dp[1]=stac[Top=1]=1;
for (rr int i=2;i<=n;++i){
a[i]=iut();
while (Top&&a[stac[Top]]>=a[i]) --Top;
las[i]=stac[Top],stac[++Top]=i;
}
for (rr int i=2;i<=n;++i){
upd(1,1,n,i-1,(i&1)?dp[i-1]:(mod-dp[i-1]));
if (las[i]<i) update(1,1,n,las[i],i-1,a[i]);
dp[i]=(i&1)?wc[1]:(mod-wc[1]);
}
return !printf("%d",dp[n]);
}
AtCoder Regular Contest 115(without F)的更多相关文章
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- AtCoder Regular Contest 095
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- AtCoder Regular Contest 096
AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...
- AtCoder Regular Contest 097
AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...
随机推荐
- Redis原理学习:Redis主体流程分析
转自:七把刀 https://www.jianshu.com/p/427cf97d7951 网上分析Redis源码的文章挺多,如黄健宏的<Redis设计与实现>就很详尽的分析了redis源 ...
- Lucene介绍与使用
Lucene介绍与使用 原文链接:https://blog.csdn.net/weixin_42633131/article/details/82873731 不选择使用Lucene的6大原因? 原文 ...
- 解析Spring中的循环依赖问题:初探三级缓存
什么是循环依赖? 这个情况很简单,即A对象依赖B对象,同时B对象也依赖A对象,让我们来简单看一下. // A依赖了B class A{ public B b; } // B依赖了A class B{ ...
- npm模块全局安装后无法使用解决方案
好家伙 npm模块全局安装后无法使用 估计是少配了环境变量 1.使用命令: npm config get prefix 找到全局包的安装位置 2.随后我们右键"我的电脑"打 ...
- springboot多线程TaskExecutor的使用,以及使用@Async实现异步调用
目录 @Async实现异步调用 pom.xml 启动类 定义controller 定义接口 实现类 将isDone换程CountDownLatch来判断线程是否执行完实例化CountDownLatch ...
- 【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
问题描述 在App Service中启用Identity后,使用系统自动生成 Identity. 使用如下代码连接数据库 SQL Server: SQLServerDataSource dataSou ...
- STM32 | STM32到底是什么?(第一天)
零基础 STM32 第一天 一.认知STM32 1.STM32概念 STM32:意法半导体基于ARM公司的Cortex-M内核开发的32位的高性能.低功耗单片机. ST:意法半导体 M:基于ARM公司 ...
- 文心一言 VS 讯飞星火 VS chatgpt (209)-- 算法导论15.4 6题
六.设计一个 O(nlgn) 时间的算法,求一个 n 个数的序列的最长单调递增子序列.(提示:注意到,一个长度为 i 的候选子序列的尾元素至少不比一个长度为 i-1 候选子序列的尾元素小.因此,可以在 ...
- Python面向对象之多态和鸭子类型
[一]多态 [1]什么是多态 多态指的是一类事物有多种形态 [2]示例 比如动物有多种形态:猫.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): ...
- A left join B B表有多条记录,max(create_time)取最新一条
例如:A表合同表t_contract B表合同审核表t_contract_audit.两个表根据contract_id关联.且一条合同有多条审核记录.求:A.合同状态.B.最新审核记录结果. 简单: ...