GDOI-J 2022游记

day -1

来机房听教练讲了一下一些注意事项,然后就开始颓废

好耶逃掉一节自习+一节数学)

orz csh clf cyl zjh zzl

被迫成为卷心菜

分块写挂了(ctmd

csh cyl zzh的QQ邮箱用不了,cyl直接用163 nb啊/qiang

clf在打导弹拦截

焯我最长上升子序列忘了(果然我dp最差

day 0

羡慕js期中考考完了

然而ls还没开始

GDOI后面马上就期中考,直接裂开

文科提前挂科(

下午体育1000m突破个人新高

希望GDOI也能像一样rp++

刚刚去电脑室打游记,刚刚好教练在布置考场

转战初二办公室

打游记时一位英语大佬过来

大佬:下午体育多少

me : ......(省略时间,不想被嘲笑)

大佬:就这

ctmd

生物实验模拟考,抽到一个最不会的:叶片下表皮临时玻片标本

然而最不会的环节竟然一遍过了,但就在最后一步观察清晰物像

老师:你这个清晰吗?

me(重新看了一次显微镜):清晰啊

老师:你再调一下

我转了一下细准焦,感觉没办法再清晰了,然后举手报告老师

老师:你看这是不是比第一次清晰多了

me:......

老师写了个9分,走了,我再看了一次。?不是和第一次差不多吗?

大无语

(以后我绝对要转细准焦螺旋!

晚上被班主任叫到宿舍外面,原因:在宿舍里扮演西班牙斗牛士

day 1

sb舍友害得我:

  • 4:20
  • 4:30
  • 4:50
  • 5:15
  • 5:25
  • 5:35
  • 5:50

以上时间均醒来一次

(跟个闹钟似的/fn

6点起床,headache+sore thorat

害怕的要死,连灌两杯水,好多了

水真是大自然的馈赠

上了节早读,语文渣对待一张名著的测试题表示直接上天

不管了7:50直接逃去机房

太棒了逃掉三节whk

到机房时csh已经在了

(果然越强的人来得越早,我除外

打了一下对拍,没问题

开始录屏+视频监控,发现水杯没带

焯!只能拜托让老师帮我带一个纸水杯装水

start

解压密码:Hope!To@See#You¥Soon

but I do not hope to see you again

T1怎么越来越简单了,明年是不是直接A+B了

由于我轻敌,审错题意,浪费了10分钟

#include<cstdio>
#include<iostream>
#include<string>
#include<map>
using namespace std;
int n,m[4];
map<string,int> people;
int maxn;
string maxp;
int index;
int main()
{
	freopen("zouji.in","r",stdin);
	freopen("zouji.out","w",stdout);
	scanf("%d%d%d%d",&n,&m[1],&m[2],&m[3]);
	for(int i=1,way;i<=n;i++)
	{
		string name;
		cin>>name>>way;
		people[name]+=m[way];
		if(people[name]>maxn)
		{
			maxp=name;
			maxn=people[name];
		}
	}
	cout<<maxp<<" "<<maxn;
	fclose(stdin),fclose(stdout);
	return 0;
}

T2......

焯T2就那么难了吗?

想了亿下,想到

  1. 只有数字一样异或和才相等
  2. 异或的结果一定 0,所以异或和如果要是 0 的话每一个异或的结果都必须是 0

嗯,好像没错

对了一下样例,没错

#include<cstdio>
int n;
int a[100010];
int ans;
int main()
{
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	scanf("%d",&n);
	ans=n;
	a[0]=-114514;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]==0) ans--;
		else if(a[i]==a[i-1]) ans-=2;
	}
	if(ans<=0) printf("-1");
	else printf("%d",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T3什么sb树形结构

我最不会树了,然后你给我搞一个树

I love you CCF.

又是审错题意,发现后直接立马把 dfs 改成 bfs

搞了一个贪心,虽然找不到一组能 hack 的数据(也许是我非?),但感觉肯定错了

#include<cstdio>
#include<queue>
#define ll long long
using namespace std;
priority_queue<pair<ll,int> > q;
struct edge
{
	int v;
	int nxt;
}e[100010];
int head[100010];
int tot;
int n;
ll w[100010];
int son[100010];
int last;
ll ans;
ll m=1;
void add(int u,int v)
{
	e[++tot].v=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}
inline ll max(ll a,ll b)
{
	return a>b?a:b;
}
inline ll min(int a,ll b)
{
	return a<b?a:b;
}
void bfs()
{
	ans=w[1];
	q.push(make_pair(w[1],1));
	while(!q.empty())
	{
		ll maxw=q.top().first;
		int x=q.top().second;
		if(x==last) break;
		last=x;
		ans=min(ans,m*maxw);
//		printf("x=%lld,m=%lld,maxw=%d,m*maxw=%lld,ans=%d\n",x,m,maxw,m*maxw,ans);
		if(son[x]) m=m-1+son[x],q.pop();
		for(int i=head[x];i;i=e[i].nxt)
		{
			int v=e[i].v;
			q.push(make_pair(w[v],v));
		}
	}
}
int main()
{
	freopen("line.in","r",stdin);
	freopen("line.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
	for(int i=2,f;i<=n;i++)
	{
		scanf("%d",&f);
		add(f,i);
		son[f]++;
	}
	bfs();
	printf("%lld",ans);
	fclose(stdin),fclose(stdout);
	return 0;
}

T4 盲猜dp,但是不会打,打了一个 O(n3) 的代码

#include<cstdio>
#define int long long
const int mod=998244353;
int n,m,l,r;
int a[100010],c[100010];
int maxdif;
int ans;
int max(int a,int b)
{
	return a>b?a:b;
}
signed main()
{
	freopen("counting.in","r",stdin);
	freopen("counting.out","w",stdout);
	scanf("%lld%lld%lld%lld",&n,&m,&l,&r);
	for(int i=1,diff,num;i<=n;i++)
	{
		scanf("%lld%lld",&diff,&num);
		a[diff]=num;
		maxdif=max(maxdif,diff);
	}
	for(int d=1;d<=maxdif;d++)
		for(int i=d;i<=maxdif;i+=d)
			if(a[i])
			{
				int tmp=1;
				int add=0;
				int num=0;
				for(int j=i;j<=maxdif&&num+1<=r&&a[j];j+=d)
				{
					num++;
					tmp=(tmp*a[j])%mod;
					if(num>=l) add+=tmp;
				}
				if(num>=l) ans=(ans+add)%mod;
			}
	printf("%lld",ans);
	fclose(stdin),fclose(stdout);
	return 0;
}
/*
6 12 2 3
2 2
4 2
6 2
8 2
12 2
16 2
*/

过了样例,随便用脚造了几组数据,发现 2000 的数据竟然能跑得飞快

(严重怀疑我打了一个假的代码

管他呢就默认它是正解了(

预计:100+100+0+60=260

考完后发现T4在修改 add 的时候没有 %mod

大危

但是感觉会比这个低很多,毕竟T2和T3和T4都不确定

如果我T1炸了就真的没了

打完后看了一下大屏幕(教室的),发现js和cs都一堆人,害……

炸了,回家了

由csh提供给我的帖子发现我T1炸了

f**k

听完讲解,估分:90+0+60+60=210

晚上被迫whk,由于消耗过多脑细胞,9点左右睡着了

day 2

起床后,啥也没干,在电脑前呆坐了好久

调了一下支架(今天在家里考),登上GDOI网址,等密码……

密码:alwayS)weaR(A*masK&

好耶mask的歌词诶

rp++

start

T1一开始以为很简单,打了一个 O(Tn) 的,认为稳过

#include<cstdio>
int T;
int n;
int cnt;
int main()
{
	freopen("bing.in","r",stdin);
	freopen("bing.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		cnt=0;
		scanf("%d",&n);
		for(int i=3;i<=n;i++)
			if((n%i!=0)&&(n%i!=1)&&(n%i!=2)) cnt++;
		printf("%d\n",cnt);
	}
	fclose(stdin),fclose(stdout);
	return 0;
}

T2想了大半天,口胡出一个树形dp

#include<cstdio>
struct edge
{
	int v,nxt;
}e[100010];
int head[100010];
int tot;
int n;
int root;
int son[100010];
int dp[100010];
int ans;
void add(int u,int v)
{
	e[++tot].v=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}
void dfs(int x)
{
	if(!son[x]) dp[x]=1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int v=e[i].v;
		dfs(v);dp[x]+=dp[v];
		son[x]--;
	}
	dp[x]++;
}
int main()
{
	freopen("webpage.in","r",stdin);
	freopen("webpage.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,f;i<=n;i++)
	{
		scanf("%d",&f);
		if(f==-1) root=i;
		else add(f,i),son[f]++;
	}
	dfs(root);
	printf("%d",dp[root]);
	fclose(stdin),fclose(stdout);
	return 0;
}

自己测了几组数据,貌似是正确的,过掉

T3看了一眼,果断放弃

#include<cstdio>
int main()
{
	freopen("clock.in","r",stdin);
	freopen("clock.out","w",stdout);
	printf("I love you GDOI\n");
	printf("Hope to see you soon!\n");
	printf("Hello GDOI!\n");
	printf("赞一波出题组,题目出得好,就是T3大模拟有点……\n");
	printf("没时间做T3qwq\n");
	fclose(stdin),fclose(stdout);
	return 0;
}

T4看了一眼,盲猜迭代加深,乱搞出来了

#include<cstdio>
#include<cstring>
int T;
char str[100010];
int order[100010];
int g[1000][1000];
int nxtx[4]={0,0,1,-1};
int nxty[4]={1,-1,0,0};
int sx,sy;
int n,m;
bool flag;
int len;
void dfs(int x,int y,int now,int limit)
{
	if(x<1||y<1||x>n||y>m)
	{
		flag=1;
		return ;
	}
	if(flag) return ;
	if(now>limit) return ;
	int nx=x+nxtx[order[now]],ny=y+nxty[order[now]];
	if(!g[nx][ny]) dfs(nx,ny,now+1,limit);
	if(flag) return ;
	dfs(x,y,now+1,limit);
	if(flag) return ;
}
int main()
{
	freopen("robot.in","r",stdin);
	freopen("robot.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		memset(g,0,sizeof(g));
		flag=0;
		scanf(" %s",str);
		len=strlen(str);
		for(int i=0;i<len;i++)
		{
			if(str[i]=='D') order[i+1]=0;
			if(str[i]=='A') order[i+1]=1;
			if(str[i]=='S') order[i+1]=2;
			if(str[i]=='W') order[i+1]=3;
		}
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			{
				char ch;
				scanf(" %c",&ch);
				if(ch=='*') g[i][j]=1;
				if(ch=='R') sx=i,sy=j;
			}
		for(int i=1;i<=len&&!flag;i++)
			dfs(sx,sy,1,i);
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

回来检查,发现T1的数据范围会把我T飞,然后开始口胡除了一个 O(Tn) 的东西:

考虑三种情况:

n=ap1n1=bp2n2=cp3

p为物品数量

分解nn1n2的因子,排序去重,剩下的就是不能取到的情况,令q为因子个数,答案为:n2q

对拍,发现是对的,然后就直接打上去了

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int T;
int n;
int a[1000000];
int tot;
int ans;
void divide(int p)
{
	for(int i=1;i<=sqrt(p);i++)
		if(p%i==0)
		{
			if(i>=3) a[++tot]=i;
			if(p/i>=3) a[++tot]=p/i;
		}
}
int main()
{
	freopen("bing.in","r",stdin);
	freopen("bing.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		tot=0,memset(a,0,sizeof(a));
		divide(n),divide(n-1),divide(n-2);
		sort(a+1,a+1+tot);
		tot=unique(a+1,a+1+tot)-(a+1);
		printf("%d\n",n-2-tot);
	}
	fclose(stdin),fclose(stdout);
	return 0;
}

估分:100+100+0+20=220

比day1还差(

吃完午饭:

教练说可以查分了

100+5+100+100=305

大草

GDOI==CCF->用心做题面,用脚做数据

引用一下豪哥的话:

感谢GDOI,GDOI我祝您财源广进阖家幸福

day 3-4 期中考

大寄

day 3 下午查分,310+220=530,1=了,rk100不多也不少

感谢GDOI的水数据

总结

要多打模拟题了

得多刷数论&dp

day 2 T3没时间做就是因为day 2 T1&T2花了太多时间了

加油! @osfly!

day n

发现没有1=

rnmtq

posted @   osfly  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示