NOIP2024加赛4

NOIP2024加赛4

\(T1\) luogu P11267 【MX-S5-T1】王国边缘 \(85pts\)

  • 预处理前缀中最后一个 \(1\) 出现的位置然后就可以倍增跳了。

    点击查看代码
    const ll p=1000000007;
    int nxt[200010][62],f[200010][62],last[200010];
    char t[200010];
    ll divide(ll s,ll k)
    {ll ans=0;for(ll i=60;i>=0;i--){if((k>>i)&1){ans=(ans+f[s][i])%p;s=nxt[s][i];}}return ans;
    }
    int main()
    {
    #define Isaac
    #ifdef Isaacfreopen("kingdom.in","r",stdin);freopen("kingdom.out","w",stdout);
    #endifll n,m,q,s,k,r,i,j;cin>>n>>m>>q>>(t+1);last[0]=-1;for(i=1;i<=n;i++){last[i]=(t[i]=='1')?i:last[i-1];}for(i=1;i<=n;i++){if(i+m<=n){if(last[i+m]<=i){nxt[i][0]=i+1;f[i][0]=1;}else{nxt[i][0]=last[i+m];f[i][0]=last[i+m]-i;}}else{r=(m+i)%n;k=(m+i)/n-1;if(last[r]==-1){if((k==0&&last[n]<=i)||(last[n]==-1)){nxt[i][0]=i%n+1;f[i][0]=1;}else{nxt[i][0]=last[n];f[i][0]=(n-i+(k-1)*n%p+last[n])%p;}}else{nxt[i][0]=last[r];f[i][0]=(n-i+k*n%p+last[r])%p;}}}for(j=1;j<=60;j++){for(i=1;i<=n;i++){nxt[i][j]=nxt[nxt[i][j-1]][j-1];f[i][j]=(f[i][j-1]+f[nxt[i][j-1]][j-1])%p;}}for(i=1;i<=q;i++){cin>>s>>k;cout<<(s+divide((s-1)%n+1,k))%p<<endl;}return 0;
    }
    

\(T2\) luogu P11268 【MX-S5-T2】买东西题 \(40pts\)

  • 考虑先将物品和优惠券分别以 \(\{ a \}\)\(\{ w \}\) 升序排序,此时优惠券能被选择的一定是一段后缀。

  • 而最终对答案有关系的只有被选择的优惠券,而与其被哪个物品选择无关。即对于两个物品若可以交换其选择的优惠券则交换后并不影响最终答案。

  • 部分分

    • 测试点 \(1\) :爆搜或状压 \(DP\)
    • 测试点 \(4 \sim 6\) :每张优惠券可以被选择的是整个序列,将 \(a_{i}-b_{i}\) 也当做“优惠券”的一部分,排序取前 \(n\) 大即可。
    点击查看代码
    ll f[2][(1<<21)+1000000];
    pair<int,int>a[1000010],w[1000010];
    vector<int>c;
    ll lowbit(ll x)
    {return x&(-x);
    }
    int main()
    {
    #define Issac
    #ifdef Issacfreopen("buy.in","r",stdin);freopen("buy.out","w",stdout);
    #endifint n,m,i,j,k;ll sum=0,ans=0x7f7f7f7f7f7f7f7f;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%d%d",&a[i].first,&a[i].second);sum+=a[i].second;c.push_back(a[i].first-a[i].second);}for(i=1;i<=m;i++){scanf("%d%d",&w[i].first,&w[i].second);c.push_back(w[i].second);}sort(a+1,a+1+n);sort(w+1,w+1+m);if(w[m].first<=a[1].first){ans=0;sort(c.begin(),c.end(),greater<int>());for(i=1;i<=n;i++){ans+=a[i].first;ans-=c[i-1];}}else{memset(f,0x3f,sizeof(f));f[0][0]=sum;for(i=1;i<=n;i++){f[i&1][0]=f[(i-1)&1][0];for(j=1;j<=(1ll<<m)-1;j++){f[i&1][j]=f[(i-1)&1][j];if(__builtin_popcount(j)<=i){k=log2(lowbit(j));if(w[k+1].first>a[i].first){continue;}for(k=0;k<=m-1;k++){if(((j>>k)&1)){if(w[k+1].first<=a[i].first){f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j^(1<<k)]-a[i].second+a[i].first-w[k+1].second);}else{break;}}}}}}for(i=0;i<=(1<<m)-1;i++){ans=min(ans,f[n&1][i]);}}printf("%lld\n",ans);return 0;
    }
    
  • 正解

    • 不妨钦定在处理完物品 \(i\) 后续更新过程不会再次给它优惠券,但是可以把它的优惠券拿走给后面的物品用。
    • 考虑反悔贪心,每次将当前最优决策取出,并加入由此产生的新决策。
    • 设决策集合为 \(Q\) ,若 \(a_{i}-\min\{ Q \} \le b_{i}\) 则将 \(a_{i}-\min\{ Q \}\) 加入答案,并将 \(a_{i}-b_{i}\) 加入决策集合 \(Q\) ;否则将 \(b_{i}\) 加入答案。
      • \(\min\{ Q \}\) 来自于 \(a_{j}-b_{j}(j \in [1,i-1])\) ,则等价于拿走物品 \(j\) 的优惠券并将其对答案的贡献更改为 \(b_{j}\) ;否则来自于优惠券,即选择最优的优惠券加入答案。
      • 后者的正确性显然。
    点击查看代码
    pair<ll,ll>a[1000010],w[1000010];
    priority_queue<ll>q;
    int main()
    {
    #define Issac
    #ifdef Issacfreopen("buy.in","r",stdin);freopen("buy.out","w",stdout);
    #endifll n,m,ans=0,i,j;scanf("%lld%lld",&n,&m);for(i=1;i<=n;i++){scanf("%lld%lld",&a[i].first,&a[i].second);}for(i=1;i<=m;i++){scanf("%lld%lld",&w[i].first,&w[i].second);}sort(a+1,a+1+n);sort(w+1,w+1+m);for(i=1,j=0;i<=n;i++){while(j+1<=m&&w[j+1].first<=a[i].first){j++;q.push(w[j].second);}if(q.empty()==0&&a[i].first-q.top()<=a[i].second){ans+=a[i].first-q.top();q.pop();q.push(a[i].first-a[i].second);}else{ans+=a[i].second;}}printf("%lld\n",ans);return 0;
    }
    

\(T3\) luogu P11269 【MX-S5-T3】IMAWANOKIWA (Construction ver.) \(12pts\)

  • 部分分
    • 测试点 \(1 \sim 3\) :爆搜。

      点击查看代码
      const ull base=13331;
      int a[100010],minn;
      char aa[100010];
      vector<int>ans,tmp,s;
      bool cmp()
      {	for(int i=0;i<ans.size();i++){if(ans[i]>tmp[i]){return true;}if(ans[i]<tmp[i]){return false;}}return true;
      }
      void dfs(int pos,int n)
      {if(pos==n){for(int i=1;i<=n;i++){s.push_back(a[i]);}for(int i=0;i<tmp.size();i++){s[tmp[i]-1]=__builtin_popcount(s[tmp[i]-1]+s[tmp[i]]);s.erase(s.begin()+tmp[i]);}if(s[0]<minn){minn=s[0];ans=tmp;}else{if(s[0]==minn&&cmp()==true){ans=tmp;}}s.pop_back();}else{for(int i=1;i<=n-pos;i++){tmp.push_back(i);dfs(pos+1,n);tmp.pop_back();}}
      }
      ull sx_hash()
      {ull hsh=0,jc=1;for(int i=ans.size()-1;i>=0;i--){hsh+=jc*ans[i];jc*=base;}return hsh;
      }
      int main()
      {
      #define Issac
      #ifdef Issacfreopen("popc.in","r",stdin);freopen("popc.out","w",stdout);
      #endifint t,n,i,j;scanf("%d",&t);for(j=1;j<=t;j++){minn=0x7f7f7f7f;ans.clear();scanf(" %s",aa+1);n=strlen(aa+1);for(i=1;i<=n;i++){a[i]=aa[i]-'0';}dfs(1,n);printf("%d %llu\n",minn,sx_hash());}return 0;
      }
      
    • 测试点 \(13 \sim 15\) :观察到 \(\operatorname{popcount}(x+y)=((x-1) \bigoplus (y-1))+1(x,y \in \{ 1,2 \})\) ,进一步手摸后发现操作顺序并不影响最终答案,故贪心地对开头进行操作即可。

\(T4\) luogu P11270 【MX-S5-T4】魔法少女们 \(8pts\)

  • 部分分

    • 测试点 \(1 \sim 2\) :爆搜,哈希加速字符串匹配。
    点击查看代码
    const ll p=1000000007,mod=1000003579,base=13331;
    ll hss[500010],lens[500010],hst[500010],lent[500010],hs[500010],jc[500010],ans=0;
    char s[500010];
    ll init_hash(char s[],ll len)
    {ll ans=0;for(ll i=0;i<=len;i++){ans=(i==0)?0:(ans*base%mod+s[i])%mod;}return ans;
    }
    void sx_hash(char s[],ll len,ll a[])
    {for(ll i=0;i<=len;i++){a[i]=(i==0)?0:(a[i-1]*base%mod+s[i])%mod;}
    }
    ll ask_hsh(ll l,ll r)
    {return (hs[r]-hs[l-1]*jc[r-l+1]%mod+mod)%mod;
    }
    void dfs(ll pos,ll n,ll m,ll k,ll sum1,ll sum2)
    {if(sum2>sum1){return;}if(pos==k+1){if(sum1==sum2){	sx_hash(s,k,hs);ll cnt1=0,cnt2=0;for(ll i=1;i<=n;i++){cnt1+=(ask_hsh(1,lens[i])==hss[i]);}	for(ll i=1;i<=m;i++){cnt2+=(ask_hsh(k-lent[i]+1,k)==hst[i]);}	ans=(ans+cnt1*cnt2%p)%p;}}else{s[pos]='(';dfs(pos+1,n,m,k,sum1+1,sum2);s[pos]=')';dfs(pos+1,n,m,k,sum1,sum2+1);}
    }
    int main()
    {
    #define Issac
    #ifdef Issacfreopen("magic.in","r",stdin);freopen("magic.out","w",stdout);
    #endifll c,n,m,k,i;scanf("%lld%lld%lld%lld",&c,&n,&m,&k);for(i=1;i<=n;i++){scanf(" %s",s+1);lens[i]=strlen(s+1);hss[i]=init_hash(s,lens[i]);}for(i=1;i<=m;i++){scanf(" %s",s+1);lent[i]=strlen(s+1);hst[i]=init_hash(s,lent[i]);}for(i=0;i<=k;i++){jc[i]=(i==0)?1:jc[i-1]*base%mod;}dfs(1,n,m,k,0,0);printf("%lld\n",ans);return 0;
    }
    

总结

  • \(T1\) 预处理时少处理了能跳出至少一个 \(S\) 时的 Corner Case ,但因为大样例直接过了遂没写对拍,挂了 \(15pts\)
  • \(T2\) 想到了把 \(a_{i}-b_{i}\) 也当做“优惠券”的一部分,但以为只能给自己用,没想到能扩展到维护后续因拿走优惠券而产生的贡献。
  • \(T3\) 没有想到 \(\operatorname{popcount}(x+y)=\begin{cases} 1 & x=y \land x,y \in \{ 1,2 \} \\ 2 & x \ne y \land x,y \in \{ 1,2 \} \end{cases}\) 能归约到 \(\operatorname{popcount}(x+y)=((x-1) \bigoplus (y-1))+1(x,y \in \{ 1,2 \})\) ,导致 \(15pts\) 的部分分没写。

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

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

相关文章

触想染织厂MES产线终端工位机,打造数字化高效车间

一、行业发展背景在纺织细分领域中,印染行业一直是整个产业链的效率短板,因其涉及染色、定型及后整理加工等多个复杂工艺、上百个参数变量,质量波动较大,依赖个人经验和手工操作,常常陷入高成本、低效率发展困境。△某印染工厂生产场景二、行业应用需求印染厂要真正实现效…

超强抗干扰单键触摸/电容式触控IC-VK3601 SOT23-6单通道直接输出/触摸感应方案原厂

产品品牌:永嘉微电/VINKA 产品型号:VK3601 封装形式:SOT23-6 概述 VK3601具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了1路直接输出功能。芯片内部采用特殊的集成电路,具有高电源…

重载和重写的区别

重载(Overloading)和重写(Overriding)是面向对象编程中两个重要的概念,它们在实现多态性时起着关键作用,但两者之间有明显的区别:定义上的区别:重载(Overloading) 指的是在同一个类中可以有多个方法名相同,但这些方法的参数列表(参数的个数、类型或顺序)不同,或者…

Python 学习记录 (4)

Plotly常见可视化方案:以鸢尾花数据为例 简单介绍:Ploty库也有大量统计可视化方案,并且这些可视化方案具有交互化属性。 主要对鸢尾花数据进行处理与可视化。 所展示的结果为交互界面的截图情况,这里不能进行交互。使用Plotly绘制散点图与箱型图,分类展示“花萼宽度” 说明…

聚丙烯的节奏

晚上7420附近企稳做多 损7400下方 这两天目标7530以上

低空载功耗,高能源利用率 BDA5-20W BOSHIDA DCDC

低空载功耗,高能源利用率 BDA5-20W BOSHIDA DCDC BDA5-20W系列产品具有以下特点:宽输入电压范围(4:1),可以适应多种输入电压条件;高效率,能够达到88%以上,节能环保;空载功耗低,可以节省能源;隔离电压为500VDC,能够提供良好的电气隔离性能;具有输入欠压保护、输出过…

LCEL与AgentExecutor的局限性分析

在大语言模型(LLM)应用开发领域,LangChain表达式语言(LCEL)和AgentExecutor一直是开发者的得力助手。然而,随着应用场景的复杂化,这些工具的局限性也日益凸显。本文将深入探讨LCEL和AgentExecutor的不足,并引入一个新的解决方案。 LCEL链表达式的局限性 LangChain表达式语言(LC…

SSD201/202D的SPI通讯该怎么操作,触觉智能带来保姆级攻略

本文介绍SigmaStar SSD201/SSD202D中SPI通讯的测试方法,SPI是一种常见的串行通信协议,它被广泛用于微控制器与各种外设之间的数据传输。使用触觉智能Purple Pi R1双网口开发板演示。本文介绍SigmaStarSSD201/SSD202D中SPI通讯的测试方法,SPI全称是Serial Peripheral Interfa…

多线程锁的升级原理是什么

锁的级别:无锁 => 偏向锁 => 轻量级锁 => 重量级锁 无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。 偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储…

Eplan2022卡顿问题解决

EPLAN2022卡顿崩溃怎么解决第一步:可以检查下用户设置。打开菜单 "选项 → 设置:用户 → 翻译 → 字典": 不勾选"自动完成"和"自动更正"。在选项设置框中输入"自动",快速找到用户设置,取消勾选,如下图。 第二步:可以检查下电脑语…

Linux中文件系统层次结构简述

在Linux操作系统中,并没有像Windows那样的“盘符”概念。相反,Linux使用一个统一的文件系统层次结构,所有的文件和目录都挂载在一个单一的根目录 / 下。这种设计使得文件系统的管理更加灵活和一致。 文件系统层次结构 在Linux中,文件系统通常按照以下层次结构组织:/(根目…