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. r0tracer 源码分析

    使用方法 修改r0tracer.js文件最底部处的代码,开启某一个Hook模式. function main() { Java.perform(function () { console.Purple ...

  2. [攻防世界][江苏工匠杯]file_include

    打开靶机url,上来就是代码审计 <?php highlight_file(__FILE__); include("./check.php"); if(isset($_GET ...

  3. 硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

    前言   前面输出了HDMI,LVDS,MIPI-DSI,这里还有一个常用的显示接口就是VGA了,这个用的不多了,一般板子都是hdmi了.  本篇分析底板VGA电路.   VGA接口   VGA(Vi ...

  4. RabbitMQ零碎整理,总有一天在你工作中会用到

    概念 MQ:消息队列(消息中间件),开源的基于AMQP协议的消息中间件,异步 解耦 削峰 核心作用:1.异步 2.解耦 3.消息通信 RabbitMQ 消息的类型:1.点对点 2.Worker 3.发 ...

  5. Nebula Graph 源码解读系列 | Vol.01 Nebula Graph Overview

    上篇序言中我们讲述了源码解读系列的由来,在 Nebula Graph Overview 篇中我们将带你了解下 Nebula Graph 的架构以及代码仓分布.代码结构和模块规划. 1. 架构 Nebu ...

  6. Java 从键盘上输入"year"“month”和“day”,要求通过程序输出 输入的日期为第几年的第几天

    1 /** 2 * 编写程序: 3 * 从键盘上输入"year""month"和"day",要求通过程序输出 4 * 输入的日期为第几年的第 ...

  7. HUAWEI WATCH GT3手表芯片传感器简析

    一 这里梳理一下华为手表GT3所使用的芯片 芯片A: BES2500L 恒玄BES2500L智能手表SoC,集存储.音频.连接为一体,集成BT5.2双模蓝牙,可支持BLE数据传输.蓝牙通话和音乐播放功 ...

  8. 手爱图仕Aputure MC RGB摄影补光灯体验测评

    前记  作为一个智能硬件设备狂兼智能硬件方案提供商,工作就是和各种智能硬件打交道.最近无意入手了一个爱图仕Aputure MC RGB摄影补光灯.顺便体验了几天,既然体验了,肯定要写一个体验结果的.这 ...

  9. Tornadofx学习笔记(3)——使用Maven编译成jar包

    之前我都是使用的IDEA自带的工具来编译jar包 但是增加了新的依赖,又得去修改project structure的依赖,过于麻烦 某天Android开发的时候,想到gradle可以一键打包,是不是m ...

  10. find第二天

    find第二天 1.找出/tmp目录下,属主不是root,且文件名不以f开头的文件 find /tmp ! -user root -a ! -name 'f*' 或者 find /tmp ! -use ...