CSP13

news/2025/1/17 14:00:05/文章来源:https://www.cnblogs.com/wlesq/p/18336592

T1

image
本来是道状压签到题,看成博弈论了,其实是不对的,为什么不对,建图时是存在环的情况的,所以不能建一棵树后跑\(sg\)函数
所以根据数据范围,我们可以状压,这就很简单了,每一次继承的状态为子状态相反的状态(不要试图只表示赢得状态)

考试代码(41,43)pts
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
using namespace std;
const int N = 20;
int n;
char s[N][20];
bool vis[N];
struct e
{int u,to,next;
}edge[N*N];int head[N],cnt;
void add(int u,int v)
{edge[++cnt].u=u;edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;
}
void g(int id)
{vis[id]=1;char tar=s[id][strlen(s[id]+1)];// cout<<id<<" "<<(char)tar<<endl;queue <int> q;for(int i=1;i<=n;i++){if(vis[i]||s[i][1]!=tar)continue;// cout<<id<<" "<<i<<endl;add(id,i);add(i,id);vis[i]=1;q.push(i);}while(q.size()){g(q.front());q.pop();}
}
int fx[N];
bool dfs(int u,int f,int dep)
{bool lf=1;bool tm=0;for(int i=head[u];i;i=edge[i].next){int to=edge[i].to;if(to==f)continue;// res=dfs(to,u,dep+1);bool res=dfs(to,u,dep+1);if(!res&&((dep+1)%2)==0){// cout<<"*****"<<endl;tm=0;return 0;}if(res&&((dep+1)%2)==1){tm=1;return 1;}// tm|=res;lf=0;}if(lf){return (dep&1);}return tm;
}
int main()
{speed();// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n;for(int i=1;i<=n;i++){cin>>(s[i]+1);}// cout<<len<<endl;bool fr=0;for(int i=1;i<=n;i++){// cout<<"********"<<endl;memset(vis,0,sizeof vis);memset(head,0,sizeof head);cnt=0;memset(edge,0,sizeof edge);g(i);fr=dfs(i,0,1);if(fr){break;}}if(fr)cout<<"First"<<endl;else cout<<"Second"<<endl;return 0;
}
状压
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
using namespace std;
const int N = 18;
int n;
char s[N][20];
bool vis[N];
int dp[(1<<16)+5][N];
bool dfs(ll zt,int lst)
{if(~dp[zt][lst])return dp[zt][lst];// cout<<bitset<16>(zt)<<" "<<lst<<endl;char tar=s[lst][strlen(s[lst]+1)];bool win=0,lf=1;int cnt=0;for(int i=0;i<n;i++){if(zt&(1<<i))cnt++;}for(ll i=1;i<=n;i++){	if((zt&(1ll<<(i-1)))||tar!=s[i][1])continue;lf=0;win|=(1-dfs(zt|(1ll<<(i-1)),i));}if(lf)win=1;return dp[zt][lst]=win;
}
int main()
{speed();// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n;for(int i=1;i<=n;i++){cin>>(s[i]+1);}// cout<<len<<endl;bool fr=0;for(int i=1;i<=n;i++){// cout<<"********"<<endl;// memset(vis,0,sizeof vis);// memset(head,0,sizeof head);cnt=0;memset(dp,-1,sizeof dp);// g(i);fr=dfs(1ll<<(i-1),i);if(fr){break;}}if(fr)cout<<"First"<<endl;else cout<<"Second"<<endl;return 0;
}

T2

image
构造题,首先我们可以把\(2至n\)个点与\(1\)进行询问,这样我们知道每个点所处的深度,然后依次遍历每一层,发现最多\(10到11\)层,我们肯定要拿当前要知道位置的点\(u\)与上一层的点\(y\)询问,但还是不知道具体位置,我们可以利用重链剖分的性质,发现\(dep_x+dep_y-2\times dep_{lca(x,y)}=dis_{query}\),所以我们可以确定\(lca\)的深度且它一定在当前子树根节点的重链上,我们从根节点开始往下找,\(y\)即为根节点重链的最底端点,每次\(dfs\)即可

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
using namespace std;
const int N = 3005;
int n,fa[N],ch[N][2],bot[N];
vector <int> dis[N],edge[N];
bool vis[N];
void add(int u,int v)
{edge[u].pb(v);edge[v].pb(u);fa[v]=u;if(ch[u][0])ch[u][1]=v;else ch[u][0]=v;
}
int tg,num;
vector <int> may;
int dep[N],dfn[N],sz[N];
int ask(int u,int v)
{cout<<"? "<<u<<" "<<v<<endl;cout.flush();int de;cin>>de;return de;
}
void dfs(int u)
{if(!u)return;sz[u]=1;bot[u]=u;if(ch[u][0]){dfs(ch[u][0]);sz[u]+=sz[ch[u][0]];}if(ch[u][1]){dfs(ch[u][1]);sz[u]+=sz[ch[u][1]];if(sz[ch[u][1]]>sz[ch[u][0]])swap(ch[u][0],ch[u][1]);		}if(ch[u][0])bot[u]=bot[ch[u][0]];return ;
}
void solve(int u)
{int y=1;while(dep[y]!=dep[u]-1){int de=ask(u,bot[y]);// break;int lca_dis=(dep[bot[y]]+dep[u]-de)/2;while(dep[y]<lca_dis)y=ch[y][0];if(dep[y]==dep[u]-1)break;y=ch[y][1];}add(y,u);
}
int main()
{speed();// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n;int de,mx=0;// cout<<"&&&&&&&"<<endl;for(int i=2;i<=n;i++){de=ask(1,i);// cout<<de<<endl;mx=max(mx,de);dis[de].push_back(i);	dep[i]=de;}for(int i=1;i<=mx;i++){dfs(1);for(auto p:dis[i]){solve(p);}}cout<<"! ";for(int i=2;i<=n;i++)cout<<fa[i]<<" ";cout<<endl;cout.flush();return 0;
}

T3
image

回滚莫队能过
细节,用\(vector\)\(clear\)以后要\(resize\),这个比较慢,建议换数组

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
using namespace std;
// #define int long long
const int N = 4E4+5,M=2e5+5;
ll h[N],w[N],n,m;ll ans[M],sq,num;
int st[N],en[N],bl[N];
ll f[205][205];
vector <ll> dp(205,0);
struct qu
{ll l,r,t,id;bool operator < (const qu& A)const{return bl[l]==bl[A.l]?r<A.r:l<A.l;}
}q[M];
inline void clear()
{for(int i=0;i<=200;i++)dp[i]&=0;
}
ll dp_solve(int l,int r,int t)
{if(l>r)return 0;for(int i=l;i<=r;i++){for(int j=t;j>=h[i];j--)dp[j]=max(dp[j],dp[j-h[i]]+w[i]);}return dp[t];
}
void init()
{for(int i=1;i<=num;i++){for(int j=st[i];j<=en[i];j++){for(int t=200;t>=h[j];t--)f[i][t]=max(f[i][t],f[i][t-h[j]]+w[j]);}}
}
ll force(int l,int r,int t)
{vector <ll> tmp(205,0);for(int i=l;i<=r;i++)for(int j=t-h[i];j>=0;j--)tmp[j+h[i]]=max(tmp[j+h[i]],tmp[j]+w[i]);return tmp[t];
}
ll res=0;
void solve()
{int L=1,R=0;ll tmp[205],cp[205];for(int i=1,j=1;i<=num;i++){R=en[i];L=en[i]+1;memset(tmp,0,sizeof tmp);memset(cp,0,sizeof cp);while(i==bl[q[j].l]){if(q[j].r-q[j].l<=sq){// cout<<"********"<<endl;// cout<<q[j].l<<" "<<q[j].r<<endl;ans[q[j].id]=force(q[j].l,q[j].r,q[j].t);j++;continue;}L=en[i]+1;while(R<q[j].r){// cout<<"****"<<endl;R++;for(int j=200-h[R];j>=0;j--)tmp[j+h[R]]=max(tmp[j+h[R]],tmp[j]+w[R]);}		memset(cp,0,sizeof cp);while(L>q[j].l){L--;for(int t=200-h[L];t>=0;t--)cp[t+h[L]]=max(cp[t+h[L]],cp[t]+w[L]);}for(int t=q[j].t;t>=0;t--)ans[q[j].id]=max(ans[q[j].id],tmp[t]+cp[q[j].t-t]);// cout<<"***"<<q[j].l<<" "<<q[j].r<<endl;// cout<<q[j].id<<" "<<ans[q[j].id]<<" "<<bl[q[j].l]<<" "<<q[j].l<<" "<<q[j].r<<endl;// cout<<"CORRECT"<<force(q[j].l,q[j].r,q[j].t)<<endl;j++;}}
}
int main()
{speed();// freopen("3.in","r",stdin);// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>m;sq=sqrt(n);num=n/sq;// cout<<"*****"<<n<<" "<<m<<endl;for(int i=1;i<=n;i++)cin>>h[i];for(int i=1;i<=n;i++)cin>>w[i];for(int i=1;i<=m;i++){cin>>q[i].l>>q[i].r>>q[i].t;q[i].id=i;}for(int i=1;i<=num;i++){st[i]=en[i-1]+1;en[i]=st[i]+sq-1;// cout<<st[i]<<" "<<en[i]<<endl;}for(int i=1;i<=n;i++)bl[i]=(i-1)/sq+1;if(en[num]<n){num++;st[num]=en[num-1]+1;en[num]=n;}sort(q+1,q+1+m);// init();solve();for(int i=1;i<=m;i++){cout<<ans[i]<<endl;}return 0;
}

猫树分治做法

点击查看代码

#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
using namespace std;
// #define int long long
const int N = 4E4+5,M=2e5+5;
int h[N],w[N],n,m;ll ans[M],sq,num;
int p[M],s[M],tn,tmid;
int f[N][205];
struct qu
{int l,r,t,id;
}q[M];
void solve(int l,int r,int tl,int tr)
{// cout<<l<<" "<<r<<endl;if(tl>tr)return;if(l==r)return;int mid=(l+r)>>1;tmid=tl-1;for(int i=0;i<=200;i++)f[mid][i]=0;for(int i=mid+1;i<=r;i++){for(int j=0;j<h[i];j++)f[i][j]=f[i-1][j];for(int j=h[i];j<=200;j++)f[i][j]=max(f[i-1][j],f[i-1][j-h[i]]+w[i]);}for(int i=h[mid];i<=200;i++)f[mid][i]=w[mid];for(int i=mid-1;i>=l;i--){for(int j=0;j<h[i];j++)f[i][j]=f[i+1][j];for(int j=h[i];j<=200;j++)f[i][j]=max(f[i+1][j],f[i+1][j-h[i]]+w[i]);}tn=0;int u=0;for(int i=tl;i<=tr;i++){u=p[i];if(q[u].r<=mid)p[++tmid]=u;else if(q[u].l>mid)s[++tn]=u;	else{ll res=0;for(int i=0;i<=q[u].t;i++)res=max<ll>(res,f[q[u].l][i]+f[q[u].r][q[u].t-i]);ans[u]=res;}}for(int i=1;i<=tn;i++)p[tmid+i]=s[i];tr=tn+tmid;solve(l,mid,tl,tmid);solve(mid+1,r,tmid+1,tr);
}
int main()
{speed();// freopen("3.in","r",stdin);// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>m;// cout<<"*****"<<n<<" "<<m<<endl;for(int i=1;i<=n;i++)cin>>h[i];for(int i=1;i<=n;i++)cin>>w[i];for(int i=1;i<=m;i++){cin>>q[i].l>>q[i].r>>q[i].t;if(q[i].l==q[i].r){if(q[i].t>=h[q[i].l])ans[i]=w[q[i].l];}else p[++tn]=i;}solve(1,n,1,tn);for(int i=1;i<=m;i++){cout<<ans[i]<<endl;}return 0;
}

image

暴力代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define pb push_back
#define ull unsigned long long
using namespace std;
const int  N =305,mod=998244353;
const ull B=233;
ll n,m,a[N];
ll qpow(ll a,ll b)
{ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}
struct qu
{int l,r;
}q[50000+5];
set<ull> s;
int main()
{speed();// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);cin>>n>>m;for(int i=1;i<=m;i++){cin>>q[i].l>>q[i].r;}for(int i=1;i<=n;i++)a[i]=i;if(n>10){cout<<qpow(2,m)<<endl;return 0;}do{ull tmp=0;for(int i=1;i<=m;i++){int mx=0,maxnn=0;for(int j=q[i].l;j<=q[i].r;j++){if(maxnn<a[j]){maxnn=a[j];mx=j;}}tmp=tmp*B+mx;}// unique(chk.begin(),chk.end());// sort(chk.)s.insert(tmp);}while(next_permutation(a+1,a+1+n));cout<<s.size()%mod;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/776809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秒杀防止超卖方案测试(使用JMeter进行压力测试)

不进行任何防超卖操作,实测500个线程跑完不需要1s。虽然卖得快,但是超卖了哈哈哈。那么为了避免超卖我们对确认下单的方法加上synchronized: 实测发现确实没有超卖了,500个线程跑完需要44s,速度也太慢了,另外不支持多节点防止超卖,所以这个方案也不可取!

VirtualBox扩容CentOS-7虚拟机磁盘

1、背景描述如上图所示,根路径“/”所在的文件系统已没有可用的磁盘空间,需要扩容磁盘。 df -h2、VirtualBox操作 2.1、查看当前虚拟磁盘的大小如上图所示,点击打开选中的虚拟机的 Settings 界面。如上图所示,当前虚拟机的虚拟磁盘大小为 8GB 。 2.2、修改虚拟磁盘的大小如…

从零开始学逆向CTF比赛,免费参加,欢迎来玩!

大家好,我是轩辕。 告诉大家一个好消息:我准备了一次逆向CTF比赛,面向所有人开放,无需购买课程,优秀的小伙伴还有奖励,参赛方式在文末会介绍,欢迎大家一起来玩。举办这次CTF比赛,是为了检验大家从零开始学逆向的学习成果。就在不久前,我的这套视频课程终于完结了。 不…

从头装一台 ubuntu 电脑你需要什么?

1. 首先是硬件: cpu: 12600kf pdd 盒装 1040 gpu: 3060 12g 咸鱼 1600 主板:华擎 z690 pg4 d5 pdd 760 内存:阿斯加特海拉DDR5 6400 pdd 603 固态:Ti600 1T pdd 434 机箱:先马朱雀 jd 178 cpu 散热:利民 PA120 pdd 155 电源:玄武550 v4 pdd 190 合计:4960 其中,机箱…

centos7上dpdk绑定vfio-pci失败

记一次使用dpdk中的报错: 运行dpdk/usertools/dpdk-devbind.py -b vfio-pci 02:05.0来绑定设备到vfio-pci时,报出了如下错误: Error: bind failed for 0000:02:05.0 - Cannot bind to driver vfio-pci: [Errno 19] No such deviceError: unbind failed for 0000:02:05.0 - C…

mysql中的left join、right join 、inner join的详细用法

1.inner join,内连接,显示两个表中有联系的所有数据。 当两个表中存在匹配的数据时,‌返回满足条件的SELECT结果。‌内连接只返回两个表中匹配的记录,‌如果某一方没有匹配的记录,‌则不会出现在结果集中。‌ 2.left join,左链接,以左表为参照,显示所有数据,右表中没有则以…

欢欢乐乐赛赛

欢欢乐乐赛赛中文队名:回来吧,我的波波! 英文队名:Come back,my bobo! 队长: @Pursuing_OIer 队员: @hzoi_Shadow , @Charlie_ljk , @ccxswl荣获铜牌🥉。 \(A\) P184. 树构造 \(AC\)强化版: luogu P10678 『STA - R6』月直接考虑直径最小的情况怎么做。设最终得到的直…

NewStarCTF WEEK5|WEB pppython?

对源码进行简单的分析 <?php// 检查 `hint` 请求参数是否等于指定的数组值 if ($_REQUEST[hint] == ["your?", "mine!", "hint!!"]) {// 如果条件满足,设置响应内容类型为纯文本header("Content-type: text/plain");// 执行系统…

力扣--59.螺旋矩阵II

模拟顺时针画矩阵的过程:填充上行从左到右 填充右列从上到下 填充下行从右到左 填充左列从下到上由外向内一圈一圈这么画下去/*** 生成一个包含从1到n*n的数字的矩阵* @param {number} n - 矩阵的大小,为正整数* @return {number[][]} - 返回一个n x n的二维数组,数组中的每个…

轻松搞定 Nginx 在 CentOS 和 Ubuntu 上的安装与配置

本文详细介绍了在 CentOS 和 Ubuntu 系统上安装 Nginx 的全过程,包括下载方法、安装步骤、配置开机自启以及基础配置等重要内容,还提供了常见问题的解决方案和优化配置示例,助您顺利搭建高效的服务器环境。注:这是对我以前博客进行优化后再次发布的,博客中的截图为以前的。…

mfc用printf输出调试信息到终端cmd

前言全局说明mfc用printf输出调试信息到终端cmd一、说明 环境: Windows 11 家庭版 23H2 22631.3737 VS2013二、printf 打印调试信息 2.1 设置启用 控制台 打印 2.1.1 打开解决方案(项目)-- 属性2.1.2 配置属性 -> 生成事件 -> 后期生成事件 -> 命令行 -> 编辑 在…

更改element-ul的表格底部滚动条

/* 确保表格容器有足够的高度 */ ::v-deep .el-table .el-table__fixed{overflow: hidden;height:auto !important;bottom:20px !important; }/* 普通列的滚动条样式 */ ::v-deep .el-table__body-wrapper {padding-bottom: 10px; /* 调整底部 padding */ }::v-deep .el-table_…