我觉得算是给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();
}
}