Codeforces Round #556 (Div. 1)

Codeforces Round #556 (Div. 1)

A. Prefix Sum Primes

给你一堆1,2,你可以任意排序,要求你输出的数列的前缀和中质数个数最大。

发现只有\(2\)是偶质数,那么我们先放一个\(2\),再放一个\(1\),接下来把\(2\)全部放掉再把\(1\)全部放掉就行了。

#include<iostream>
#include<cstdio>
using namespace std;
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,a[3];
int main()
{n=read();for(int i=1;i<=n;++i)a[read()]+=1;if(a[2]){printf("2 "),a[2]-=1;if(a[1])printf("1 "),a[1]-=1;}while(a[2])printf("2 "),a[2]-=1;while(a[1])printf("1 "),a[1]-=1;puts("");return 0;
}

B. Three Religions

给你一个串\(S\),会动态的修改三个串,修改是在三个串的末尾删去或加入一个字符。
每次修改完之后回答这三个串能否表示成\(S\)的三个不交的子序列。

考虑一个\(dp\)\(f[i][a][b][c]\),表示当前考虑到了串的第\(i\)个位置,匹配了到了三个串的\(a,b,c\)位置。
然后发现第一维这个东西非常蠢。把状态改一下,变成\(f[a][b][c]\)表示三个串分别匹配到\(a,b,c\)\(i\)的最小值。
这样子单次修改转移的复杂度就是\(O(len^2)\),这样子复杂度就很对了。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100100
int n,Q;
int nxt[MAX][26],lst[26];
char s[MAX],a[4][MAX];
int len[4],f[255][255][255];
void dp(int x,int y,int z)
{if(!(x|y|z))return;f[x][y][z]=n+1;if(x&&f[x-1][y][z]<=n)f[x][y][z]=min(f[x][y][z],nxt[f[x-1][y][z]][a[1][x]-97]);if(y&&f[x][y-1][z]<=n)f[x][y][z]=min(f[x][y][z],nxt[f[x][y-1][z]][a[2][y]-97]);if(z&&f[x][y][z-1]<=n)f[x][y][z]=min(f[x][y][z],nxt[f[x][y][z-1]][a[3][z]-97]);
}
int main()
{scanf("%d%d%s",&n,&Q,s+1);for(int i=0;i<26;++i)lst[i]=n+1;for(int i=n;~i;--i){for(int j=0;j<26;++j)nxt[i][j]=lst[j];if(i)lst[s[i]-97]=i;}while(Q--){char ch[2],ss[2];int x;scanf("%s%d",ch,&x);if(ch[0]=='+'){scanf("%s",ss);a[x][++len[x]]=ss[0];if(x==1)for(int i=0;i<=len[2];++i)for(int j=0;j<=len[3];++j)dp(len[1],i,j);if(x==2)for(int i=0;i<=len[1];++i)for(int j=0;j<=len[3];++j)dp(i,len[2],j);if(x==3)for(int i=0;i<=len[1];++i)for(int j=0;j<=len[2];++j)dp(i,j,len[3]);}else --len[x];if(f[len[1]][len[2]][len[3]]<=n)puts("YES");else puts("NO");}return 0;
}

C. Tree Generator™

给你一个括号序列,显然一个合法的括号序列和一棵树是对应的。
现在每次交换括号序列的两个位置,求交换完之后的每一棵树的直径。

首先问题可以变成给定把(看成\(1\),把)看成\(-1\)
于是问题就变成了你要在括号序列上找到任意一段连续的子串,并且把它分成两段,使得后一半的值减去前一半的值最大。
然后线段树维护一下就行了。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 200200
#define lson (now<<1)
#define rson (now<<1|1)
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,Q;char s[MAX];
struct Node{int pre[2],suf[2],ans,sum,tot;}t[MAX<<2],L,R;
Node operator+(Node a,Node b)
{Node c;c.pre[0]=max(a.pre[0],a.sum+b.pre[0]);c.pre[1]=max(a.pre[1],max(a.tot+b.pre[0],-a.sum+b.pre[1]));c.suf[0]=max(b.suf[0],-b.sum+a.suf[0]);c.suf[1]=max(b.suf[1],max(b.tot+a.suf[0],b.sum+a.suf[1]));c.sum=a.sum+b.sum;c.tot=max(a.tot+b.sum,-a.sum+b.tot);c.ans=max(max(a.ans,b.ans),max(a.suf[0]+b.pre[1],a.suf[1]+b.pre[0]));return c;
}
void Modify(int now,int l,int r,int p)
{if(l==r){t[now]=(s[p]=='(')?L:R;return;}int mid=(l+r)>>1;if(p<=mid)Modify(lson,l,mid,p);else Modify(rson,mid+1,r,p);t[now]=t[lson]+t[rson];
}
int main()
{L=(Node){1,1,0,1,1,1,1};R=(Node){0,1,1,1,1,-1,1};n=(read()-1)<<1;Q=read();scanf("%s",s+1);for(int i=1;i<=n;++i)Modify(1,1,n,i);printf("%d\n",t[1].ans);while(Q--){int x,y;swap(s[x=read()],s[y=read()]);Modify(1,1,n,x);Modify(1,1,n,y);printf("%d\n",t[1].ans);}return 0;
}

D. Abandoning Roads

你有一张图,你需要对于每一个点回答在任意一棵最小生成树中,\(1\)号点到这个点的路径的最小值是多少。
边权只有两种。

首先小的边权叫做\(a\),大的边权叫做\(b\)
现在是\(a\)边构成了一堆联通块,然后你用\(b\)边把这些联通块链接然后求最短路。
这里直接求最短路有一个问题就是你不能在同一个联通块内用\(b\)边,也不能让一条路径重复的经过两次同一个联通块。
那么我们考虑状压,记录已经访问过了哪一些联通块。
然而这样子是\(2^n\)的。
发现大小为\(1,2,3\)的联通块你不可能用\(b\)边绕一圈再重新进来,所以只需要考虑大小至少为\(4\)的联通块。这样子复杂度就降下来了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 72
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
struct Line{int v,next,w;}e[500];
int h[MAX],cnt=1;
inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
int f[MAX],sz[MAX];
int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
void Merge(int x,int y){x=getf(x);y=getf(y);f[y]=x;sz[x]+=sz[y];}
int dis[MAX][131072];bool vis[MAX][131072];
struct Node{int u,d,S;};
bool operator<(Node a,Node b){return a.d>b.d;}
priority_queue<Node> Q;
void upd(int u,int d,int S){if(dis[u][S]>d)dis[u][S]=d,Q.push((Node){u,d,S});}
int n,m,A,B,book[MAX],tim;
int main()
{n=read();m=read();A=read();B=read();for(int i=1;i<=n;++i)f[i]=i,sz[i]=1,book[i]=-1;for(int i=1;i<=m;++i){int u=read(),v=read(),w=read();Add(u,v,w);Add(v,u,w);if(w==A)Merge(u,v);}for(int i=1;i<=n;++i)if(book[i]==-1&&sz[getf(i)]>3){for(int j=i;j<=n;++j)if(getf(i)==getf(j))book[j]=tim;++tim;}memset(dis,63,sizeof(dis));upd(1,0,(~book[1])?1<<book[1]:0);while(!Q.empty()){int u=Q.top().u,S=Q.top().S;Q.pop();if(vis[u][S])continue;vis[u][S]=true;for(int i=h[u];i;i=e[i].next){int v=e[i].v,w=e[i].w;if(w==A)upd(v,dis[u][S]+w,S);else{if(getf(u)==getf(v))continue;if(~book[v]&&(S&(1<<book[v])))continue;upd(v,dis[u][S]+w,S|((~book[v])?1<<book[v]:0));}}}for(int i=1;i<=n;++i){int ans=1<<30;for(int j=0;j<1<<tim;++j)ans=min(ans,dis[i][j]);printf("%d ",ans);}return 0;   
}

E. Election Promises

有一个\(DAG\),现在两个人轮流操作。每次操作可以随意指定一个权值不为\(0\)的点,然后把它的权值减小为任意非负整数,同时可以把其所有出边的点权任意修改。不能操作者输。
求先手是否必胜。

首先盲猜肯定和\(sg\)函数那套理论相关,然后把每个点的\(sg\)值给求出来。
题目的结论是:对于所有\(sg=i\)的点,我们令\(s_k=\oplus_{sg[i]=k}h[i]\),如果存在一个\(s_k\neq 0\)的话那么先手必胜,否则先手必败。

证明(伪证)
首先\(h\)全是\(0\)的时候一定是先手必败。
对于一个\(sg=k\)的点\(u\),其儿子中必定包含了\([0,k-1]\)这些\(sg\)值。那么我们找到最大的\(sg\)值,其一定只能影响所有比他小的\(sg\)值的位置。
那么我们修改这个\(sg\)值中\(h\)最大的那个点,那么必定可以让它的\(sg\)值减小,然后一定可以把所有的\(s\)全部变成\(0\),于是我们变成了一个必败态。
而后手此时操作完之后又一定存在至少一个数是\(0\),又成了必胜态。

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define MAX 200200
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
vector<int> E[MAX];
int n,m,h[MAX],sg[MAX],sum[MAX];
int dg[MAX],Q[MAX],vis[MAX];
void Topsort()
{int h=1,t=0;for(int i=1;i<=n;++i)if(!dg[i])Q[++t]=i;while(h<=t){int u=Q[h++];for(int v:E[u])if(!--dg[v])Q[++t]=v;}
}
int main()
{n=read();m=read();for(int i=1;i<=n;++i)h[i]=read();for(int i=1;i<=m;++i){int u=read(),v=read();E[u].push_back(v);++dg[v];}Topsort();for(int i=n;i;--i){int u=Q[i];for(int v:E[u])vis[sg[v]]=i;while(vis[sg[u]]==i)++sg[u];sum[sg[u]]^=h[u];}for(int i=n;~i;--i)if(sum[i]){int pos;for(int j=1;j<=n;++j)if(sg[j]==i&&h[j]>(sum[i]^h[j]))pos=j;h[pos]^=sum[i];for(int v:E[pos])h[v]^=sum[sg[v]],sum[sg[v]]=0;puts("WIN");for(int j=1;j<=n;++j)printf("%d ",h[j]);puts("");return 0;}puts("LOSE");return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/10802497.html

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

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

相关文章

FC冒险岛java版_冒险岛单机版

游戏概述冒险岛单机版是一款非常好玩的横版动作RPG游戏&#xff0c;游戏难度很适中&#xff0c;冒险岛单机版采用了与其他Q版2D游戏不同的横向卷轴的移动方式&#xff0c;场景高低落差的设计&#xff0c;整个画面层次感设计算是一级&#xff0c;喜欢这类手柄闯关游戏的玩家快来…

通过小程序实现网站扫码登录!每年都可以省 300 块...代替微信开放平台和服务号的登陆模式!

我们知道&#xff0c;要接入微信登陆有两种方式 1、微信开放平台2、微信服务号 这两种方式均可生成带参数的二维码&#xff0c;然后扫码获取用户基本信息的&#xff0c;所以我们可以在网站上用这两种方式开发网站的扫码登录&#xff0c;也是现在很多网站的通用做法。 微信开…

WAR文件与具有嵌入式服务器的Java应用程序

大多数服务器端Java应用程序&#xff08;例如&#xff0c;面向Web或面向服务的&#xff09;都希望在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这无非是具有标准目录布局的ZIP归档文件&#xff0c;其中包含运行时所需的所有库和应用程序级依赖…

JavaFX自定义控件– Nest Thermostat第3部分

嗨&#xff0c;经过与同事的讨论&#xff0c;我今天决定展示css方法不是唯一可用于创建自定义控件的方法。 当然&#xff0c;它允许提供一些外观扩展点&#xff0c;但是可以使用代码API使用相同的方法&#xff08;与向JavaFX的转换&#xff09;一起使用。 这是图形初始化方法&…

ceph rgw java_ceph rgw multisite基本用法

Realm&#xff1a; Zonegroup&#xff1a; 理解为数据中心&#xff0c;由一个或多个Zone组成&#xff0c;每个Realm有且仅有 一个Master Zonegroup&#xff0c;用于处理系统变更&#xff0c;其他的称为Slave Zonegroup&#xff0c;元数据与Master Zonegroup保持一致&#xff1b…

Python基础-Hello Word!

老师说&#xff0c;学习语言一定要有仪式感&#xff0c;So... print (“Hello Word”) 哈哈&#xff0c;好牛叉&#xff01; 一、 Python安装 Windows 1、 下载安装包 https://www.python.org/downloads/ 2、 安装 默认安装路径: C:\Users\admin\AppData\Local\Programs\Python…

微信小程序 request请求封装

request 只用 POST&#xff0c;只封装了 POST&#xff0c;等有用到 GET再重写&#xff0c;接口用的 ThinkPHP5.0主要代码 var apiurl "xxxxx"; function http_post(controller,data,cb){wx.request({url:apiurl controller,data:data,method:post,header:{Content-…

MySQL基本语句

MySQL基本语句 数据库语句介绍&#xff1a; 语言分类&#xff1a; DDL&#xff1a;数据库和表 DML&#xff1a;表中的数据 DQL&#xff1a;查询表中的数据 DCL:(授权) DDL: 1、操作数据库 创建数据库&#xff1a; create database 数据库名&#xff1b; 创建数据库&#xff0c;…

使用Java注解不正确的方法

几乎没有什么Deprecated没有适当的文档看到Deprecated方法更令人生气的了。 我感到失落。 我应该仍然使用该方法吗&#xff1f; 可能这不是开发人员的意图&#xff0c;这就是为什么他/她添加了弃用注释。 我应该使用其他东西吗&#xff1f; 所以…。 使用Deprecated的规则是什…

easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程

一、Easypanel软件简介&#xff1a;Easypanel是一款虚拟主机管理工具&#xff0c;它支持php(windows系统还支持asp、asp.net)、磁盘配额、在线文件管理、在线web软件安装&#xff0c;是一款集虚拟主机、ftp、mysql等功能为一体的管理系统&#xff0c;本身还集成了kangle web服务…

游戏、脑洞大开1(密码简单破译)

“二八”妙龄写密码&#xff0c;看谁聪明“爱死他”。 密文&#xff1a;766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62 注意&#xff1a;&#xff08;1&#xff09;此题由正心41上课的同学做 &#xff08;2&#xff09;第一个提交&#xff0c;答案&#xff1a…

html-字体属性

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;}/*font-family 字体类型浏览器默认的字体是微软雅黑&#xff0c;字体中有多个字体的时候&…

thinkPHP利用ajax异步上传图片并显示、删除

近来学习tp5的过程中&#xff0c;项目中有个发帖功能&#xff0c;选择主题图片。如下&#xff1a; 利用原始的文件上传处理&#xff0c;虽然通过原始js语句能实时显示上传图片&#xff0c;但是这样的话会涉及很多兼容问题。使用ajax技术&#xff0c;实现选择性删除所选图片功能…

我喜欢构建器模式的三个原因

有三种方法可以用Java编程语言创建新对象&#xff1a; 伸缩构造函数&#xff08;反&#xff09;模式 Javabeans模式 建造者模式 与其他两种方法相比&#xff0c;我更喜欢使用构建器模式。 为什么&#xff1f; Joshua Bloch描述了构建器模式以及在Effective Java中使用它的…

表单php跳转页面跳转,form表单页面跳转方式提交练习

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//form表单提交练习/*新建一个form.html网页用来书写前端HTML表单*/表单提交练习姓名:年龄:电话:地址:QQ:自我评价://以上功能可自己添加或修改/*在form.html网页的基础上新建一个foms.php网页关联之前的form.html网页并书写php测试…

.NetCore模拟Postman的BasicAuth生成Authrization

一、思路 BasicAuth 是一种简单权限&#xff0c;传输UserName<userName>,Password<password> 1.用:连接Username,Password 2.进行Base64编码 3."Basic空格"拼接 二、代码示例 string authorization $"{userName}:{password}"; var authorizat…

Vue项目页面跳转时候的,浏览器窗口上方的进度条显示

1.安装&#xff1a; cnpm install --save nprogress 2.在main.js中引入&#xff1a; 1 import NProgress from nprogress 2 import nprogress/nprogress.css 3.在main.js中进行配置&#xff1a; 1 NProgress.configure({ 2 easing: ease, // 动画方式 3 spee…

使用Spring跟踪应用程序异常

几周前&#xff0c;一位同事要求我花一个星期的时间做后援&#xff0c;因为他需要一个掩护&#xff0c;而他度过了一个赚钱的假期&#xff0c;而他找不到其他人。 当我刚完成一个特别复杂的编码项目并感到有些疲倦时&#xff0c;我说“是”。 毕竟&#xff0c;改变对我有好处。…

php redis.dll php5.6,在Windows 64位下为PHP5.6.14安装redis扩展

一.php安装redis扩展1.使用phpinfo()查看当前版本的信息2.根据PHP版本号&#xff0c;编译器版本号和CPU架构选择php_redis-2.2.5-5.6-nts-vc11-x64.zip和php_igbinary-1.2.1-5.5-nts-vc11-x64.zip下载地址&#xff1a;http://windows.php.net/downloads/pecl/snaps/redis/2.2.5…

js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数&#xff0c;这里嵌套一层函数用来接收对象属性名&#xff0c;其他部分代码与正常使用sort方法相同. var arr [{name:zopp,age:0},{name:gpp,age:18},{name:yjj,age:8} ];function compare(pr…