2025GDCPC广东省赛游记(附赛时代码)

我觉得算是给swan的自证之旅画上一个句号吧...说实话HDU给我带来的不止是排位上的压力,更多的是对自己能力的怀疑,特别是pluto不明说但是我很清楚的看不起(没有责备本人的意思),evil和jxj之类的总感觉看到我就是看小丑的眼神(我觉得主要是自己自卑所以觉得所有人都讨厌自己),连约饭都没人陪我了呜呜

我感觉全世界都开始怀疑我vp的时候全部都在抄题解,然后cf的分数也是作弊得来的,我不配打acm之类的,这种主要是自己给自己的压力犹如顿刀子割肉般没日没夜的折磨我,被队友抛弃被自己否定

转机就算是南昌吧,你也可以看到南昌结束之后swan疯狂的强调自己的贡献啥的(也跟猫猫道个歉),其实也是希望能像其他人证明自己,说这个铜牌我没有拖后腿云云,总之感觉自己这一个学期都被沟槽的HDU毁了,陷入了一种很恐怖的给自己上压力的恶性循环。直到省赛,所有人同台竞技,然后能打到校内第三的这个位置,我才算是长出一口气,才好意思舔着个脸再去问猫猫或者鸡哥愿不愿意捞我这种事情

emo的回顾到此结束,还是回顾下比赛历程吧,这场我们队真的算是大起大落大起大落,好在最后极限翻盘。比赛前一个比较错误的战略就是让sherlock去写签到去了,然后WA了一发换我重新敲才过了,这个时候我队已经陷入了不小的罚时劣势,此乃一落。然后cmjj的模拟一发过,除了大哥队率先进入两题区,此乃一起。现在签到结束了,两道铜牌题卡住了,被其他几个队快速追上,虽然中间sherlock先过了个H但是在比起铜牌题全出还是差一题,再次掉到银牌岌岌可危的位置。H过的时候一小时出头,然后直到3小时15分钟才终于出了G,但是这个时候的罚时劣势已经巨大,封榜前已经是73名,而银牌线是79名,如果出不了题那银牌都拿不到。在此之前swan的J题还wa了好几发,然后开始研究I,很长时间没有机时的sherlock居然一直在看我的代码(太感动了呜呜),然后找到了错误原因,在封榜之后开敲。而sherlock敲的同时我这边I也找到了正确的容斥方式,两个人就开始抢电脑,最后两个人连续三分钟内连开两题成功跻身六题区(还藏了一手演pluto)

最后说一下参赛环境吧,我们是在广州外语外贸大学的赛点参赛的,虽然主办方的教练们都在群里哭穷,我们对省赛的期望也不是特别高。但是真的是相当出乎意料地优秀的参赛体验,比起去年几十万经费的港科广真的好了不是一点半点,PTA的经典连接不上服务器我觉得可以接受吧,然后麦麦是热的就已经赢了南昌太多,更别说去年某校的减脂三明治了。本来大家以为没有牌子没有滚榜啥的,最后居然是在我们这个赛点线下滚了榜,牌子也说之后会寄到学校,赛时的气球也安排到位了,总之我觉得这算是我人生中第二棒的一次参赛体验了(中大校赛免费参赛还送衣服送杯子送麦麦这个真的是很难超越了),感谢所有为比赛付出的老师,志愿者和后勤工作人员们

然后把代码贴一下吧,签到我没存懒得存

I题

cpp 复制代码
#include <bits/stdc++.h>
#define all(a) a.begin(),a.end()
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
/*ll mod=1e9+7;
ll N=1e5+10;
ll fact[N],infact[N];
void ini(){
	fact[0]=infact[0]=1;
	for(int i=1;i<N;i++){
		fact[i]=fact[i-1]*i%mod;
		infact[i]=qpow(fact[i],mod-2);
	}
}
ll C(lla,ll b){
	if(a<b) return 0;
	return fact[a]*infact[b]%mod*infact[a-b]%mod;
}*/

void solve(){
	ll n; scanf("%lld",&n);
	vector<vector<ll> > cnt(4,vector<ll>(1e6+10,0));
	map<tuple<ll,ll,ll>,ll> mp;
	vector<tuple<ll,ll,ll> > qq;
	for(int i=0;i<n;i++){
		ll a,b,c; scanf("%lld%lld%lld",&a,&b,&c);
		cnt[1][a]++; cnt[2][b]++; cnt[3][c]++;
		mp[{a,0,c}]++; mp[{a,b,0}]++; mp[{0,b,c}]++;
		qq.push_back({a,b,c});
	}
	ll ans=0;
	for(auto [a,b,c]:qq){
		// 我在这里考虑的是最后的东西和a,b,c完全一致 
		ll x=cnt[1][a]-mp[{a,0,c}]-mp[{a,b,0}]+1;
		ll y=cnt[2][b]-mp[{a,b,0}]-mp[{0,b,c}]+1;
		ll z=cnt[3][c]-mp[{a,0,c}]-mp[{0,b,c}]+1;
		ll d=mp[{0,b,c}]-1,f=mp[{a,0,c}]-1,e=mp[{a,b,0}]-1;
		//printf("%lld %lld %lld %lld %lld %lld ",x,y,z,d,e,f);
		//printf("add %lld ",x*y+y*z+x*z);
		//printf("add %lld ",(d+e+f)*(d+e+f-1)/2);
		//printf("add %lld\n",(a+b+c)*(d+e+f));
		//printf("add %lld\n",x*y+y*z+x*z+(d+e+f)*(d+e+f-1)/2+(a+b+c)*(d+e+f));
		ans+=x*y+y*z+x*z+(d+e+f)*(d+e+f-1)/2+(x+y+z)*(d+e+f);
	}
	printf("%lld\n",ans);
}

int main(){
	int T=1;
	//scanf("%d",&T);
	while(T--){
		solve();
	}
	return 0;
}

J题

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;
#define int long long 
const int N=1e6+10;
const int MOD = 998244353;


int qpow(int num,int k)
{
	int res = 1;
	while(k)
	{
		if(k % 2) res = res * num;
		num = num * num;
		k = k >> 1ll;
	}
	return res;
}

int a[N];
int e[N],ne[N],h[N],w[N];
int idx;
int ans[N];

struct Node
{
	int time;
	int tar;
	int val;
	
	bool operator < (const Node &other) const 
	{
		return time > other.time;	
	}
};

void add(int x,int y,int z)
{
	e[++idx] = y, ne[idx] = h[x] , h[x] = idx,w[idx] = z;
}

void solve()
{
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) cin>>a[i],ans[i] = MOD * MOD;
	//cout<<n<<"\n";
	priority_queue< Node , vector<Node> >q;
	
	for(int i=1;i<=k;i++)
	{
		int t,num;
		cin>>t>>num;
		for(int j=1;j<=num;j++) 
		{
			int x;
			cin>>x;
			q.push({t,x,0});
		}
	}
	
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
	}
	
	for(int i=1;i<=n;i++)
	{
		if(a[i] == 0)
		{
			//cout<<i<<"\n";
			ans[i]=0;
			for(int j=h[i];j;j=ne[j])
			{
				q.push({w[j],e[j],1});
			}
		}
	}
	
	while(!q.empty())
	{
		auto [time,index,val] = q.top();
		//cout<<time<<" "<<index<<" "<<val<<"\n";
		q.pop();
		if(a[index] == 0) continue;
		
		if(val == 1) a[index] --;
		if(val == 0) a[index] = 0;
		 
		if(a[index] == 0)
		{
			ans[index] = time;
			for(int i=h[index];i;i=ne[i])
			{
				int son = e[i];
				if(a[son]!=0)
				{
					q.push({time+w[i],son,1});
				}
			}
		}
	}
	//cout<<n<<"\n";
	for(int i=1;i<=n;i++)
	{
		if(ans[i] == MOD * MOD) cout<<-1<<" ";
		else cout<<ans[i]<<" ";
	}
}

signed main()
{
	int t=1;
	//cin>>t;
	
	while(t--)
	{
		solve();
	}
}

F题

cpp 复制代码
#include <bits/stdc++.h>
#define all(a) a.begin(),a.end()
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void solve(){
	ll n,m,t;
	cin>>n>>m>>t;
	ll k;
	cin>>k;
	ll tn=0,ttime=0;
	map<char,ll> mp,cnt;
	priority_queue<ll,vector<ll>,greater<ll> > qu;
	for(ll i=1;i<=k;i++){
		ll tt;
		char c;
		string str;
		cin>>tt>>c>>str;
		if(cnt[c]) continue;
		if(str=="ac"){
			ttime+=(tt+mp[c]*20);
			tn++;
			cnt[c]=1;
		}
		if(str=="rj"){
			mp[c]++;
		}
		if(str=="pd"){
			cnt[c]=1;
			qu.push(tt+mp[c]*20);
			//cout<<"qu push "<<tt+mp[c]*20<<" "<<c<<"\n";
		}
	}
	if(tn>m||tn==m&&ttime<t){
		cout<<"0"<<"\n";
		return ;
	}
	//cout<<tn<<" "<<ttime<<"\n\n";
	ll g=0;
	while(!qu.empty()){
		g++;
		tn++;
		ll tp=qu.top();
		//cout<<"top:"<<tp; 
		ttime+=tp;
		qu.pop();
		//cout<<" "<<tn<<" "<<ttime<<"\n";
		if(tn>m||tn==m&&ttime<t){
			cout<<g<<"\n";
			return ;
		}
	}
	cout<<"-1"<<"\n";
	return ;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

H题

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;
#define int long long 
const int N=1e6+10;
const int MOD = 998244353;


int qpow(int num,int k)
{
	int res = 1;
	while(k)
	{
		if(k % 2) res = res * num;
		num = num * num;
		k = k >> 1ll;
	}
	return res;
}

int sum[30];
int a[N];
int dp[30];

void solve()
{
	int n,k;
	cin>>n>>k;
	string s;
	cin>>s;
	
	for(int i=0;i<n;i++)
	{
		int now = s[i] - 'a';
		int num = 1;
		for(int j=0;j<26;j++)
		{
			num = (num + sum[j]) % MOD;
		}
		num = (num - dp[now] + MOD) % MOD;
		dp[now] = (dp[now] + num) % MOD;
		//cout<<i<<" "<<num<<"\n";
		a[i] = num;
		if(i >= k) sum[s[i-k]-'a'] = (sum[s[i-k]-'a'] + a[i-k]) % MOD;
	}
	int res =0;
	for(int i=0;i<26;i++) res = (res + dp[i]) % MOD,sum[i]=0,dp[i]=0;
	cout<<res<<"\n";
}

signed main()
{
	int t=1;
	cin>>t;
	
	while(t--)
	{
		solve();
	}
}

D题

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;
#define int long long 
const int N=1e6+10;
const int MOD = 998244353;


int qpow(int num,int k)
{
	int res = 1;
	while(k)
	{
		if(k % 2) res = res * num;
		num = num * num;
		k = k >> 1ll;
	}
	return res;
}

int dp[N];
int a[N];
int ask[N];

void solve()
{
	int n,m;
	cin>>n>>m;
	map<int,int>mp;
	for(int i=1;i<=n;i++) cin>>a[i],dp[a[i]]=1;
	
	int now = 0;
	int maxvalue=0;
	for(int i=1;i<=a[n];i++)	
	{
		if(now +1 <= n && i == a[now+1]) now++;
		dp[i] = dp[i - a[now]] + dp[a[now]];
		mp[dp[i]]++;
		maxvalue = max(maxvalue,dp[i]);
		//cout<<i<<" "<<dp[i]<<"\n";
	}
	//for(int i=1;i<=maxvalue;i++) cout<<mp[i]<<"\n";
	
	for(int i=2;i<=maxvalue;i++) mp[i] += mp[i-1];
	
	for(int i=1;i<=m;i++) cin>>ask[i];
	for(int i=1;i<=m;i++)
	{
		if(ask[i]<=maxvalue) cout<<mp[ask[i]]<<" ";
		else cout<<mp[maxvalue]<<" ";
	}
}

signed main()
{
	int t=1;
	//cin>>t;
	
	while(t--)
	{
		solve();
	}
}
相关推荐
cpp加油站几秒前
(保姆级教程)Trae中使用clangd插件实现c++代码函数列表、变量补全、代码跳转等功能
c++·ai编程·trae
Coovally AI模型快速验证1 分钟前
基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破
人工智能·神经网络·算法·yolo·目标检测·无人机·cocos2d
鑫鑫向栄25 分钟前
[蓝桥杯]填字母游戏
数据结构·c++·算法·蓝桥杯·深度优先
电鱼智能的电小鱼27 分钟前
无人机巡检智能边缘计算终端技术方案‌‌——基于EFISH-SCB-RK3588工控机/SAIL-RK3588核心板的国产化替代方案‌
网络·人工智能·嵌入式硬件·算法·机器人·无人机·边缘计算
筏.k32 分钟前
C++ 新特性详解:Lambda 表达式全解析(含实战案例)
c语言·开发语言·c++
纪元A梦2 小时前
分布式拜占庭容错算法——实现工作量证明(PoW)算法详解
java·分布式·算法
_李白_2 小时前
分布式互斥算法
分布式·算法
将编程培养成爱好2 小时前
《复制粘贴的奇迹:小明的原型工厂》
c++·设计模式·原型模式
曾几何时`2 小时前
C++——智能指针 weak_ptr
开发语言·c++
楽码2 小时前
概率算法的空乘就坐问题
后端·算法·机器学习