CSP-S 2020 游记

友链

以下的爹的CSP游记
w y D o g wyDog wyDog的CSP游记
x j D o g xjDog xjDog的CSP游记
H S Z G B HSZGB HSZGB的CSP游记
l r z lrz lrz的CSP游记


Before the contest

初赛自然考得很稳健,估分81.5最后也是 g e t get get到了78.5QwQ

考前一个月开始停晚修,晚上过来写题,二四六打牛客比赛,感觉都还阔以
考前两周停课,天天打比赛,偶尔能窜到前面去,大部分时候都很辣鸡(艹)

考前三天开始默板,默完之后信心满满啊(虽然之后p都没用上【艹】)


During the contest

比赛日,日常赖床
play game之后就上车了,一点左右到的广州,对再来到这个比赛一直来的地方还是很有感触的

然后因为吃饭的问题错过了13:30的第一波拍照,好在13:50又补拍了一张?
过去的时候急急忙忙的,带了一桶士力架被误以为是泡面2333(忘记分给各位bb了)
结果去的时候甚至忘记了考场QwQ,回来看完之后就直接进考场了(好在在车上看过了板子)

解压了好久,艹

T1是个老傻逼题了,问你从某一天开始过去多少天的日期
这种题就tm纯种脑瘫好吧。。。
我是预处理三百万以内的答案,这样就可以愉快的躲开恶心的地方
接着因为每四百年的天数是一定的,取模完之后讨论一下就好了
复杂度: O ( B l o c k + T l o g K ) O(Block+TlogK) O(Block+TlogK) B l o c k Block Block是预处理部分的大小, K K K是四百年的天数(在二十万以内)

T2又是脑瘫题,是给出了某些二进制位需要某些材料,问原有的材料可以多选取多少数
显然离散化以后处理一下位数就好了,复杂度 O ( m log ⁡ m + k ) O(m\log m+k) O(mlogm+k)

T3是给出一些加或者乘或者递归的函数,问执行某些函数之后的序列值
看到数据范围中有给出提示让我往图的那方面想,想过拓扑排序或者是树上 d p dp dp去骗分,但最后由于只能统计一半打了 10 p t s 10pts 10pts暴力就滚粗了

T4???
没有想法,一开始是用指针维护最大最小值,发现这玩意儿会上蹿下跳就放弃了打了暴力只有20.。。(考完后才想起可以用堆,md少了五十分血亏)

于是估分100+100+10+20=230,感觉很慌


After the contest

wyc爷估分100+100+100+70=370实在是太强了,T3的正反两边做我是真没想到(虽然想过考虑乘号对加号的贡献),感觉题还是做得太少了

其它校里的大爷考得貌似都不是很好?我这种打满暴力的选手反而考得还行???
唉,学校的未来该咋办呢。。。

接着就是上各种OJ估分了

信奥信息网:100+65+10+20=195
...

牛客:80+95+10+20=205
...

洛谷:90+80+25+0=195
...
计蒜客:90+75+10+5=190
...

感觉还是太菜了,T1可能是细节没处理到位,T2应该是我的二分写炸了吧

转眼间这么久时间的学习总算画上了句号,虽然也可能是顿号,但回归文化课是在所难免的
也有些怀念在教室里的学习生活了(虽然我觉得我后面可能会后悔QwQ),希望以后继续努力吧!
2020 − 11 − 8 2020-11-8 2020118


Something

考完试之后发现T1错的地方竟然是???
没判12月32日????????
就多了这一行
。。。
然后。。。
...
...
我吐了呀

而T2挂分的原因是因为左移的话 l o n g   l o n g long\ long long long范围内的左移锅了

然后由于题目比较水,是不用处理饲料相同的情况(即不用离散化二分处理)
加上一个 l l ll ll
...
...
去掉二分后...
艹艹艹艹艹

这样一看,最坏情况T1 90,T2 60,我无了


考场代码

T1

#include<cstdio> 
#include<cctype>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;int Q,tot,g[401],k;LL n;
const int d1[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
const int d2[13]={0,31,60,91,121,152,182,213,244,274,305,335,366};
const int rz[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const int Every400=146097;
inline LL read()
{
	char c;LL d=1,f=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
struct node{int day,month,year;bool flg;}f[2999775],ans,x;
inline bool rn(node x)
{
	if(x.flg) return ((x.year-1)%4)==0;
	if(x.year<1582) return (x.year)%4==0;
	return (x.year%400==0||x.year%100!=0&&x.year%4==0);
}
inline void print(node x)
{
	printf("%d %d %d",x.day,x.month,x.year);
	if(x.flg) puts(" BC");else puts("");
	return; 
} 
signed main()
{
	freopen("julian.in","r",stdin);
	freopen("julian.out","w",stdout);
	f[0]=(node){1,1,4713,1};
	for(register int i=1;i<=2999774;i++)
	{
		f[i]=f[i-1];f[i].day++;
		if(f[i].year==1582&&f[i].month==10&&f[i].day==5&&f[i].flg==0) {f[i].day=15;continue;}
		if(f[i].year==1&&f[i].month==12&&f[i].day==32&&f[i].flg==1) {f[i]=(node){1,1,1,0};continue;}
		if(f[i].day<=rz[f[i].month]+(f[i].month==2&&rn(f[i]))) continue;
		f[i].month++;f[i].day=1;
		if(f[i].month<=12) continue;
		if(f[i].flg) f[i].year--;else f[i].year++;
		f[i].month=1;f[i].day=1;
	}
	for(register int i=3501;i<=3900;i++)
	{
		x=(node){0,0,i,0};
		if(rn(x)) g[i-3500]=g[i-1-3500]+366;else g[i-3500]=g[i-1-3500]+365;
	}
	Q=read();
	while(Q--)
	{
		n=read();
		if(n<=2999774ll)
		{
			print(f[n]);
			continue;
		}
		n-=2999774;ans=f[2999774];
		ans.year+=n/Every400*400;n%=Every400;
		if(n>365)
		{
			k=lower_bound(g+1,g+401,n)-g;
			while(g[k]>n) k--;
			ans.year+=k;
			n-=g[k];
		}
		for(register int i=11;i;i--) if(rn(ans))
		{
			if(n>=d2[i])
			{
				n-=d2[i];
				ans.month=i+1;
				break;
			}
		}
		else if(n>=d1[i]) {n-=d1[i];ans.month=i+1;break;}
		ans.day=n+1;
		print(ans);
	}
	fclose(stdin);
	fclose(stdout);
}

T2

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define LL long long
#define ULL unsigned long long
#define N 1000010
using namespace std;int n,m,k,c,p,q,b[N],mm,wz;
ULL now,res=1,S;
bool flg[64],tp,ok[N];
struct node{int p,q;}a[N];
inline LL read()
{
	char c;LL d=1,f=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
signed main()
{
	freopen("zoo.in","r",stdin);
	freopen("zoo.out","w",stdout);
	n=read();m=read();c=read();k=read();
	if(k==64) S=18446744073709551615ull,tp=1;else S=(1<<k);
	for(register int i=1;i<=n;i++) now|=read();
	for(register int i=1;i<=m;i++) a[i].p=read(),a[i].q=read(),b[i]=a[i].q;
	sort(b+1,b+1+m);
	mm=unique(b+1,b+1+m)-b-1;
	for(register int i=1;i<=m;i++)
	{
		wz=lower_bound(b+1,b+1+mm,a[i].q)-b;
		if((now>>a[i].p)&1)	ok[wz]=true;
	}
	for(register int i=1;i<=m;i++) 
	{
		wz=lower_bound(b+1,b+1+mm,a[i].q)-b;
		if(!ok[wz]) flg[a[i].p]=true;
	}
	for(register int i=0;i<k;i++) if(flg[i]) S>>=1;
	if(S==18446744073709551615ull&&n==0) puts("18446744073709551616");else
	printf("%llu",S-n+tp);
	fclose(stdin);
	fclose(stdout);
}

T3

#include<vector>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 100010
#define mod 998244353
using namespace std;int n,a[N],cs[N],js[N][2],m,opt[N],len,q,x;
vector<int>e[N];
inline LL read()
{
	char c;LL d=1,f=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
inline void Doit(int x)
{
	if(opt[x]==1) {(a[js[x][0]]+=js[x][1])%=mod;return;}
	if(opt[x]==2)
	{
		for(register int i=1;i<=n;i++) (a[i]*=cs[x])%=mod;
		return;
	}
	if(opt[x]==3)
	{
		for(register int i=0;i<e[x].size();i++) Doit(e[x][i]);
		return;
	}
}
signed main()
{
	freopen("call.in","r",stdin);
	freopen("call.out","w",stdout);
	n=read();
	for(register int i=1;i<=n;i++) a[i]=read();
	m=read();
	for(register int i=1;i<=m;i++)
	{
		opt[i]=read();
		if(opt[i]==1) js[i][0]=read(),js[i][1]=read();
		if(opt[i]==2) cs[i]=read();
		if(opt[i]==3) {len=read();for(register int j=0;j<len;j++) e[i].push_back(read());} 
	}
	q=read();
	for(register int i=1;i<=q;i++) x=read(),Doit(x);
	for(register int i=1;i<=n;i++) printf("%d ",a[i]);
	fclose(stdin);
	fclose(stdout);
}

T4

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 1000010
using namespace std;int T,n,a[N],k,x,y,l,r,vis[N],b[N],now[N];
inline LL read()
{
	char c;LL d=1,f=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
inline int solve()
{
	memcpy(b,a,sizeof(a));
	memset(vis,0,sizeof(vis));
	now[1]=n;
	for(l=1;l<n;l++)
	{
		int minn=l,maxn=l;
		for(register int i=l;i<=n;i++) 
		{
			if(a[i]<a[minn]) minn=i;
			if(a[i]>=a[maxn]) maxn=i;
		}
		if(maxn==minn) return 1;
		if(vis[minn]) return now[l]+1;
		vis[maxn]=l;a[maxn]-=a[minn];now[l+1]=now[l]-1;
	}
	memcpy(a,b,sizeof(b));
	return now[l];
}
signed main()
{
	freopen("snakes.in","r",stdin);
	freopen("snakes.out","w",stdout);
	T=read()-1;
	n=read();
	for(register int i=1;i<=n;i++) a[i]=read();
	printf("%d\n",solve());
	while(T--)
	{
		k=read();
		for(register int i=1;i<=k;i++) x=read(),y=read(),a[x]=y;
		printf("%d\n",solve());
	}
	fclose(stdin);
	fclose(stdout);
}

Result

...
T2被卡了。。。。竟然不造最大数据。。。。
185在GD排158名吧,一等肯定有了,160大概200名,215大概前一百,240大概前四十了

吸取教训吧,md以后1<<k都加 l o n g   l o n g long\ long long long
2020 − 11 − 17 2020-11-17 20201117


后记

蓝勾勾了,感动
md差20 p t s pts pts七级

...
2020 − 12 − 2 2020-12-2 2020122

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页