Educational Codeforces Round 63 Div. 2
A:找到两个相邻字符使后者小于前者即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 300010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n;char s[N];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read();scanf("%s",s+1);
int x=0;
for (int i=2;i<=n;i++) if (s[i]<s[i-1]) {x=i;break;}
if (x==0) cout<<"NO";
else cout<<"YES"<<endl<<x-1<<' '<<x;
return 0;
//NOTICE LONG LONG!!!!!
}
B:设(n-11)/2=x,8的出现次数=y。显然x>=y时,后手一直拿8就可以阻止先手取胜。考虑x<y的情况,后手的最优策略仍然是一直拿最靠前的8,而先手应该拿最靠前的非8的数。于是找到第x+1个8的位置check一下。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n;char s[N];
signed main()
{
n=read();scanf("%s",s+1);
int cnt=0;for (int i=1;i<=n;i++) if (s[i]=='8') cnt++;
if ((n-11)/2>=cnt) {cout<<"NO";return 0;}
cnt=(n-11)/2;
for (int i=1;i<=n;i++)
if (s[i]=='8')
{
cnt--;
if (cnt==-1)
{
if (i-1<=n-11) cout<<"YES";
else cout<<"NO";
break;
}
}
return 0;
//NOTICE LONG LONG!!!!!
}
C:a相邻作差取gcd,看b中是否有gcd的因子。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 300010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
ll read()
{
ll x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m;
ll a[N],b[N];
signed main()
{
n=read(),m=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=m;i++) b[i]=read();
sort(a+1,a+n+1);
ll u=0;
for (int i=2;i<=n;i++) u=gcd(u,a[i]-a[i-1]);
for (int i=1;i<=m;i++)
if (u%b[i]==0)
{
cout<<"YES"<<endl;
cout<<a[1]<<' '<<i;
return 0;
}
cout<<"NO";
return 0;
//NOTICE LONG LONG!!!!!
}
D:显然修改的子串一定会被选入答案,这样序列可以被分为五部分,即不被选入答案→被选入答案但不修改→被选入答案且修改→被选入答案但不修改→不被选入答案。可以整一些前缀和,但写起来可能有点麻烦。更简单的做法是f[i][0/1/2/3/4]表示当前在哪个阶段。https://www.cnblogs.com/Gloid/p/10358542.html受这一场的D启发。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 300010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,a[N];
ll ans,s[N],ssuf[N],pre[N],suf[N],f[N][5];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read();
for (int i=1;i<=n;i++) a[i]=read();
memset(f,200,sizeof(f));
for (int j=0;j<5;j++) f[0][j]=0;
for (int i=1;i<=n+1;i++)
{
for (int j=0;j<5;j++)
for (int k=0;k<=j;k++)
f[i][j]=max(f[i][j],f[i-1][k]);
f[i][1]+=a[i];
f[i][2]+=1ll*a[i]*m;
f[i][3]+=a[i];
}
cout<<f[n+1][4];
}
E:写着脸上的拉格朗日插值。直接代入求值会T,先求出多项式即可。或者也可以高斯消元。所以询问次数是用来干啥的?
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define P 1000003
#define N 1000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int a[20],Inv[P],f[20],g[20];
int inv(int a){return Inv[a];}
/*int calc(int n,int x)
{
int ans=0;
for (int i=0;i<n;i++)
{
int u=1;for (int j=0;j<n;j++) if (i!=j) u=1ll*u*(P+i-j)%P;
u=1ll*a[i]*inv(u)%P;
for (int j=0;j<n;j++) if (i!=j) u=1ll*u*(P+x-j)%P;
ans=(ans+u)%P;
}
return ans;
}*/
int calc(int x)
{
int s=f[11];
for (int i=10;i>=0;i--) s=(1ll*s*x+f[i])%P;
return s;
}
signed main()
{
Inv[0]=Inv[1]=1;for (int i=2;i<P;i++) Inv[i]=P-1ll*(P/i)*Inv[P%i]%P;
for (int i=0;i<12;i++)
{
cout<<"?"<<' '<<i<<endl;
a[i]=read();
}
for (int i=0;i<12;i++)
{
memset(g,0,sizeof(g));g[0]=1;
for (int j=0;j<12;j++)
if (i!=j)
{
for (int k=0;k<12;k++) g[k]=1ll*g[k]*inv((i-j+P)%P)%P;
for (int k=11;k>=1;k--) g[k]=(g[k-1]-1ll*g[k]*j%P+P)%P;
g[0]=(P-1ll*g[0]*j%P)%P;
}
for (int j=0;j<12;j++) f[j]=(f[j]+1ll*g[j]*a[i])%P;
}
for (int i=0;i<P;i++)
if (calc(i)==0) {cout<<"!"<<' '<<i<<endl;return 0;}
cout<<"!"<<' '<<-1<<endl;
return 0;
//NOTICE LONG LONG!!!!!
}
F:怎么感觉这么经典!哇我好像做过原题!https://www.cnblogs.com/Gloid/p/10291212.html 这个题一方面去掉了边权且没有重边,一方面要输出方案。前者当然是喜大普奔,不用判一些乱七八糟的情况了。后者求出dp数组后递归输出即可,在预处理能否串成链时记录一下串成的链是怎样的。复杂度O(2n*n3+3n*n2),但这个dp的常数一看就优秀的没边。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 14
#define M 1000
#define inf 100000000
#define rep(i,t,S) for (int t=S,i=lg2[t&-t];t;t^=t&-t,i=lg2[t&-t])
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,a[N][N],f[1<<N],size[1<<N],lg2[1<<N];
bool g[N][N][1<<N];
int way[N][N][1<<N][N+1];
struct data{int x,y,z;
}edge[M];
void print(int S)
{
if (size[S]==1) return;
for (int i=S-1&S;i;i=i-1&S)
rep(x,u,i^S) rep(y,v,i^S)
{
if (g[x][y][i]&&f[i^S]+size[i]+1==f[S])
{
cout<<y+1<<' '<<way[x][y][i][1]+1<<endl;
for (int t=1;t<way[x][y][i][0];t++) cout<<way[x][y][i][t]+1<<' '<<way[x][y][i][t+1]+1<<endl;
cout<<way[x][y][i][way[x][y][i][0]]+1<<' '<<x+1<<endl;
print(i^S);
return;
}
if (x==y) break;
}
}
int main()
{
n=read(),m=read();
for (int i=1;i<=m;i++)
{
edge[i].x=read()-1,edge[i].y=read()-1,edge[i].z=1;
g[edge[i].x][edge[i].y][0]=g[edge[i].y][edge[i].x][0]=1;
}
memset(f,42,sizeof(f));for (int i=0;i<n;i++) f[1<<i]=0,lg2[1<<i]=i;
for (int i=1;i<(1<<n);i++) size[i]=size[i^(i&-i)]+1;
for (int i=1;i<(1<<n);i++)
{
rep(x,p,(1<<n)-1^i) rep(y,q,(1<<n)-1^i)
if (x!=y||i!=(i&-i)) rep(j,o,i)
if (g[j][y][i^(1<<j)]&&g[x][j][0])
{
g[x][y][i]=1;
for (int u=0;u<=way[j][y][i^(1<<j)][0];u++) way[x][y][i][u]=way[j][y][i^(1<<j)][u];
way[x][y][i][++way[x][y][i][0]]=j;
break;
}
}
for (int i=1;i<(1<<n);i++)
for (int j=i-1&i;j;j=j-1&i)
rep(x,u,i^j) rep(y,v,i^j)
{
if (g[x][y][j]&&f[i^j]+size[j]+1<f[i]) f[i]=f[i^j]+size[j]+1;
if (x==y) break;
}
printf("%d\n",f[(1<<n)-1]);
print((1<<n)-1);
return 0;
}
小小号打的。result:rank 1 rating +297 精准的没有超过小号(
Educational Codeforces Round 63 Div. 2的更多相关文章
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- [Educational Codeforces Round 63 ] D. Beautiful Array (思维+DP)
Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array time limit per test 2 seconds ...
- Educational Codeforces Round 63部分题解
Educational Codeforces Round 63 A 题目大意就不写了. 挺简单的,若果字符本来就单调不降,那么就不需要修改 否则找到第一次下降的位置和前面的换就好了. #include ...
- Educational Codeforces Round 84 (Div. 2)
Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array (简单DP)
题目:https://codeforces.com/contest/1155/problem/D 题意:给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和 思路: ...
- Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元
https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...
- Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)
https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...
- Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维
题意:博弈题面 给出一个数字序列 (>=11) 有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手 数字序列一定是奇 ...
- Educational Codeforces Round 63 (Rated for Div. 2) C. Alarm Clocks Everywhere gcd
题意:给出一个递增的时间序列a 给出另外一个序列b (都是整数) 以b中任选一个数字作为间隔 自己从1开始任选一个时间当成开始时间 输出选择的数字标号以及 开始时间 思路 直接求间隔的公共gc ...
随机推荐
- AspNetCore 多环境配置 以及注册 消费Consul
本文主要记录 CoreApi 的多环境配置以及如何消费在consul中注册的Api 服务 1.创建三个CoreApi 我们在项目中创建三个站点分别为 UserServices “用户服务”,Order ...
- 项目开发过程中什么是开发环境、测试环境、生产环境、UAT环境、仿真环境?
项目开发过程中什么是开发环境.测试环境.生产环境.UAT环境.仿真环境? 最近在公司项目开发过程中总用到测试环境,生产环境和UAT环境等,然而我对环境什么的并不是很理解它的意思,一直处于开发阶段,出于 ...
- C#之使类型参数--泛型
1.泛型是什么 泛型的就是“通用类型”,它可以代替任何的数据类型,使类型参数化,从而达到只实现一个方法就可以操作多种数据类型的目的. 2.为什么使用泛型 举一个比较两个数大小的例子: 以上例子实现in ...
- Java学习点滴——对象实例化
基于<Java编程思想>第四版 构造与析构 在C++中通过构造函数和析构函数来保证:对象在使用前被正确初始化,在使用后被正确回收.Java中同样存在构造函数,但是没有析构函数.之所以没有析 ...
- Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?
Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...
- Dynamics 365-关于BPF的进一步探究
关于BPF是什么,以及如何在CRM中配置BPF,可以参阅熊宸大神的博客Dynamics 365 Business Process Flow -- 让你不再惧怕复杂的业务流程! 1. CRM中发生了什么 ...
- 【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈
第1章 当前主流的小型嵌入式网络协议栈 这几年物联网发展迅猛,各种新产品.新技术也是层出不穷,本章节就为大家介绍当前主流的小型嵌入式网络协议栈. 1.1 当前主流的嵌入式网络协议栈 1.2 u ...
- 经度和纬度在SQL中的数据类型
冬天太冷,等坐公司班车也很冷,就萌生了给班车做一个到站查询功能. 在某宝上买了汽车在线的GPS设备, 终生免费的服务的. 这里不得不提下这个设备的优点, 它提供API接口,还是免费的. 所以在班车上装 ...
- Linux Mint如何安装“微信、QQ、迅雷、WPS办公软件”等国内上瘾软件
很多小伙伴都用ubuntu或者Linux Mint,但由于已经习惯了让人成瘾的国产软件,比如迅雷,qq,微信等,其实我们应该培养更为健康的上网习惯,这些软件不是非用不可,但如果你不用不行, 那么也是有 ...
- centos基本命令
$>ls $>ls --help //查看命令帮助 $>man ls //查看命令帮助 $>clear //清屏 $>cd /home //切换目录 $>cd . ...