首页 > 其他分享 >ABC 模拟赛 | A Passing Contest 001题解记录(A,B,C,D)

ABC 模拟赛 | A Passing Contest 001题解记录(A,B,C,D)

时间:2024-10-01 21:02:17浏览次数:6  
标签:ABC return Contest 题解 ll cin else ans include

比赛链接https://www.luogu.com.cn/contest/126344

[APC001] A - CT

不必多说,多次取模

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<deque>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<random>
using namespace std;
typedef  long long ll;
const ll mod= 988444333;
void fio()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
} 
ll ksm(ll x,ll y)
{
	ll ans=1;
	while(y)
	{
		if(y&1)
		ans*=x;
		x*=x;
		y>>=1;
	}
	return ans;
}
ll gcd(ll x,ll y)
{
	if(y==0)
	return x;
	else
	return gcd(y,x%y);
}
int main()
{
fio();
ll a,b,h,k;
cin>>a>>b>>h>>k;
cout<<(a+k)*(b+k)%mod*(h+k)%mod%mod<<endl;
}

[APC001] B - Checker

隐性条件,每个题目中的字符串长度和小k的字符串长度一样,暴力枚举

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<deque>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<random>
using namespace std;
typedef  long long ll;
const ll mod= 988444333;
void fio()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
} 
ll ksm(ll x,ll y)
{
	ll ans=1;
	while(y)
	{
		if(y&1)
		ans*=x;
		x*=x;
		y>>=1;
	}
	return ans;
}
ll gcd(ll x,ll y)
{
	if(y==0)
	return x;
	else
	return gcd(y,x%y);
}
int main()
{
fio();
ll n;
cin>>n;
string f;
cin>>f;
ll cnt=0;
while(n--)
{
	string x;
	cin>>x;
	ll ans=0;
	for(ll i=0;i<x.size();i++)
	{
		if(f[i]==x[i])
		ans++;
	}
	if(ans>=(x.size()+1)/2)cnt++;
}
cout<<cnt<<endl;
if(cnt==0)
cout<<"Good job!"<<endl;
else
cout<<"Make persistent efforts."<<endl;
}

[APC001] C - Not APC

求字符串能删除多少个子序列APC。
用两个stack维护即可,遇到一个A就用一个栈记住,遇到一个P就查询存a的栈,然后再考虑对AP栈操作。
随后遇到c,只考虑AP栈有无即可

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<deque>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<random>
using namespace std;
typedef  long long ll;
const ll mod= 988444333;
void fio()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
} 
ll ksm(ll x,ll y)
{
	ll ans=1;
	while(y)
	{
		if(y&1)
		ans*=x;
		x*=x;
		y>>=1;
	}
	return ans;
}
ll gcd(ll x,ll y)
{
	if(y==0)
	return x;
	else
	return gcd(y,x%y);
}
pair<ll,pair<ll,ll>>ans[1000052];
bool cd[1000005];
int main()
{
fio();
ll t;
cin>>t;
ll cnt=0;
while(t--)
{
	cnt=0;
	string f;
	cin>>f;
	stack<ll>a;
	stack<pair<ll,ll>>ab;
	for(ll i=0;i<f.size();i++)
	{
		if(f[i]=='A')
		{
			a.push(i);
		}
		else if(f[i]=='P')
		{
			if(!a.empty())
			{
				ab.push({a.top(),i});
				a.pop();
			}
		}
		else 
		{
			if(!ab.empty())
			{
				cnt++;
				ans[cnt]={ab.top().first,{ab.top().second,i}};
				cd[ab.top().first]=1;
				cd[ab.top().second]=1;
				cd[i]=1;
				ab.pop();
			}
		}
	}
	ll l=0;
	for(ll i=0;i<f.size();i++)
	{
		if(cd[i]==0)
		cout<<f[i];
		else
		l++;
		cd[i]=0;
	}
	if(l==f.size())
	cout<<"Perfect";
	cout<<endl;
	cout<<cnt<<endl;
	for(ll i=1;i<=cnt;i++)
	{
		cout<<ans[i].first+1<<" "<<ans[i].second.first+1<<" "<<ans[i].second.second+1<<endl; 
	}
}
}

[APC001] D - Array Again

线段树+map维护,先用vector存储输入信息,然后离散化用map映射,最后敲线段树+lazy标志即可解决

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<deque>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<random>
using namespace std;
typedef  long long ll;
const ll maxn = 1e5+10;
void fio()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
} 
ll ksm(ll x,ll y)
{
	ll ans=1;
	while(y)
	{
		if(y&1)
		ans*=x;
		x*=x;
		y>>=1;
	}
	return ans;
}
ll gcd(ll x,ll y)
{
	if(y==0)
	return x;
	else
	return gcd(y,x%y);
}
struct s
{
	ll l,r;
	ll cs;
	ll lazy=0;
}p[maxn<<2];
ll fa[maxn<<2];
void build(ll i,ll l,ll r)
{
	p[i].l=l;p[i].r=r;
	p[i].cs=0;p[i].lazy=0;
	if(l==r)
	{
	fa[l]=i;
	return ;
	}
	build(i<<1,l,(l+r)>>1);
	build(i<<1|1,(l+r>>1)+1,r);
}
void push_down(ll i)
{
	if(p[i].lazy)
	{
		p[i<<1].lazy=1;
		p[i<<1|1].lazy=1;
		p[i].cs=1;
		if(p[i<<1].cs>0)
		p[i<<1].cs=1;
		if(p[i<<1|1].cs>1)
		p[i<<1|1].cs=1;
		p[i].lazy=0;
	}
}
void upd(ll i,ll x,ll gs)
{
	if(p[i].l==p[i].r)
	{
		p[i].cs+=gs;
		//cout<<p[i].cs<<endl;
		return;
	}
	push_down(i);
	ll mid=(p[i].l+p[i].r)>>1;
	ll i1=i<<1;
	ll i2=i<<1|1; 
	if(x<=mid)
		upd(i1,x,gs);
	if(x>=mid+1)
	upd(i2,x,gs);
	p[i].cs=p[i1].cs+p[i2].cs;
	//cout<<p[i].cs<<endl;
}
void dt(ll i, ll x,ll gs)
{
	if (p[i].l == p[i].r)
	{
		p[i].cs-=gs;
		p[i].cs=max(p[i].cs,(ll)0);
		return;
	}
	push_down(i);
	ll mid = (p[i].l + p[i].r) >> 1;
	ll i1 = i << 1;
	ll i2 = i << 1 | 1;
	if (x <= mid)
		dt(i1, x,gs);
	if (x >= mid + 1)
		dt(i2, x,gs);
	p[i].cs = p[i1].cs + p[i2].cs;
}
ll query(ll i,ll l,ll r)
{
	ll ans=0;
	if(l==p[i].l&&p[i].r==r)
	{
		ans+=p[i].cs;
		return ans;
	}
	push_down(i);
	ll i1=i<<1;
	ll i2=i<<1|1;
	if(l<=p[i1].r)
	{
		if(r<=p[i1].r)
		{
			ans+=query(i1,l,r);
		}
		else
		ans+=query(i1,l,p[i1].r);
	}
	if(r>=p[i2].l)
	{
		if(l>=p[i2].l)
		ans+=query(i2,l,r);
		else
		ans+=query(i2,p[i2].l,r);
    }
    return ans;
}
vector<pair<ll,pair<ll,ll>>>g;
set<ll>q;
map<ll,ll>f;
int main()
{
fio();
ll t;
cin>>t;
build(1,1,t);
while(t--)
{
	ll op;
	cin>>op;
	if(op==1)
	{
		ll x,y;
		cin>>x>>y;
		g.push_back({1,{x,y}});
		q.insert(x);
	}
	else if(op==2)
	{
		ll x,y ;
		cin>>x>>y;
			g.push_back({2,{x,y}});
				q.insert(x);
	}
	else if(op==3)
	{
		g.push_back({3,{0,0}});
	}
	else
	{
		ll x;
		cin>>x;
		g.push_back({4,{x,0}});
			q.insert(x);
	}
}
ll cnt=0;
for(auto j:q)
{
	cnt++;
	f[j]=cnt;
}
for(auto j:g)
{
	ll op=j.first;
	ll op1=j.second.first;
	ll op2=j.second.second;
	if(op==1)
	{
		upd(1,f[op1],op2);
	}
	else if(op==2)
	{
		dt(1,f[op1],op2);
	}
	else if(op==3)
	{
		p[1].lazy=1;
	}
	else 
	{
		cout<<query(1,f[op1],f[op1])<<endl;
	}
}
}

标签:ABC,return,Contest,题解,ll,cin,else,ans,include
From: https://www.cnblogs.com/cjcf/p/18443310

相关文章

  • ABC225F String Cards
    题意给你\(n\)个串\(s_i\),你需要选出\(k\)个串并按照某个顺序拼接起来形成的字符串字典序最小。\(n,k,|s|\le50\)。分析由于顺序不固定,所以我们无法直接DP。而状压的复杂度也太高了,怎么办呢?考虑钦定一个顺序,使得按照这个顺序排列字符串一定最优。一个经典的错误想法......
  • CF1214G Feeling Good 题解
    题目链接点击打开链接题目解法我真菜啊,感觉每一步都不难,但一步都没想到/yun考虑两行\(x,y\)什么时候可以构造出合法的矩形?即\(x\)中需要有\(y\)对应位置为\(0\)的\(1\),\(y\)中需要有\(x\)对应位置为\(0\)的\(1\)归纳一下,\(x\)不是\(y\)的子集且\(y\)不......
  • ABC373 D-F 详解
    D思路说是有向图,实际上可以看作是无向图。因为如果有\(x_{v_j}-x_{u_j}=w_j\),那么就一定有\(x_{u_j}-x_{v_j}=-w_j\)。因为题目保证给出的数量关系没有冲突,所以如果我们知道了一个结点\(a\)的值,那么所有与它有数量关系的结点\(b\)的值都能被推出。从而如果一个连......
  • The 2024 ICPC Asia East Continent Online Contest (II)
    A.GamblingonChoosingRegionals最差情况就是,强队都和你去一起。因此赛站越小,排名也一定越小。然后只要动态实现出每个学校最强的若干只队伍就好了。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64using......
  • CF2018E2 Complex Segments (Hard Version) 题解
    题目描述\(T\)组数据,给定\(n\)条线段\([l_i,r_i]\),称一个线段集合是复杂的,当且仅当:它可以被划分成若干个大小相等的线段组。两条线段相交当且仅当它们在同一组。求用这\(n\)条线段构成的复杂线段集合的最大值。数据范围\(1\len,\sumn\le3\cdot10^5\)。\(1\l......
  • CF280C Game on Tree题解
    题目描述给定一棵有根树,结点编号从1到n。根结点为1号结点。对于每一次操作,等概率的选择一个尚未被删去的结点并将它及其子树全部删去。当所有结点被删除之后游戏结束。也就是说,删除1号结点后游戏即结束。要求求出删除所有结点的期望操作次数。不是哥们,我好不容易国庆......
  • 题解:AtCoder Beginner Contest AT_abc373_d ABC373D Hidden Weights(格式美化版)
    题目传送门题目翻译给你一个NNN个点,MMM条边的有向图,其中边有边......
  • CF429E Points and Segments 题解
    题目链接点击打开链接题目解法真难啊/yun把区间染成红色看作区间\(+1\),染成蓝色看作区间\(-1\),要求是每个点上的数\(\in\{-1,0,1\}\)可以选择的数有\(-1,1\)不太好做,我们考虑将限制变成每个点上的数只能为\(0\)我们记经过点\(x\)的线段数量为\(cnt_x\)如果\(cnt......
  • 题解:P11075 不等关系 加强版
    这是洛谷转移过来的题解,作者是4041nofoundGeoge(我自己,记得关注呀)题目大意对于一个字符串s1,s......
  • [HNOI2010] 城市建设 题解
    题意给定一个图,每次修改一条边的边权,每次修改后输出该图的最小生成树边权和,询问间不独立。思路在线不好做,考虑离线下来,可以使用线段树分治。我们称在当前区间\(\left[l,r\right]\)的边为动态边,不在的边为静态边。但这样每次遍历到叶子节点的时候静态边的数量都是\(m\)的......