生活随笔
收集整理的這篇文章主要介紹了
ACL Beginner Contest 总结——F多项式待补
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
A - Repeat ACL
簽到題1
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std
;
typedef long long ll
;
typedef pair
<int,int> pii
;
const int N
=500010;
int main()
{IO
;int T
=1;while(T
--){int n
;cin
>>n
;string s
="ACL";while(n
--) cout
<<s
;cout
<<'\n';}return 0;}
B - Integer Preference
簽到題2
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std
;
typedef long long ll
;
int main()
{IO
;int T
=1;while(T
--){ll a
,b
,c
,d
;cin
>>a
>>b
>>c
>>d
;if(b
<c
||d
<a
) cout
<<"No\n";else cout
<<"Yes\n";}return 0;
}
C - Connect Cities
簡單并查集維護連通關系即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std
;
const int N
=500010;
int n
,m
;
int p
[N
];
int find(int x
)
{return x
==p
[x
]?x
:p
[x
]=find(p
[x
]);
}
int main()
{IO
;int T
=1;while(T
--){cin
>>n
>>m
;for(int i
=1;i
<=n
;i
++) p
[i
]=i
;while(m
--){int a
,b
;cin
>>a
>>b
;p
[find(a
)]=find(b
);}int res
=0;for(int i
=1;i
<=n
;i
++)if(i
==p
[i
]) res
++;cout
<<res
-1<<'\n';}return 0;}
D - Flat Subsequence
剛開始把相鄰看成整個子序列絕對值差都不大于K,于是先做的E
值域線段樹優化dp
狀態表示:fif_ifi?考慮前iii個數,且選擇aia_iai?作為子序列結尾的集合。
狀態轉移:fi=max(fi,fj+1)(∣aj?ai∣≤K)f_i=max(f_i,f_j+1)(|a_j-a_i|\leq K)fi?=max(fi?,fj?+1)(∣aj??ai?∣≤K)
考慮優化:能夠更新fif_ifi?必須滿足ai?K≤aj≤ai+Ka_i-K\leq a_j\leq a_i+Kai??K≤aj?≤ai?+K,于是考慮權值線段樹維護區間,每次把aia_iai?打到權值線段樹中,值為fif_ifi?,然后只需要求區間最值即可。單點修改、區間查詢。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std
;
const int N
=300010;
const ll mod
=998244353;
int f
[N
];
int n
,k
;
int a
[N
];
struct node
{int l
,r
;int val
;
}tree
[N
*4];
void pushup(int u
)
{tree
[u
].val
=max(tree
[u
<<1].val
,tree
[u
<<1|1].val
);
}
void build(int u
,int l
,int r
)
{tree
[u
]={l
,r
,0};if(l
==r
) return;int mid
=l
+r
>>1;build(u
<<1,l
,mid
),build(u
<<1|1,mid
+1,r
);
}
void modify(int u
,int pos
,int val
)
{if(tree
[u
].l
==tree
[u
].r
) {tree
[u
].val
=max(tree
[u
].val
,val
);return;}int mid
=tree
[u
].l
+tree
[u
].r
>>1;if(pos
<=mid
) modify(u
<<1,pos
,val
);else modify(u
<<1|1,pos
,val
);pushup(u
);
}
int query(int u
,int l
,int r
)
{if(tree
[u
].l
>=l
&&tree
[u
].r
<=r
) return tree
[u
].val
;int mid
=tree
[u
].l
+tree
[u
].r
>>1;int v
=0;if(l
<=mid
) v
=max(v
,query(u
<<1,l
,r
));if(r
>mid
) v
=max(v
,query(u
<<1|1,l
,r
));return v
;
}
int main()
{IO
;int T
=1;while(T
--){cin
>>n
>>k
;for(int i
=1;i
<=n
;i
++) cin
>>a
[i
];build(1,0,300000);int res
=0;for(int i
=1;i
<=n
;i
++){int l
=max(0,a
[i
]-k
),r
=min(300000,a
[i
]+k
);f
[i
]=1+query(1,l
,r
);modify(1,a
[i
],f
[i
]);res
=max(res
,f
[i
]);}cout
<<res
<<'\n';}return 0;}
E - Replace Digits
線段樹維護十進制下的數即可(取模)
預處理num[][]數組,num[i][j]表示iii…i(j個i)iii\dots\ i(j個i)iii…?i(j個i),ten[]數組,ten[i]表示10i10^i10i,注意取模保存,有了這兩個數組,區間合并就很好寫了。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std
;
typedef long long ll
;
typedef pair
<int,int> pii
;
const int N
=200010;
const ll mod
=998244353;
int n
,m
;
struct node
{int l
,r
;ll s
;int lazy
;
}tree
[N
*4];
ll ten
[N
];
ll num
[10][N
];
void pushup(int u
)
{int lenr
=tree
[u
<<1|1].r
-tree
[u
<<1|1].l
+1;tree
[u
].s
=(tree
[u
<<1].s
*ten
[lenr
]%mod
+tree
[u
<<1|1].s
)%mod
;
}
void build(int u
,int l
,int r
)
{tree
[u
]={l
,r
,0,0};if(l
==r
){tree
[u
].s
=1;return ;}int mid
=l
+r
>>1;build(u
<<1,l
,mid
),build(u
<<1|1,mid
+1,r
);pushup(u
);
}
void pushdown(int u
)
{if(!tree
[u
].lazy
) return;tree
[u
<<1].lazy
=tree
[u
<<1|1].lazy
=tree
[u
].lazy
;tree
[u
<<1].s
=num
[tree
[u
].lazy
][tree
[u
<<1].r
-tree
[u
<<1].l
+1];tree
[u
<<1|1].s
=num
[tree
[u
].lazy
][tree
[u
<<1|1].r
-tree
[u
<<1|1].l
+1];tree
[u
].lazy
=0;
}
void modify(int u
,int l
,int r
,int x
)
{if(tree
[u
].l
>=l
&&tree
[u
].r
<=r
){tree
[u
].s
=num
[x
][tree
[u
].r
-tree
[u
].l
+1];tree
[u
].lazy
=x
;return;}pushdown(u
);int mid
=tree
[u
].l
+tree
[u
].r
>>1;if(l
<=mid
) modify(u
<<1,l
,r
,x
);if(r
>mid
) modify(u
<<1|1,l
,r
,x
);pushup(u
);
}
int main()
{IO
;int T
=1;while(T
--){cin
>>n
>>m
;ten
[0]=1;for(int i
=1;i
<=n
;i
++) ten
[i
]=10*ten
[i
-1]%mod
;for(int i
=1;i
<=9;i
++){for(int j
=1;j
<=n
;j
++)num
[i
][j
]=(num
[i
][j
-1]*10%mod
+i
)%mod
;}build(1,1,n
);while(m
--){int l
,r
,x
;cin
>>l
>>r
>>x
;modify(1,l
,r
,x
);cout
<<tree
[1].s
<<'\n';}}return 0;}
F - Heights and Pairs
不會多項式,會了可能補
先貼個代碼,搞會兒信號與系統晚上再補剩余的QaQ
要加油哦~
總結
以上是生活随笔為你收集整理的ACL Beginner Contest 总结——F多项式待补的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。