在回南京的火车上,闲着无聊,再加上打了波周赛又是光速下班,于是决定补一补这两天训的题解。这个是前天打的。就不一一贴题目了,很烦。感觉我还是好菜,也没啥提升,很无语。。
传送门
Dashboard - Codeforces Round 898 (Div. 4) - Codeforces
思路
:直接根据样例,发现就样例那种情况,也就是当时候,输出,其余情况输出。
:由于极小,就不用考虑数学方法,就是暴力枚举每一项,最后取个。
:有语法题那味了,就把每个格子的赋分先初始化,我是用四个循环,比较抽象,反正随便搞一搞就找出来,然后看哪里是就对应的分数。
:很显然,我们由贪心的想法,肯定是从开始覆盖最优,显然要找相邻两个之间的距离,如果,那么我们就不要多覆盖一次,否则一定要多覆盖一次,然后枚举一遍即可。
:二分的模板题,很裸,没啥好说的,就是要注意和要开始还是大一点好。
:双指针题前缀和。我们要找的是最大长度,并不一定要数值最大,因此便枚举边更新,边界问题一直困扰我很久,下面找个时间做几十个双指针。
:贪心题,开始也没啥思路,但是在纸上尝试了一些样例之后,发现了一些性质,形如的最多可以贡献的个数的分数,且不会影响前面的得分。形如的也可以贡献的个数的得分,且不会影响后面的得分,但是形如,如果我们单独考虑这样一个字符串,我们就会发现,是会影响分数的,因为我们不可能加(的分数),只能加的分数,但是这种情况其实对题目的影响不是特别大,因为我们想,综合整个字符串,影响得分的其实就是相邻两个或者是第一个之前和最后一个之后的序列,每一个必然需要匹配一段非的序列,那么假设字符串中有个B,会有多少段非的序列呢,答案是或段,当出现在开头或结尾的时候,就有段,否则会有段,如果是段,那么我们最后答案就是所有非的字符个数,否则我们只要找出最小的一段非的序列字符个数减去即可。很有意思的一个贪心题。
:首先,我们要知道个点条边的树叫基环树,基环树中有一个环(一般的树是没有的),题目问和如果绝顶聪明,那么是否能追上。其实我们不妨考虑,如果是在一棵树上,如果没有环,那么显然最后是可以追上的,只有在环上的时候,由于知道的具体动向,所以无论如何都追不上,我们我们就要找到所在的位置距离离他最近的环上的点的距离,与距这个点的距离,如果,那么就会被抓住,否则就不会。当然要特判一下如果他们起点一样,那么无论如何都会被抓住。所以我们分为两步走,第一步,找到距最近的环上的点,第二步分别求和到点的最短路,第一步可以用无向图的拓扑排序找出(环上点的度都>2),第二部用或者是,很显然更快,最后时间复杂度为。
代码
:
#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t;
void solve(){
string s;
cin>>s;
if(s!="bca" && s!="cab") cout<<"YES\n";
else cout<<"NO\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t;
int a[20];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll res=0;
for(int i=1;i<=n;i++){
a[i]++;
ll ans=1;
for(int j=1;j<=n;j++){
ans*=a[j];
}
a[i]--;
res=max(res,ans);
}
cout<<res<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t;
int v[20][20];
void solve(){
ll ans=0;
memset(v,0,sizeof v);
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(i==1 || i==10 || j==1 || j==10) v[i][j]=1;
}
}
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(i==2 || i==9 || j==2 || j==9){
if(v[i][j]==0) v[i][j]=2;
}
}
}
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(i==3 || i==8 || j==3 || j==8){
if(v[i][j]==0) v[i][j]=3;
}
}
}
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(i==4 || i==7 || j==4 || j==7){
if(v[i][j]==0) v[i][j]=4;
}
}
}
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(i==5 || i==6 || j==5 || j==6 ){
if(v[i][j]==0) v[i][j]=5;
}
}
}
// for(int i=1;i<=10;i++){
// for(int j=1;j<=10;j++){
// cout<<v[i][j]<<" ";
// }
// cout<<endl;
// }
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
char c;
cin>>c;
if(c=='X'){
ans+=v[i][j];
}
}
}
cout<<ans<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t;
vector<int> v;
void solve(){
string s;
int n,k;
cin>>n>>k;
cin>>s;
int last=-1;
int ans=0;
for(int i=0;i<s.size();i++){
if(s[i]=='B'){
if(last==-1){
ans++;
last=i;
}
else if(i-last<k){
continue;
}
else{
ans++;
last=i;
}
}
}
cout<<ans<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t;
vector<int> v;
const int N=2e5+10;
int a[N];
ll x;
int n;
bool check(int m){
int ll res=0;
for(int i=1;i<=n;i++){
res+=max(0,m-a[i]);
}
return res<=x;
}
void solve(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll l=1,r=2e9+2;
while(l<r){
ll mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t;
vector<int> v;
const int N=2e5+10;
int a[N],h[N],k;
int dp[N];
int n;
bool check(int m){
}
void solve(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];
}
for(int i=1;i<=n;i++) cin>>h[i];
int l=1;
int ans=0;
for(int r=1;r<=n;){
if(h[r-1]%h[r]) l=r;
while(a[r]-a[l-1]>k) l++;
ans=max(ans,r-l+1);
r++;
}
cout<<ans<<"\n";
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t;
vector<int> v;
const int N=2e5+10;
int a[N],h[N],k;
int dp[N];
void solve(){
string s;
cin>>s;
int ans=0;
for(int i=0;i<s.size();i++){
if(s[i]=='A') ans++;
}
if(s[0]=='B' || s[s.size()-1]=='B'){
cout<<ans<<"\n";
}
else{
int minn=0x3f3f3f3f;
int jian=0;
for(int i=0;i<s.size();i++){
if(s[i]=='A') jian++;
else{
minn=min(minn,jian);
jian=0;
}
}
minn=min(minn,jian);
//cout<<jian<<"\n";
cout<<ans-minn<<"\n";
}
}
int main(){
IOS;
cin>>t;
while(t--) solve();
return 0;
}
:
#include <bits/stdc++.h>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll qmi(ll x,ll y,int mod){
ll res=1;
while(y){if(y&1) res=res*x%mod;y>>=1;x=x*x%mod;}
return res;
}
const int N=400010;
int d[N/2];
int idx=0,e[N],ne[N],h[N],vist[N];
inline void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool st[N/2];
int t;
int n,stt,ed,dists=0x3f3f3f3f,diste=0x3f3f3f3f;
int tag;
void tp(int u){
st[u]=true;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(st[j] || d[j]==0) continue;
d[j]--,d[u]--;
if(u==tag) tag=j;
if(d[j]!=1) continue;
tp(j);
}
st[u]=false;
}
void dfs(int u,int d){
vist[u]=true;
if(u==stt) dists=min(dists,d);
if(u==ed) diste=min(diste,d);
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(vist[j]) continue;
dfs(j,d+1);
}
vist[u]=false;
}
void solve(){
cin>>n>>stt>>ed;
tag=ed;
idx=0;
dists=diste=0x3f3f3f3f;
//memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
d[i]=0;
h[i]=-1;
st[i]=false;
vist[i]=false;
}
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
d[a]++,d[b]++;
}
for(int i=1;i<=n;i++){
if(d[i]==1) tp(i);
}
//cout<<tag<<"\n";
if(stt==ed){
cout<<"NO\n";
return;
}
if(d[ed]>=2){
cout<<"YES\n";
return;
}
dfs(tag,0);
if(dists>diste) cout<<"YES\n";
else cout<<"NO\n";
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--) solve();
return 0;
}
最后阿巴阿巴,好希望能变强啊!