前言
点击查看代码
《看得最远的地方》
你是第一个发现我
越面无表情越是心里难过
所以当我不肯落泪地颤抖
你会心疼的抱我在胸口
你比谁都还了解我
内心的渴望比表面来得多
所以当我跌断翅膀的时候
你不扶我但陪我学忍痛
我要去看得最远的地方
和你手舞足蹈聊梦想
像从来没有失过望受过伤
还相信敢飞就有天空那样
我要在看得最远的地方
披第一道曙光在肩膀
被泼过太冷的雨滴和雪花
更坚持微笑要暖得像太阳
你比谁都还了解我
内心的渴望比表面来得多
所以当我跌断翅膀的时候
你不扶我但陪我学忍痛
我要去看得最远的地方
和你手舞足蹈聊梦想
像从来没有失过望受过伤
还相信敢飞就有天空那样
我要在看得最远的地方
披第一道曙光在肩膀
被泼过太冷的雨滴和雪花
更坚持微笑要暖得像太阳
有时候觉得我们很不一样
你能看见我看不到的地方
有时候又觉得我们很像
都爱仰起头不听命运的话
我要去看得最远的地方
和你手舞足蹈聊梦想
像从来没有失过望受过伤
还相信敢飞就有天空那样
我要在看得最远的地方
披第一道曙光在肩膀
被泼过太冷的雨滴和雪花
更坚持微笑要暖得像太阳
今天是拉开座位完全断网并强制使用 windows 打的,用局长 long long time ago 放在 ftp 上的虚拟机,我去不知道为啥那么“好用”,蚌埠煮了。
然后下虚拟机耽误了好长时间……
T1 又放贪心,丫的小样例没过我怎么敢测大样例的?大样例过了?我去那我做法是不是假的为啥小样例过不去……
之后做 T2,因为 T1 没过动不动回去看……
赛后看题解发现 T1 是对的,但我忘记算他连父亲那条边了……
昨天推了首毛不易的歌,所以【数据删除】了,后来发现太唐了不可能写完,就咕着吧,刚才又看了别人的【数据删除】,有点震撼,原谅我过于冷血只感到了震撼,好像这种无法与我的经历引起共鸣的东西,我看了只会感到自卑与同情,原谅我这卑微的一生。
明天还有模拟赛,打了没啥问题,但我后天不想打,想打打板子,不知道能不能商量一下,huge 不是说可以在三场里选一场不打吗?
T1 随机游走
是道贪心,考虑临项交换(好吧我之前不知道这玩意叫这名字),发现 \(x\) 在 \(y\) 前有 \(\dfrac{t_x}{w_x}<\dfrac{t_y}{w_y}\),按这个排序即可。
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const int N=5e5+10;
template<typename Tp> inline void read(Tp&x)
{
x=0;register bool z=true;
register char a=getchar_unlocked();
for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;
for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);
x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,c[N],w[N],dis[N],sum[N]; ll ans,tim; vector<int>e[N];
inline void dfs1(int x)
{
dis[x]=c[x],sum[x]=w[x];
for(int y:e[x]) dfs1(y),dis[x]+=dis[y],sum[x]+=sum[y];
}
inline void dfs2(int x) {ans+=tim*w[x]; for(int y:e[x]) tim+=c[y],dfs2(y);}
signed main()
{
freopen("walk.in","r",stdin),freopen("walk.out","w",stdout);
read(n);
for(int i=2,fa;i<=n;i++) read(fa,c[i]),e[fa].push_back(i);
for(int i=1;i<=n;i++) read(w[i]); dfs1(1);
for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end(),[&](int x,int y){return 1ll*dis[x]*sum[y]<1ll*dis[y]*sum[x];});
dfs2(1),write(ans);
}
T2 分发奖励
类似线段树分治到一个节点就把贡献加进去,出来就撤销,但这题本来就在树上所以直接跑就好,用线段树维护最小值个数。
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
#define mid (l+r>>1)
#define ls (mid<<1)
#define rs (mid<<1|1)
using namespace std;
const int N=5e5+10;
template<typename Tp> inline void read(Tp&x)
{
x=0;register bool z=true;
register char a=getchar_unlocked();
for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;
for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);
x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,tot,in[N],out[N],dep[N],ans[N],sum[N<<1],val[N<<1],add[N<<1];
vector<int>e[N]; set<int>s[N];
inline void dfs(int x)
{in[x]=++tot; for(int y:e[x]) dep[y]=dep[x]+1,dfs(y); out[x]=tot;}
inline void pushup(int p,int l,int r)
{
if(val[ls]<val[rs]) val[p]=val[ls],sum[p]=sum[ls];
else if(val[ls]>val[rs]) val[p]=val[rs],sum[p]=sum[rs];
else val[p]=val[ls],sum[p]=sum[ls]+sum[rs];
}
inline void build(int p,int l,int r)
{
if(l==r) return sum[p]=1,void();
build(ls,l,mid),build(rs,mid+1,r),pushup(p,l,r);
}
inline void spread(int p,int l,int r)
{val[ls]+=add[p],add[ls]+=add[p],val[rs]+=add[p],add[rs]+=add[p],add[p]=0;}
inline void change(int p,int l,int r,int vl,int vr,int d)
{
if(vl<=l&&vr>=r) return val[p]+=d,add[p]+=d,void();
if(add[p]) spread(p,l,r); if(vl<=mid) change(ls,l,mid,vl,vr,d);
if(vr>mid) change(rs,mid+1,r,vl,vr,d); pushup(p,l,r);
}
inline void solve(int x)
{
for(int y:s[x]) change(1,1,n,in[y],out[y],1);
ans[x]=val[1]?n-1:max(0,n-1-sum[1]); for(int y:e[x]) solve(y);
for(int y:s[x]) change(1,1,n,in[y],out[y],-1);
}
signed main()
{
freopen("reward.in","r",stdin),freopen("reward.out","w",stdout);
read(n,m); for(int i=2,x;i<=n;i++) read(x),e[x].push_back(i);
dfs(1),build(1,1,n); for(int i=1,x,y;i<=m;i++)
{
read(x,y); if(dep[x]>dep[y]) swap(x,y);
if(in[x]<=in[y]&&out[x]>=in[y]) s[x].insert(x);
else s[x].insert(x),s[y].insert(y),s[x].insert(y),s[y].insert(x);
}
solve(1); for(int i=1;i<=n;i++) write(ans[i]),putchar_unlocked(' ');
}
T3 卡路里
好像比前两题简单,赛时还没看,直接单调栈加二维查分就可以了。
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=210,M=5010;
template<typename Tp> inline void read(Tp&x)
{
x=0;register bool z=true;
register char a=getchar_unlocked();
for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;
for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);
x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,l[M],r[M],sta[M],a[N][M]; ll ans=-1e9,d[M],sum[M][M];
signed main()
{
freopen("calorie.in","r",stdin),freopen("calorie.out","w",stdout);
read(n,m); for(int i=2;i<=m;i++) read(d[i]),d[i]+=d[i-1];
for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) read(a[j][i]);
for(int i=1;i<=n;i++)
{
sta[0]=0; for(int j=1,top=0;j<=m;j++)
{
while(top&&a[i][sta[top]]<=a[i][j]) top--;
l[j]=sta[top]+1,sta[++top]=j;
}
sta[0]=m+1; for(int j=m,top=0;j;j--)
{
while(top&&a[i][sta[top]]<a[i][j]) top--;
r[j]=sta[top]-1,sta[++top]=j;
}
for(int j=1;j<=m;j++)
{
sum[l[j]][j]+=a[i][j],sum[j+1][r[j]+1]+=a[i][j];
sum[j+1][j]-=a[i][j],sum[l[j]][r[j]+1]-=a[i][j];
}
}
for(int i=1;i<=m;i++) for(int j=1;j<=m;j++)
sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
for(int i=1;i<=m;i++) for(int j=i;j<=m;j++)
ans=max(ans,sum[i][j]-d[j]+d[i]); write(ans);
}
T4 传话游戏
咕咕咕。
标签:26,unlocked,int,void,多校,Tp,read,inline,NOIP2024 From: https://www.cnblogs.com/Charlieljk/p/18571007