ABC_406

ABC_406

可恶看番看上头,忘记是8点开始了。

ABC_406

A - Not Acceptable

超 · 水题。两分钟(加上打开VScode的时间),一遍过。

code

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=1e6+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int a,b,c,d;
fuck void solve()
{
    cin>>a>>b>>c>>d;
    if(c<a)cout<<"Yes"<<"\n";
    else if(c==a&&d<=b)cout<<"Yes"<<"\n";
    else cout<<"No"<<"\n";
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

B - Product Calculator

常 · 水题。直接__int128暴力运算。15分钟,一遍过。(至于为什么这种题会花了15分钟,我总不能说我是一边玩舟一边和妹子聊天一边打比赛吧

code

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=1e6+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck i8 read()
{
    i8 x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(i8 x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
i8 n,k,p=1;
i8 a[N],ans=1;
fuck void solve()
{
    n=read(),k=read(),k-=1;
    while(k--)p*=10;
    // write(p);cout<<"\n";
    for(int i=1;i<=n;i++)
    {
        a[i]=read(),ans=ans*a[i];
        // write(ans);cout<<"\n";
        if(ans>=p*10)ans=1;
    }
    write(ans);
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

C - ~

真 · 正常题。赛场上的思路是将 $ N $ 个数的关系处理出来,储存在数组 $ p $ 里,如果 $ a_{i}<a_{i+1} $ ,那么 $ p[i]=1 $ ,反之 $ p[i]=2 $ 。

首先在此定义:一个极大的合法连续子串,满足子串开头前加一个数会使子串不合法,子串末尾加一个数会使子串不合法。

由于题目中说一个合法的连续子串开头需满足 $ a_{1}<a_{2} $ ,也就是在p数组中需要以1起手,一段合法的连续子串就可以表示为 : $ pre个1+无所谓个2+bac个1 $ 。其中 $ pre个1 $ 前面和 $ bac个1 $ 后面都是2或者没有,这样就找到了一个极大子串,而这一个子串的答案为 $ pre*bac $ 。同时,显而易见,该极大子串的 $ bac $ 为下一个极大子串的 $ pre $ ,相当于每次只需要处理 $ bac $ 即可,并记得最后加上末尾一段。

时间复杂度:$ O(n) $ 。

code

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=1e6+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int n,ans=0;
int a[N];
int p[N];
fuck void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(i>=2)p[i-1]=(a[i]>a[i-1]?1:2);
    }
    int pre=0,bac=0,f=1;
    for(int i=1;i<=n-1;i++)
    {
        if(p[i-1]==2&&p[i]==1)f=3;//开始计算bac
        if(p[i]==1&&f==1)pre++;
        if(p[i]==1&&f==3)bac++;
        // cout<<pre<<" "<<bac<<"\n";
        if(p[i-1]==1&&p[i]==2&&f==3)f=1,ans+=pre*bac,pre=bac,bac=0;//进入下一个子串
       
    }
    cout<<ans+pre*bac<<"\n";//最后加上末尾
    
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

D - Garbage Removal

次 · 正常题。由于晚了半个小时才开,结果没来得及敲代码。个人感觉比 $ C $ 题简单。赛后补题,20分钟,两遍过。

由于行列都很大,显然不可能存图,考虑只需要维护一行或是一列的信息,于是选择把行列分开维护。

开两个 $ vector $ ,分别表示,每一行或列对于所有列或行的影响。并用两个 $ ans $ 数组维护行列的答案。具体地,当 $ x $ 行被删除时,遍历行 $ vector[x] $ ,将对应的列 $ ans-- $ ,同时将该行标记,下次询问时直接输出 $ 0 $ 。对于列同理。

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=2e5+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int n,m,k;
vector<int>h[N],l[N];
int ans1[N],ans2[N],vis1[N],vis2[N];
fuck void solve()
{
	memset(vis1,0,sizeof(vis1));
	memset(vis2,0,sizeof(vis2));
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)
	{
		int x,y;cin>>x>>y;
		h[x].push_back(y);ans1[x]++;
		l[y].push_back(x);ans2[y]++;
	}
	int q=read();
	while(q--)
	{
		int op=read(),c=read();
		if(op==1)
		{
			if(vis1[c]==1){cout<<0<<"\n";continue;}
			vis1[c]=1;
			cout<<ans1[c]<<"\n";
			for(auto v:h[c])ans2[v]--;
		}
		else
		{
			if(vis2[c]==1){cout<<0<<"\n";continue;}
			vis2[c]=1;
			cout<<ans2[c]<<"\n";
			for(auto v:l[c])ans1[v]--;
		}
	}
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // for(int i=1;i<=tot;i++)cout<<prime[i]<<"\n";
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

待续

ABC_406

可恶看番看上头,忘记是8点开始了。

ABC_406

A - Not Acceptable

超 · 水题。两分钟(加上打开VScode的时间),一遍过。

code

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=1e6+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int a,b,c,d;
fuck void solve()
{
    cin>>a>>b>>c>>d;
    if(c<a)cout<<"Yes"<<"\n";
    else if(c==a&&d<=b)cout<<"Yes"<<"\n";
    else cout<<"No"<<"\n";
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

B - Product Calculator

常 · 水题。直接__int128暴力运算。15分钟,一遍过。(至于为什么这种题会花了15分钟,我总不能说我是一边玩舟一边和妹子聊天一边打比赛吧

code

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=1e6+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck i8 read()
{
    i8 x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(i8 x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
i8 n,k,p=1;
i8 a[N],ans=1;
fuck void solve()
{
    n=read(),k=read(),k-=1;
    while(k--)p*=10;
    // write(p);cout<<"\n";
    for(int i=1;i<=n;i++)
    {
        a[i]=read(),ans=ans*a[i];
        // write(ans);cout<<"\n";
        if(ans>=p*10)ans=1;
    }
    write(ans);
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

C - ~

真 · 正常题。赛场上的思路是将 $ N $ 个数的关系处理出来,储存在数组 $ p $ 里,如果 $ a_{i}<a_{i+1} $ ,那么 $ p[i]=1 $ ,反之 $ p[i]=2 $ 。

首先在此定义:一个极大的合法连续子串,满足子串开头前加一个数会使子串不合法,子串末尾加一个数会使子串不合法。

由于题目中说一个合法的连续子串开头需满足 $ a_{1}<a_{2} $ ,也就是在p数组中需要以1起手,一段合法的连续子串就可以表示为 : $ pre个1+2+无所谓个2+bac个1 $ 。其中 $ pre个1 $ 前面和 $ bac个1 $ 后面都是2或者没有,这样就找到了一个极大子串,而这一个子串的答案为 $ pre*bac $ 。同时,显而易见,该极大子串的 $ bac $ 为下一个极大子串的 $ pre $ ,相当于每次只需要处理 $ bac $ 即可,并记得最后加上末尾一段。

时间复杂度:$ O(n) $ 。

code

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=1e6+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int n,ans=0;
int a[N];
int p[N];
fuck void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(i>=2)p[i-1]=(a[i]>a[i-1]?1:2);
    }
    int pre=0,bac=0,f=1;
    for(int i=1;i<=n-1;i++)
    {
        if(p[i-1]==2&&p[i]==1)f=3;//开始计算bac
        if(p[i]==1&&f==1)pre++;
        if(p[i]==1&&f==3)bac++;
        // cout<<pre<<" "<<bac<<"\n";
        if(p[i-1]==1&&p[i]==2&&f==3)f=1,ans+=pre*bac,pre=bac,bac=0;//进入下一个子串
       
    }
    cout<<ans+pre*bac<<"\n";//最后加上末尾
    
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

D - Garbage Removal

次 · 正常题。由于晚了半个小时才开,结果没来得及敲代码。个人感觉比 $ C $ 题简单。赛后补题,20分钟,两遍过。

由于行列都很大,显然不可能存图,考虑只需要维护一行或是一列的信息,于是选择把行列分开维护。

开两个 $ vector $ ,分别表示,每一行或列对于所有列或行的影响。并用两个 $ ans $ 数组维护行列的答案。具体地,当 $ x $ 行被删除时,遍历行 $ vector[x] $ ,将对应的列 $ ans-- $ ,同时将该行标记,下次询问时直接输出 $ 0 $ 。对于列同理。

#ifdef ONLINE_JUDGE 
#else 
#define Qiu_Cheng 
#endif 
#include <bits/stdc++.h> 
#define i8  __int128
#define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=2e5+5,M=1e6+520,mod=1e9+7;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int n,m,k;
vector<int>h[N],l[N];
int ans1[N],ans2[N],vis1[N],vis2[N];
fuck void solve()
{
	memset(vis1,0,sizeof(vis1));
	memset(vis2,0,sizeof(vis2));
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)
	{
		int x,y;cin>>x>>y;
		h[x].push_back(y);ans1[x]++;
		l[y].push_back(x);ans2[y]++;
	}
	int q=read();
	while(q--)
	{
		int op=read(),c=read();
		if(op==1)
		{
			if(vis1[c]==1){cout<<0<<"\n";continue;}
			vis1[c]=1;
			cout<<ans1[c]<<"\n";
			for(auto v:h[c])ans2[v]--;
		}
		else
		{
			if(vis2[c]==1){cout<<0<<"\n";continue;}
			vis2[c]=1;
			cout<<ans2[c]<<"\n";
			for(auto v:l[c])ans1[v]--;
		}
	}
}
signed main() 
{ 
#ifdef Qiu_Cheng 
    freopen("1.in","r",stdin); 
    freopen("1.out","w",stdout); 
#endif 
    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // for(int i=1;i<=tot;i++)cout<<prime[i]<<"\n";
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666

完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

posted @ 2025-05-18 16:44  Nightmares_oi  阅读(27)  评论(0)    收藏  举报