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. 分析: 一眼看 ...
随机推荐
- win32-封装BeginPaint
Graphics* StartPaint(HWND win, HDC* hdc, PAINTSTRUCT* ps) { *hdc = BeginPaint(win, ps); return new G ...
- git回退至指定版本,并更新远程仓库
1. git log 查到commit记录 2.复制 commit 后面的id 3. git reset --hard commit 后面的id // 回退 4. 强制更新远程仓库 git ...
- 【Azure Webjob + Redis】WebJob一直链接Azure Redis一直报错 Timeout Exception
问题描述 运行在App Service上的Webjob连接Azure Redis出现Timeout Exception. 错误截图: 参考Azure Redis对于超时问题的排查建议, 在修改Min ...
- centos7 开机自动执行脚本
1.因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2.赋予脚本可执行权限假设/usr/loc ...
- iview 部分表单验证
引用:https://github.com/ElemeFE/element/issues/3686 zxmantou commented on 25 Feb 2019 @Murraya-panicul ...
- day05-Lombok、SpringInitializer
Lombok.Spring-Initializer 1.Lombok 1.1Lombok介绍 Lombok的作用是: 简化Javabean的开发,可以使用Lombok的注解让代码更加简洁 Java项目 ...
- 逆向通达信Level-2 续七 (调试内置WebView)
通过窗口找WebView,打开DevTool调试 在WebView hack入控制台.那个,我已经打开了DevTool,算了. 通过pad面板找WebView. 逆向通达信Level-2 续十一 (无 ...
- WPF线程模型
1. 渲染系统概述 WPF 采用保留模式渲染系统 (Retained Mode Rendering System),该系统可分为 UI 线程和复合线程两个主要部分,两者协作完成 WPF 应用程序的渲染 ...
- Java取当前时间的一分钟后,并格式化输出
1.Java1.8 以前 Calendar instance = Calendar.getInstance();//获取当前日期时间 instance.add(Calendar.MINUTE,1);/ ...
- 大年学习linux(第五节---目录结构)
五.目录结构 可以用ls / 查看linux的目录结构 bin data etc lib media opt root sbin sys usr boot dev home lib64 mnt pro ...