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语言(04):scheduler调度器-GMP里结构体源码分析

    在前面一节中简单介绍了golang的调度模型-GPM模型,介绍了他们各自的作用.这篇文章就来看看他们的源码结构. Go版本:go1.13.9 M结构体 M结构体是OS线程的一个抽象,主要负责结合P运行 ...

  2. 【LeetCode动态规划#15】最长公共子序列II

    最长公共子序列(二) 描述 给定两个字符串str1和str2,输出两个字符串的最长公共子序列.如果最长公共子序列为空,则返回"-1".目前给出的数据,仅仅会存在一个最长的公共子序列 ...

  3. 维基百科Wikipedia镜像网站列表(全部已被封)

    序号 网址 备注 1 https://chi.jinzhao.wiki/wiki (中文版) https://en.jinzhao.wiki/wiki/Main_Page (英文版)  支持多种语言. ...

  4. Taurus.MVC WebMVC 入门开发教程6:路由配置与路由映射

    前言: 在本篇 Taurus.MVC WebMVC 入门开发教程的第六篇文章中, 我们将讨论如何配置路由并映射到控制器和操作方法. 路由是决定应用程序如何响应客户端请求的重要组成部分,因此在 Web ...

  5. Redis项目常见解决方案

    ## 1. 缓存预热 在项目启动,或者服务器重启后, 因为请求量较大, 此时对关系型数据库的访问量就有可能超标,导致服务卡顿,宕机, 所以在启动前应该对缓存进行预热: 前置准备工作: 日常例行统计数据 ...

  6. Zabbix“专家坐诊”第183期问答汇总

    问题一 Q:老师,请问一下zabbix采集的数据怎么过滤,获取数据是nottime=20:30 notafter=3,怎么过滤出netafter=3 ?谢谢. A:过滤器设置如下图. 问题二 Q:大佬 ...

  7. 摆脱鼠标系列 - 打开微信(Alt+V) - 打开双核浏览器(Alt+S) - HotkeyP

    摆脱鼠标系列 - 打开微信(Alt+V) - 打开双核浏览器(Alt+S) - HotkeyP 新定义了两个快捷键 这两个比较常用

  8. github git clone下载加速 && npm install 下载加速

    git clone https://pd.zwc365.com/seturl/< https 开头的项目地址> npm install --registry=https://registr ...

  9. 关于debian安装完后输入法的问题

    sudo apt install ibus-libpinyin后 重启计算机

  10. 2、Azure Devops之Azure Boards使用

    1.什么是Azure Boards 使用面板.积压工作.冲刺.查询管理项目的用户故事.待办事项.任务.特性和bug. 2.工作项(WorkItem) 工作项管理的可以管理和创建用户故事.特性.任务. ...