乱扯
爆炸的过程是这样的
写了(2.5h)的(T1)过不去大样例,自闭了
决定调(T2)然后过了样例但事实上写的完全是假的
这个时候突然(T1)灵光一闪就没再看(T2)了
然后就一直调(T1)到结束前半小时
然后怀着爆零的觉悟和破碎的心态十来分钟调了一个假的(T3)
然后(T4)看都没看甚至连白给的(20pts)都不带拿的
然后就并不知道自己四个小时做了什么地交程序了
然后就做好了爆零的心理准备
然后发现最后是(40+10+5=55)
有一说一当时发现有分还高兴了一会来着
然后就被各种吊打各种半年白学了
实际上如果先调(T2)是可以拿(90pts)的
(T3)就算想不出拓扑排序啥的纯暴力也有(30pts)啊
(T1)拿个(40pts)又怎样呢
这不就(40+90+30+20=180)了吗
虽然其实也并不算高吧……但是至少能拿的分拿到了,后面心态好点可能也能多往优化的方面想想吧
(T1)出的确实挺令人不知道怎么评价的,但是这次碰到也算是个教训吧
至少联赛的时候要先读完四个题然后把暴力都打了再去求正解
毕竟对于现在这个水平的我……能拿的分有时也就是暴力给的吧
笔记
T1 儒略日
模拟
考试时确实想到了400年跳这个操作,大样例一直差1,是因为有个细节没考虑到
1582这个年份,跳完了400开始跳100的时候,第一个一百年是包含被400整除的那个闰年的,忽略这个会差出一天
同时如果写了跳4,也要注意跳到被100整除不被400整除那年的情况
码力不行,调试不行
T2 动物园
可以枚举每一位的情况算出总共可以承载的动物,处理出2的次方减去(n)就行了
一位可以用有两种情况,一种是没有与他相关的要求,另一种是有要求,但当前动物已经占上了
两个bool数组就可以处理
需要特判两种情况:一是答案为(2^{64}),(ull)存不下。另一种是答案为(2^{64})减一个数,可以用(ull)下0的按位取反得到(2^{64}-1),再减(n-1)
T3 函数调用
题里的“树”是一个提示,这题不需要高级数据结构
可以用调用关系建出一个有向无环图
考虑如果只有1操作,拓扑排序后可以记录每个操作实际被调用次数
如果只有2操作,就是拓扑排序处理出每个操作实际使全体乘的数
混合起来思路也类似,需要注意加法操作会因在其之后进行的乘法操作而重复多次
所以倒序处理所有操作,然后按拓扑序将每个点被调用的次数下传到他调用的所有操作,注意这时也要关注之后的乘法操作对之前的加法操作次数产生的影响
T4 贪吃蛇
思路&(70pts)做法:
对于当前最大的蛇,如果他吃完后没有变成最小的,他就一定再也不会被吃了,因为由单调不降的性质,他的下一条蛇或者放弃决斗,或者吃了以后变得比他小,这个时候他可以放心吃
如果他吃完后变成了最小的,这个时候需要考虑他的下一条蛇是否“有勇气”吃掉他
这种情况下,当有三条蛇时,最大的蛇不敢吃
那么当有四条蛇是最大的蛇敢吃,五条时不敢吃,以此类推
我们需要考虑当前最大值,最小值和次小值,这个可以用(set)来求
用dfs来搜索答案即可
(70pts):
//I didn't mean to show off my English skills, but I can't fix my ShuRuFa.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define N 1000005
#define sll set<node>
ll T;
ll n,a[N];
ll k,t1,t2;
inline ll read()
{
ll f=0,s=0; char c=getchar();
while(c>'9'||c<'0')f=(c=='-'),c=getchar();
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^'0'),c=getchar();
return f?-s:s;
}
ll ans;
struct node
{
ll no,v;
node(){no=v=0;}
node(ll _no,ll _v){no=_no,v=_v;}
bool operator<(const node &b)const{return v!=b.v?v<b.v:no<b.no;}
};
sll S;
//k 1-been taking risks 0-x
//return 1-neat 0-eat
bool dfs(bool k)
{
sll::iterator it1,it2,it3;
if(S.size()<=2)return 1;
while(S.size()>2)
{
it1=S.begin(),it2=it1,it3=S.end(),it2++,it3--;
node mx=*it3,mi=*it1,cm=*it2,de=node(mx.no,mx.v-mi.v);
ll tt=S.size();
S.erase(it1),S.erase(it3),S.insert(de);//eat
if(de<cm)
{
if(!dfs(1))//dare to take the risk
{
ans=tt-1;//eat it
return 1;//the previous snake dare not to
}
else//dare not to take the risk --- same as the expectation, and the previous snake dare to;
{
ans=tt;
return 0;
}
}
if(k)return 1;
}
ans=1;
return 1;
}
int main()
{
//freopen("snakes.in","r",stdin);
//freopen("snakes.out","w",stdout);
T=read();
for(int i=1;i<=T;i++)
{
S.clear();
if(i==1)
{
n=read();
for(int j=1;j<=n;j++)a[j]=read(),S.insert(node(j,a[j]));
}
else
{
k=read();
for(int j=1;j<=k;j++)t1=read(),t2=read(),a[t1]=t2;
for(int j=1;j<=n;j++)S.insert(node(j,a[j]));
}
ans=n;
dfs(0);//there's no snake been taking risks at first
printf("%lld
",ans);
}
return 0;
}
后记
出分,(40+40+20+0=100),数据真的水。
就应该让我爆零一次才好。