http://192.168.14.232/contest/59

news/2024/10/20 19:28:13

A:


创历史新低
dalao:d<=5,所以一个位置上只能是[i-d,i+d],考虑状压
ljx's code

#include <bits/stdc++.h>
using namespace std;
const int maxn=505;
const int mod=998244353;
int read(){int ret=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}while( isdigit(ch)){ret=(ret<<3)+(ret<<1)+(ch&15);ch=getchar();}return ret*f;
}
int n,d,ans; 
int a[maxn],f[maxn][5005];
bool vis[maxn*2];
int main(){n=read(),d=read();int base=(1<<(2*d+1))-1;for(int i=1;i<=n;++i){a[i]=read();if(a[i]!=-1) vis[a[i]]=1;}for(int i=n+1;i<=n+d;++i) vis[i]=1;int in=0;for(int p=0-d;p<=0+d;++p){in<<=1;if(p<=0) in|=1;else in|=vis[p];}f[0][in]=1;for(int i=1;i<=n;++i){for(int p=0;p<=base;++p){int now=((p<<1)&base)|vis[i+d];if(a[i]!=-1){f[i][now]=(f[i][now]+f[i-1][p])%mod;}else{for(int t=0;t<=2*d;++t){if(now&(1<<t)) continue;f[i][now|(1<<t)]=(f[i][now|(1<<t)]+f[i-1][p])%mod;}}}}printf("%d\n",f[n][base]);return 0;
} 

B:

你会发现,原本的第一个1只会到下一个的第一个1,原本的第二个1只会到下一个的第二个1……
因此,第i个1的区间在 s1中第i个1的坐标和s2中第i个1的坐标之间
然后如果是这样:

1的区间:
[-----------][---------------][---------------]

显然,在一起时总贡献最大
0同理。
code:

//write as ljx's code
//%bailjx  
#include <bits/stdc++.h>
using namespace std;
inline int read(){int x=0;char ch=getchar();while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x;}
int n,m,cnt,ans;
int a[300005],f[300005],l[300005],r[300005];
char ch1[300005],ch2[300005];
int main(){n=read(),m=read();scanf("%s",ch1+1);scanf("%s",ch2+1);cnt=0;for(int i=1;i<=n+m;++i)if(ch1[i]=='1')l[++cnt]=i;cnt=0;for(int i=1;i<=n+m;++i)if(ch2[i]=='1')r[++cnt]=i;for(int i=1;i<=m;++i)if(r[i]<l[i]) swap(r[i],l[i]);for(int i=1;i<=m;++i){int L=1,R=i;while(L<R){int mid=(L+R)>>1;if(l[i]-(i-mid)<=r[mid]) R=mid;else L=mid+1;}f[i]=f[R-1]+(i-R);}ans+=f[m];cnt=0;for(int i=1;i<=n+m;++i){if(ch1[i]=='0'){l[++cnt]=i;}}cnt=0;for(int i=1;i<=n+m;++i)if(ch2[i]=='0')r[++cnt]=i;for(int i=1;i<=n;++i)if(r[i]<l[i]) swap(r[i],l[i]);for(int i=1;i<=n;++i){int L=1,R=i;while(L<R){int mid=(L+R)>>1;if(l[i]-(i-mid)<=r[mid]) R=mid;else L=mid+1;}f[i]=f[R-1]+(i-R);}ans+=f[n];printf("%d\n",ans);return 0;
} 

C:

T3 原题 ARC132E

so
nobody knows.
50pts:

//This is liujiaxin's
#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
const int mod=998244353;
int read(){int ret=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}while( isdigit(ch)){ret=(ret<<3)+(ret<<1)+(ch&15);ch=getchar();}return ret*f;
}
int n,cnt,inv2=(mod+1)/2;
char ch[maxn];
int pos[maxn],sump[maxn],f[1005][1005];
struct BIT{int tree[1005];void add(int x,int v){x++;for(;x<=n+1;x+=x&-x) tree[x]=(tree[x]+v)%mod;}int query(int x){x++;int ret=0;for(;x;x-=x&-x) ret=(ret+tree[x])%mod;return ret;}
}fir[1005],sec[1005];
int quick_pow(int a,int b){int ret=1;while(b){if(b&1) ret=1ll*ret*a%mod;a=1ll*a*a%mod;b>>=1;}return ret;
}
int main(){n=read();scanf("%s",ch+1);for(int i=1;i<=n;++i){if(ch[i]=='.'){pos[++cnt]=i;}}if(cnt==n){printf("%d\n",1ll*n*inv2%mod);return 0;}pos[cnt+1]=n+1;for(int i=0;i<=cnt;++i){for(int p=pos[i]+1;p<pos[i+1];++p){if(ch[p]=='<'){f[i][i+1]++;}}fir[i].add(i+1,f[i][i+1]);sec[i+1].add(i,f[i][i+1]);}for(int i=1;i<=cnt+1;++i){sump[i]=(sump[i-1]+pos[i])%mod;}for(int len=2;len<=cnt+1;++len){int v=quick_pow(len-1,mod-2);for(int l=0;l+len<=cnt+1;++l){int r=l+len;f[l][r]=((sump[r-1]-sump[l]+mod)%mod-1ll*pos[l]*(len-1)%mod+mod)%mod;f[l][r]=(f[l][r]+(fir[l].query(r-1)-fir[l].query(l)+mod)%mod)%mod;f[l][r]=(f[l][r]+(sec[r].query(r-1)-sec[r].query(l)+mod)%mod)%mod;f[l][r]=1ll*f[l][r]*v%mod*inv2%mod;fir[l].add(r,f[l][r]);sec[r].add(l,f[l][r]);}}printf("%d\n",f[0][cnt+1]);return 0;
}

D:

只要考虑两边间的距离是否小于等于不走这条路的dis即可。
this is by ljx

#include <bits/stdc++.h>
using namespace std;
const int maxn=2005;
const long long INF=0x3f3f3f3f3f3f3f3fll;
int read(){int ret=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}while( isdigit(ch)){ret=(ret<<3)+(ret<<1)+(ch&15);ch=getchar();}return ret*f;
}
int n,m,cnt;
long long ans;
struct line{int u,v,l,c;bool operator<(const line &B)const{return l<B.l||(l==B.l&&c<B.c);}
}p[maxn];
int fa[maxn];
int getfa(int x){return x==fa[x]?x:fa[x]=getfa(fa[x]);}
int lnk[maxn],son[maxn*2],nxt[maxn*2],w[maxn*2];
void add_e(int x,int y,int z){son[++cnt]=y;nxt[cnt]=lnk[x];lnk[x]=cnt;w[cnt]=z;}
struct node{int id;long long val;bool operator<(const node &B)const{return val<B.val;}
}hep[maxn];
int hep_size;
void put(int id,long long val){hep[++hep_size]=(node){id,val};int son=hep_size;while(son!=1&&hep[son]<hep[son>>1]) swap(hep[son],hep[son>>1]),son>>=1;
}
node get(){node ret=hep[1];hep[1]=hep[hep_size--];int fa=1,son;while((fa<<1)<=hep_size){if((fa<<1|1)>hep_size||hep[fa<<1]<hep[fa<<1|1]) son=fa<<1;else son=fa<<1|1;if(hep[son]<hep[fa]) swap(hep[son],hep[fa]),fa=son;else break;}return ret;
}
long long dis[maxn];
bool vis[maxn];
long long DIJ(int s,int t){memset(dis,0x3f,sizeof dis);memset(vis,0,sizeof vis);put(s,dis[s]=0);while(hep_size){int now=get().id;if(vis[now]) continue;vis[now]=1;for(int j=lnk[now];j;j=nxt[j]){if(dis[son[j]]>dis[now]+w[j]){dis[son[j]]=dis[now]+w[j];put(son[j],dis[son[j]]);}}}return dis[t];
}
int main(){n=read(),m=read();for(int i=1;i<=n;++i) fa[i]=i;for(int i=1;i<=m;++i){p[i].u=read();p[i].v=read();p[i].l=read();p[i].c=read();}sort(p+1,p+m+1);for(int i=1;i<=m;++i){int fx=getfa(p[i].u),fy=getfa(p[i].v);if(fx==fy) continue;fa[fx]=fy;ans+=p[i].c;add_e(p[i].u,p[i].v,p[i].l);add_e(p[i].v,p[i].u,p[i].l);}for(int i=1;i<=m;++i){if(DIJ(p[i].u,p[i].v)>p[i].l){add_e(p[i].u,p[i].v,p[i].l);add_e(p[i].v,p[i].u,p[i].l);ans+=p[i].c;}}printf("%lld\n",ans);return 0;
} 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

文件的物理结构

文件块和磁盘块 类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同。内存与磁盘之间的数据交换(即读/写操作、磁盘I/O)都是以“块”为单位进行的。即每次读入一块,或每次写出一块文件分配方式 连…

2024-2025-1 20241307《计算机基础与程序设计》第四周学习总结

作业信息这个作业属于哪个课程 (2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 (2024-2025-1计算机基础与程序设计第四周作业)这个作业的目标作业正文 (2024-2025-1 学号20241307《计算机基础与程序设计》第四周学习总结)教材学习内容总结第二章主要介绍了二进制数…

第38篇 net8接口调试方式

.net提供了内置的接口调试方式 1.新建.net core web api控制台应用程序 2.封装好jwt验证机制 token令牌验证机制/// <summary>/// 登录/// </summary>/// <param name="request"></param>/// <returns></returns>/// <except…

使用MySQL之用正则表达式进行搜索

1. 正则表达式介绍 正则表达式是用来匹配文本的特殊的串(字符集合)。 如果你想从一个文本文件中提取电话号码,可以使用正则表达式。 如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。 如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式。…

20242822《Linux内核原理与分析》第四周作业

实验三——跟踪分析Linux内核的启动过程 1.使用实验楼的虚拟机打开shell并使用命令启动内核进入menu程序 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.imgqemu:这是 QEMU 模拟器,用来启动虚拟机的命令。-kernel linux-3.18.6/arch/x86/boot/bzImage:指…

如2024-2025 20241425 《计算机基础与程序设计》第4周学习总结

作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276这个作业的目标 1、门电路 2、组合电路,逻辑电路 3、冯诺依曼结构 4、CPU,内存,IO管理 5、…

视野修炼第106期 | Node23新特性

① Node23 发布 ② Recce - 如何突破动态化容器的天花板 ③ 上网的糟糕感受 ④ 如何设定超过25天的定时器 ⑤ 快速预览目标链接在各种社交软件的展示 ⑥ 为网站添加气球 ⑦ VItePress 中预览组件 ⑧ 哔哩哔哩:基于源码的可视化编辑方案 ⑨ 图片主色提取 ⑩ 使用 TS 约束正则表…

FPGA时序约束基础

一、时序约束的目的 由于实际信号在FPGA内部期间传输时,由于触发器等逻辑期间并非理想期间,因此不可避免地存在传输延时,这种延迟在高速工作频率、高逻辑级数时会造成后级触发器地建立时间和保持时间不满足,造成时序违例。(这也是为什么需要把FPGA设计不能以高级编程语言思…