NOIP2023 游记及反思
游记
进场前的同学们
柠檬熟了、Nitaycke、Prms_Prmt、b1t
zhicheng,meatherm
开题,很快啊,
第一题不就桶排,今年签到没有去年恶心啊(9:00)
第二题,观察到每个变量最后只有一个值的依靠(或者干脆定值),建图染色就好了啊,冲冲冲,9:30 就过完了样例
此时:优势在我!
第三题,发现就是区间匹配啊,转化为一个四联通的网格图走路,思考特殊性质,不会,思考 bitset 能不能艹 \(4\times 10^4\),没成功,35 pts 跑路。11:20 了,感觉比较寄
第四题,看起来我会 \(O(n^2)\) dp!我还会特殊性质 AB,那我是不是达到预期了啊,然后开始冲暴力。
写完数组,突然想到我的目的是完成挑战,开始结束一定在端点上,写个 dp 式子,发现和某个联考题很像,是可持久化李超?哦 \(ij\) 没有交错啊,那是不是单调队列啊。这个开始的价值动态更新,那扫描线掉区间右端点,加区间左端点,用线段树维护就完了。此时11:40,高兴麻了,那 300+ 是不是到 SC NOIP 队线了,开冲。
12:10 就写完了,怎么过不去样例啊?哦 \(xy\) 反了。测样例 \(2\),过不去,哦多测挂了。
然后还是过不去?为什么啊???
是不是结论假了啊?没道理啊。
…………
然后就没有然后了。
期望得分 \(100+100+35+0=235\),应该没挂分。
出考场不久就发现把相邻判成离散化后相邻了,艹艹艹!喜挂 \(100pts\) !我草怎么考场上被机械降智了啊!原来的 \(335pts\) 至少也是遥遥领先我们机房的,现在寄了吧。
完蛋!我被降智包围了!。自闭。。暴力有 \(56\) 分,,,
出来发现 Meatherm 挂的更严重,第二题开始就心态炸完了。Hanghang 第一题看错了但是是对的(好像还挂了什么分),Nityacke 说他第一题 FailPreTest 了(是 \(10pts\) ),zhicheng 第三题写挂了,绷。
但是今年是 easy round 啊,是不是高二人均阿克了,高一希望比较渺茫啊。
补:高二机房没有 \(3\) 个会 T3 的,遥遥领先!优势在我啊!
反思:
前两道题倒是比较顺利。
第三题可能不在我目前的能力范围内,在时间充裕的时间内思考一个小时然后暴力是正确的。
最大的失误在第四题。第四题很快想出了正解,很快写完了,却没有考虑到这样的罕见的小细节;检查时,我使用了一般的检查方法,也重新思考了逻辑,感觉非常对,然后就没有发现错误。
事实上,如果我预先写好暴力,不仅至少我可以得到最低的暴力分,我应该也可以结合暴力和不算太大的样例 \(2\) 分析出错误。所以非签到题先打暴力显然是明智的选择。
赛后我发现,我犯错误的原因是这样:我在纸上写的 \(O(n^2)\) dp 方程是这样:
\]
这里 \(c_j\) 是从 \(j\) 出发到 \(i\) 的贡献,使用扫描线,\(g\) 是这一个位置不跑步打卡的最大能量。
这是正确的。再结合“一定是从区间端点开始和结束”就可以获得离散化+线段树优化 dp 的正解。但是,这一把 \(O(n^2)\) dp 方程转化为 \(O(m^2)\)(未经线段树优化)的过程只在我脑中进行和代码用线段树实践了,未在纸上清晰地展示出来:这带来一些谬误,由离散化前后的值不同引起。
新的 dp 方程应该是这样:
f_i=-(rev_i+1)d+\max(g_{j}+c_j+rev_jd) & (rev_j>rev_{j-1}+1)\\
f_i=-(rev_i+1)d+\max(g_{j-1}+c_j+rev_jd) & (rev_j=rev_{j-1}+1)\\
\end{matrix}\right.
\]
\(rev\) 指离散化数组代指的原值。这对线段树优化的影响不大。
显然这是容易处理的,我却在脑袋里和代码里忽略了第一种情况,导致答案一直在某几个点偏小,最终也没有发现这个问题。所以,另一个教训是一定要把思路和可能想到的细节清晰地展现在纸上。
贴下代码吧
T1
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e3+5;
int n,m,cnt[maxn][27];
char s[maxn];
pair<int,int> p1[maxn][maxn],p2[maxn][maxn];
bool operator ==(pair<int,int> a,pair<int,int> b){
return a.first==b.first&&a.second==b.second;
}
signed main(){
// system("fc dict4.ans my.out");
freopen("dict.in","r",stdin);
freopen("dict.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s+1;
for(int j=1;j<=m;j++)cnt[i][s[j]-'a'+1]++;
}
for(int i=1;i<=n;i++){
int c=0;
for(int k=1;k<=26;k++){
if(cnt[i][k])p1[i][++c]={k,cnt[i][k]};
}
for(int k=c+1;k<=26;k++)p1[i][k]={0,0};
c=0;
for(int k=26;k>=1;k--){
if(cnt[i][k])p2[i][++c]={k,cnt[i][k]};
}
for(int k=c+1;k<=26;k++)p2[i][k]={0,0};
}
for(int i=1;i<=n;i++){
bool ck=1;
for(int j=1;j<=n;j++){
if(i==j)continue;
bool can=0;
for(int k=1;k<=26;k++){
if(p1[i][k].second==0)break;
if(p1[i][k]!=p2[j][k]){
if(p1[i][k].first!=p2[j][k].first){
can=(p1[i][k].first<p2[j][k].first);
break;
}else{
can=0;
break;
}
}
}
if(!can){
// cout<<i<<" > "<<j<<endl;
ck=0;break;
}
}
cout<<ck;
}
return 0;
}
/*
4 7
abandon
bananaa
baannaa
notnotn
*/
T2
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
vector<pair<int,int> > e[maxn];
int val[maxn],C,Test,n,m,ans[maxn];
const int T=1e5+1,F=1e5+2,U=1e5+3;
int anti(int x){
if(x==T)return F;
if(x==F)return T;
if(x==U)return U;
return -x;
}
bool vis[maxn];
void add_edge(int u,int v,int w){
e[u].push_back({v,w});
e[v].push_back({u,w});
}
void dfs1(int u){
for(auto E:e[u]){
int v=E.first,w=E.second;
if(w)ans[v]=anti(ans[u]);
else ans[v]=ans[u];
if(!vis[v]){
vis[v]=1;
dfs1(v);
}
}
}
bool cur=1;
int cnt=0;
void dfs2(int u){
++cnt;
for(auto E:e[u]){
int v=E.first,w=E.second;
if(!vis[v]){
vis[v]=1;
if(w)ans[v]=anti(ans[u]);
else ans[v]=ans[u];
dfs2(v);
}else{
if(w){
if(ans[v]!=anti(ans[u]))cur=0;
}else{
if(ans[v]!=ans[u])cur=0;
}
}
}
}
signed main(){
freopen("tribool.in","r",stdin);
freopen("tribool.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>C>>Test;
while(Test--){
cin>>n>>m;
for(int i=1;i<=n;i++)val[i]=i;
for(int i=1;i<=m;i++){
char tp;int x,y;
cin>>tp;
if(tp=='T'){
cin>>x;
val[x]=T;
}else if(tp=='F'){
cin>>x;
val[x]=F;
}else if(tp=='U'){
cin>>x;
val[x]=U;
}else if(tp=='+'){
cin>>x>>y;
val[x]=val[y];
}else if(tp=='-'){
cin>>x>>y;
val[x]=anti(val[y]);
}
}
for(int i=1;i<=n;i++)e[i].clear();
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++){
if(val[i]<=(1e5)){
if(val[i]<0)add_edge(i,-val[i],1);
else add_edge(i,val[i],0);
}
}
for(int i=1;i<=n;i++){
if(val[i]>(1e5)){
ans[i]=val[i];
if(!vis[i])vis[i]=1,dfs1(i);
}
}
int Ans=0;
for(int i=1;i<=n;i++){
if(vis[i]==1&&ans[i]==U)++Ans;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
cur=1;cnt=0;
vis[i]=1;ans[i]=T;
dfs2(i);
if(cur==0)Ans+=cnt;
}
}
cout<<Ans<<endl;
}
return 0;
}
/*
1 3
3 3
- 2 1
- 3 2
+ 1 3
3 3
- 2 1
- 3 2
- 1 3
2 2
T 2
U 2
*/
/*
Bless me
I wish that I can get more than 250 at NOIP
Then I may attend NOI2024 as NOID or even SC province team
rp++
British_union
*/
改过的 T4(就是那里错了/ll)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+5;
int C,T,n,m,k,d;
int xds[maxn<<2],add[maxn<<2];
void ADD(int k,int v){
add[k]+=v,xds[k]+=v;
}
#define ls (k<<1)
#define rs (k<<1|1)
#define mid ((l+r)>>1)
void pushdown(int k){
ADD(ls,add[k]);
ADD(rs,add[k]);
add[k]=0;
}
void pushup(int k){
xds[k]=max(xds[ls],xds[rs]);
}
int query(int k,int l,int r,int x,int y){
// assert(xds[k]>=0);
if(x<=l&&r<=y)return xds[k];
pushdown(k);
int res=0;
if(x<=mid)res=max(res,query(ls,l,mid,x,y));
if(mid<y)res=max(res,query(rs,mid+1,r,x,y));
return res;
}
void modify(int k,int l,int r,int x,int y,int v){
// assert(v>=0);
if(x<=l&&r<=y)return ADD(k,v);
pushdown(k);
if(x<=mid)modify(ls,l,mid,x,y,v);
if(mid<y)modify(rs,mid+1,r,x,y,v);
pushup(k);
}
unordered_map<int,int> mp;
int l[maxn],r[maxn],v[maxn];
int qsy[maxn],rev[maxn],cnt=0,now=0;
vector<int> e[maxn];
int f[maxn],g[maxn];
signed main(){
// freopen("run.in","r",stdin);
// freopen("run.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>C>>T;
for(int zfy=1;zfy<=T;zfy++){
memset(xds,0,sizeof(xds));
memset(add,0,sizeof(add));
cin>>n>>m>>k>>d;
cnt=0;
for(int i=1;i<=m;i++){
int x,y;cin>>x>>y;
r[i]=x,l[i]=x-y+1;
cin>>v[i];
qsy[++cnt]=l[i],qsy[++cnt]=r[i];
}
sort(qsy+1,qsy+cnt+1);
mp.clear();
now=0;
for(int i=1;i<=cnt;i++){
if(!mp.count(qsy[i])){
mp[qsy[i]]=++now;
rev[now]=qsy[i];
}
}
// for(int i=1;i<=now;i++)cout<<i<<" "<<rev[i]<<endl;
for(int i=1;i<=m;i++)l[i]=mp[l[i]],r[i]=mp[r[i]];
for(int i=1;i<=now;i++)e[i].clear();
for(int i=1;i<=m;i++)e[r[i]].push_back(i);
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
int L=1,ans=0;
for(int i=1;i<=now;i++){
g[i]=max(g[i-1],f[i-1]);
modify(1,1,now,i,i,(rev[i]==rev[i-1]+1?g[i-1]:g[i])+rev[i]*d);
// modify(1,1,now,i,i,g[i-1]+rev[i]*d);
for(auto u:e[i]){
modify(1,1,now,1,l[u],v[u]);
}
while(L<i&&rev[i]-rev[L]+1>k)++L;
f[i]=-(rev[i]+1)*d+query(1,1,now,L,i);
}
cout<<max(g[now],f[now])<<endl;
}
return 0;
}
/*
1 1
3 2 2 1
2 2 4
3 2 3
*/
/*
I have nothing to say here.
*/
T3
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;
int x[maxn],y[maxn],xm[maxn],ym[maxn];
bool mp[2005][2005],vis[2005][2005];
bool solve(int a[],int b[],int n,int m){
if(a[1]>b[1])return solve(b,a,m,n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
mp[i][j]=(b[i]>a[j]);
}
}
if(!mp[1][1])return 0;
vis[1][1]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i==1&&j==1)continue;
vis[i][j]=(mp[i][j]&(vis[i-1][j]|vis[i][j-1]));
}
}
return vis[m][n];
}
bool solve2(int a[],int b[],int n,int m){
if(a[1]>b[1])return solve(b,a,m,n);
if(a[1]==b[1])return 0;
int r=1;
for(int i=1;i<=m;i++){
if(a[r]>=b[i])return 0;
while(r<=n&&a[r]<b[i])++r;
}
return 1;
}
int C,n,m,q;
signed main(){
freopen("expand.in","r",stdin);
freopen("expand.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>C>>n>>m>>q;
for(int i=1;i<=n;i++)cin>>x[i];
for(int i=1;i<=m;i++)cin>>y[i];
if(C<=7){
cout<<solve(x,y,n,m);
while(q--){
for(int i=1;i<=n;i++)xm[i]=x[i];
for(int i=1;i<=m;i++)ym[i]=y[i];
int kx,ky;cin>>kx>>ky;
while(kx--){
int p,v;cin>>p>>v;
xm[p]=v;
}
while(ky--){
int p,v;cin>>p>>v;
ym[p]=v;
}
cout<<solve(xm,ym,n,m);
}
}else{//Greedy
solve2(x,y,n,m);
while(q--){
for(int i=1;i<=n;i++)xm[i]=x[i];
for(int i=1;i<=m;i++)ym[i]=y[i];
int kx,ky;cin>>kx>>ky;
while(kx--){
int p,v;cin>>p>>v;
xm[p]=v;
}
while(ky--){
int p,v;cin>>p>>v;
ym[p]=v;
}
solve2(xm,ym,n,m);
}
}
return 0;
}
/*
3 3 3 3
8 6 9
1 7 4
1 0
3 0
0 2
1 8
3 5
1 1
2 8
1 7
*/
/*
I think this problem could be difiicult
But I can imagine that Meatherm,Nityacke(SC-114 henghengaa),Zhicheng and others can easily AC it
Such a pity that I have no ability to that :(
I love qsy
*/
NOIP2023 游记及反思的更多相关文章
- CQOI2018 游记 再见OI,既是反思,也是祝福
哎,怎么说呢? 时运不齐,命途多舛? 从头开始说吧. 今年的NOIP大家考的都不尽人意,每个人都有或多或少的失误,全部都几十分几十分地丢.最后大家剩下的觉得可能冲击一下省队的人一共只有7个. 伙伴们变 ...
- 【杂记】CSP-S 2020 游记 &反思
考场经历 吐槽:为什么这个 Enter 的位置怎么诡异啊老是打错.要是考挂了就怪你 开场当然先看了 T1,发现是个日期转换,果然是个百出不厌的模拟题类型,估价细节多到爆炸.看了几分钟题目,对这些规则云 ...
- APIO 2017 游记
//第一次写游记,只是流水账...结果好像确实只去游了…… day-11 省选挂了,即将退役……(然而apio之后得知并没有退役,感谢放我一条活路)(吐槽出题人考完才造数据,题目没有子任务之类的玩意, ...
- 【2019CSP-S游记】咕了好久了撒
对,证书已经发下来了,我才想起来写游记(虽然我个蒟蒻明明就是在写反思) 终于和父母商议好了以后怎么办,顺带找了一下班主任,在机房的电脑敲出来的(我来找教练,然后完全没找着,淦) 79分,众所周知CCF ...
- 2019.7.27 NOIP模拟测试9 反思总结
先来整理题目 T1题目大意:给出n个数字和一个质数作为模数,一个变量x初始值为1.进行m次操作,每次让x随机乘上n个数中的一个,问m次操作以后x的期望值. 答案一定可以用分数表示,输出分子乘分母逆元的 ...
- csp-j2019游记
我一pj蒟蒻这点水平还来写游记? 算了,毕竟是第一次,记录一下吧 noip->csp 话说我跟竞赛是不是天生八字不合啊...... 小学的时候学小奥,等我开始报名比赛,当时似乎所有竞赛都被叫停了 ...
- 【总结】2022GDOI普及组 没得游记
因为是线上,所以没得游记 Day -3 学校安排去7班上课,好耶! 上午全是主科,有一节生物 被你七班捧上天了 被你七班造谣说我暴踩Everyone,还传到九班,给我玩阴的是吧 下午模拟赛,初一第一 ...
- 【20161203-20161208】清华集训2016滚粗记&&酱油记&&游记
先挖坑(这个blog怎么变成游记专用了--) 已更完 #include <cstdio> using namespace std; int main(){ puts("转载请注明 ...
- 【20160722-20160728】NOI2016滚粗记&&酱油记&&游记
先挖坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.c ...
- NOIp2016 游记
DAY -2 不要问我为什么现在就开了一篇博客. 本来想起个NOIp2016爆零记或者NOIp2016退役记之类的,但是感觉现在不能乱立flag了.所以就叫游记算了. 前几场模拟赛崩了一场又一场,RP ...
随机推荐
- 21stUESTC
数矩形 平面上有 \(n\) 个点,这 \(n\) 个点两两不重合.问这 \(n\) 个点可以组成多少个矩形 请注意:矩形的边不必平行于坐标轴. \(4 ≤ n ≤ 1000\) 保证这些点两两不重合 ...
- 【docker-compose】ElasticSearch安装教程
仅供学习参考 ,请勿轻易在生产环境使用 0. 目录树 1. 创建目录 mkdir -p /docker/elasticsearch/conf /docker/elasticsearch/data /d ...
- WxPython跨平台开发框架之表格数据导出到Excel并打开
在 Python 中使用 wxPython 导出实体类列表数据到 Excel,通常可以借助 openpyxl 或 pandas 库来实现.本篇随笔由浅入深,逐步介绍导出Excel文件的操作,然后结合跨 ...
- JS 面试题(2023-09-20更新)
因JS代码实现面试题较多,移至另外一篇文章:JS面试题-代码实现 基础 JavaScript 是什么? JavaScript 是一种属于网络的脚本语言,被广泛应用于 Web 应用开发 JavaScri ...
- 强化学习算法中的log_det_jacobian
相关: https://colab.research.google.com/github/google/brax/blob/main/notebooks/training_torch.ipynb 之前 ...
- nginx-tengine-invalid IPv6 address in resolver-解析器中无效的IPv6地址
问题描述:解析器中无效的IPv6地址 [root@dm ~]# nginx -t nginx: [emerg] invalid IPv6 address in resolver "[fe80 ...
- adduser和addgroup命令讲解
https://wiki.alpinelinux.org/wiki/Setting_up_a_new_user 在Alpine Linux下创建用户和组命令分别是adduser和addgroup,本文 ...
- Qt编写地图综合应用49-地图类型(街道图、卫星图)
一.前言 地图类型主要是两种,街道图和卫星图,平时我们看到的默认的都是街道图,无论是街道图还是卫星图,都是一张张图片文件组成的,级别越高,图片越是清晰,一般都会支持到19级的地图,相当于精确到20米内 ...
- Qt编写地图综合应用45-路径规划
一.前言 路径规划一般是根据起始点坐标经纬度和结束点坐标经纬度,查询出合适的路线.关于起始坐标和结束坐标,最开始做的是直接传入具体中文地址即可,后面百度地图不再开放此功能,貌似变成了收费功能,但是经纬 ...
- Qt编写安防视频监控系统39-onvif图片参数
一.前言 通过onvif来调整图片的Brightness(亮度).ColorSaturation(色彩饱和度).Contrast(饱和度)这三个参数,可以实时观测到监控画面对应的变化,比如讲亮度Bri ...