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

题目传送门


分析

考虑容斥。

\[\large dp[i]=\sum dp[j]\min_{k=j}^i\{a_k\}*(-1)^{i-j-1}
\]

直接用单调栈预处理,然后奇数位置插入 \(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)的更多相关文章

  1. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  2. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  3. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  4. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  5. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  6. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  7. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  8. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  9. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  10. AtCoder Regular Contest 097

    AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...

随机推荐

  1. 学习go语言编程之并发编程

    并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...

  2. 【八股cover#3】计网 Q&A与知识点

    计网知识点Q&A 简历cover 1.TCP/IP网络模型 网络模型 ​ TCP/IP 协议族,它是一个分层.多协议的通信体系. ​ TCP/IP协议族是一个四层协议系统,自底而上分别是数据链 ...

  3. 全面掌握Directory.Build.props

    为什么需要集中管理版本号? 1)同一个产品包含多个模块,对同一个包指定了不同的版本 比如A模块用了"Serilog.Sinks.Async"的"1.1.2"版本 ...

  4. 为产品的一堆Visual Studio解决方案引入Directory.Build.props

    为什么需要Directory.Build.props? 一个产品有了多个甚至几十个解决方案之后,每个解决方案里面的项目可能会引用一个dll包的不同版本,因此需要集中管理dll包的版本号. .NET的D ...

  5. 【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)

    问题描述 为Azure App Service添加访问限制,需要Python Azure SDK来实现的示例代码. 问题解答 查阅Azure App Service的官方资料,使用Python SDK ...

  6. 【Azure 应用服务】在App Service中新建WebJob时候遇见错误,不能成功创建新的工作任务

    问题描述 在Azure App Service界面上,添加新的Web Job(工作任务)时,一直添加失败.无详细错误提示,在App Service的Activity Logs(活动日志)中,根本没有添 ...

  7. 【Azure Developer】Go语言调用Azure SDK如何登录到中国区Azure环境

    问题描述 在 "使用 Azure SDK for Go 进行 Azure 身份验证" 文章中的 Go 示例代码进行登录Azure时,默认指向的是Globa Azure.当只修改AA ...

  8. 【Azure 环境】中国区Azure B2C 是否支持手机验证码登录呢?

    问题描述 中国区Azure B2C 是否支持手机验证码登录呢? 问题回答 在没有原生 Phone sign-up and sign-in for user flows (中国区不支持,Global A ...

  9. 百亿节点、毫秒级延迟,携程金融基于 NebulaGraph 的大规模图应用实践

    作者:霖雾,携程数据开发工程师,关注图数据库等领域. 0. 背景 2017 年 9 月携程金融成立,在金融和风控业务中,有多种场景需要对图关系网络进行分析和实时查询,传统关系型数据库难以保证此类场景下 ...

  10. Java 小案例+super使用

    1 package com.bytezero.supertest3; 2 3 /** 4 * 5 * @Description AccountTest类 6 * @author Bytezero·zh ...