又回来了。。

A - Gennady and a Card Game

好像没什么可说的了。

#include<bits/stdc++.h>
using namespace std; char gc() {
static char buf[100000],*p1,*p2;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
T f=1;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
} const int Maxn=110000;
const int inf=0x3f3f3f3f; char a[Maxn],s[Maxn]; int main() {
scanf("%s",a);
for(int i=1;i<=5;i++) {
scanf("%s",s);
if(a[0]==s[0]||a[1]==s[1]) return 0*puts("YES");
}
puts("NO");
return 0;
}

B - Petr and a Combination Lock

这个当然可以DP一下,不过暴力枚举是能过的。

#include<bits/stdc++.h>
using namespace std; char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
T f=1;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
} const int Maxn=110000;
const int inf=0x3f3f3f3f; int a[Maxn],n; int main() {
read(n);
for(int i=1;i<=n;i++)
read(a[i]);
int x=1<<n;
for(int i=0;i<x;i++) {
int sum=0;
for(int j=1,tempp=1;j<=n;j++,tempp<<=1)
if(i&tempp) sum+=a[j];
else sum-=a[j];
if(sum%360==0) return 0*puts("YES");
}
puts("NO");
return 0;
}

C - Yuhao and a Parenthesis

首先按照括号序列的套路求前缀和,一个序列要么只能做前缀,要么只能做后缀,要么两个都能做或都不能做。

那么只要记一下就好了,都能做的数目要除以2。

#include<bits/stdc++.h>
using namespace std; char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
T f=1;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
} typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f; int n,b[Maxn],c[Maxn];
char a[Maxn];
ll ans; int main() {
read(n);
for(int i=1;i<=n;i++) {
scanf("%s",a);
int lens=strlen(a),sum=0,flag=0;
for(int j=0;j<lens;j++) {
if(a[j]=='(') sum++;
else sum--;
if(sum<0) {
flag=1;
break;
}
}
if(!flag)
flag=1,c[sum]++;
sum=0;
for(int j=lens-1;j>=0;j--) {
if(a[j]==')') sum++;
else sum--;
if(sum<0) {
flag=0;
break;
}
}
if(flag)
b[sum]++;
}
for(int i=1;i<Maxn;i++) ans+=min(b[i],c[i]);
ans+=b[0]>>1;
printf("%I64d",ans);
return 0;
}

D - Makoto and a Blackboard

这题我刚开始想插板,但是最后发现前面的决策对后面有影响,所以不能插板。但是听说暴力DP可以过?于是写了个暴力。

#include<bits/stdc++.h>
using namespace std; char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
T f=1;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
} typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=1000000007; ll n,f[2][Maxn],k,inv[Maxn]; ll powp(ll a,ll b) {
ll ans=1;
while(b) {
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
} int main() {
read(n,k);
ll ans=1;inv[0]=inv[1]=1;
for(int i=2;i<=1000;i++) inv[i]=(mod-(mod/i)*inv[mod%i]%mod)%mod;
for(ll i=2;i*i<=n;i++)
if(n%i==0) {
int temp=0;
while(n%i==0) {
temp++;
n/=i;
}
int now=0;
for(int j=0;j<temp;j++) f[0][j]=0;
f[0][temp]=1;
for(int j=1;j<=k;j++) {
now^=1;ll tempp=0;
for(int l=temp;l>=0;l--)
f[now][l]=tempp=(tempp+f[now^1][l]*inv[l+1]%mod)%mod;
}
ll sxz=0;
for(ll j=0;j<=temp;j++)
sxz+=f[now][j]*powp(i,j)%mod;
sxz%=mod;
ans=ans*sxz%mod;
}
if(n!=1) {
int temp=1;
int now=0;
for(int j=0;j<=temp;j++) f[0][j]=0;
f[0][temp]=1;
for(int j=1;j<=k;j++) {
now^=1;ll tempp=0;
for(int l=temp;l>=0;l--)
f[now][l]=tempp=(tempp+f[now^1][l]*inv[l+1]%mod)%mod;
}
ll sxz=0;
for(ll j=0;j<=temp;j++) sxz+=f[now][j]*powp(n,j)%mod;
sxz%=mod;
ans=ans*sxz%mod;
}
printf("%I64d",ans);
return 0;
}

E - Egor and an RPG game

膜拜一下题解

%%% Radewoosh %%%

那么我们直接模拟即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
using namespace std; inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
} typedef long long ll;
const int Maxn=210000;
const int inf=0x3f3f3f3f; int a[Maxn],b[Maxn],pre[Maxn],res[Maxn],n,vis[Maxn],top,ans; void work(int x) {
if(x==0) return;
int zhy=0;
for(int i=1;i<=x;i++) pre[i]=0;
b[++zhy]=1;
for(int i=2;i<=x;i++) {
int l=1,r=zhy,mid=l+r>>1,nh=0;
while(l<=r) {
if(a[i]>=a[b[mid]]) nh=mid,l=mid+1;
else r=mid-1; mid=l+r>>1;
}
pre[i]=b[nh];
if(nh==zhy) b[++zhy]=i;
else b[nh+1]=i;
}
if(1ll*zhy*(zhy+1)/2>x) {
ans++;
for(int i=1;i<=x;i++) vis[i]=0;
int now=b[zhy],&len=res[++top];
while(now) {
vis[now]=1;
res[++top]=a[now];len++;
now=pre[now];
}
reverse(res+top-len+1,res+top+1);
now=0;
for(int i=1;i<=x;i++)
if(!vis[i]) a[++now]=a[i];
work(now);
}
else {
for(int i=1;i<=x;i++) pre[i]=0;
zhy=0;b[++zhy]=1;
for(int i=2;i<=x;i++) {
int l=1,r=zhy,mid=l+r>>1,nh=0;
while(l<=r) {
if(a[i]<=a[b[mid]]) nh=mid,r=mid-1;
else l=mid+1; mid=l+r>>1;
}
pre[b[nh]]=i;
if(nh) b[nh]=i;
else b[++zhy]=i;
}
for(int i=1;i<=x;i++) vis[i]=0;
for(int i=1;i<=x;i++)
if(!vis[i]) {
ans++;
int now=i,&len=res[++top];
while(now) {
vis[now]=1;
res[++top]=a[now];len++;
now=pre[now];
}
}
}
} signed main() {
// freopen("test.in","r",stdin);
// freopen("out","w",stdout);
int t; read(t);
while(~read(n)) {
for(int i=1;i<=n;i++) read(a[i]);
top=ans=0; work(n);
printf("%d\n",ans);int temp=1;
for(int i=1;i<=ans;i++) {
int len=res[temp++];
printf("%d",len);
while(len--) printf(" %d",res[temp++]);
puts("");
}
for(int i=1;i<=temp;i++) res[i]=0;
}
return 0;
}

F - Alex and a TV Show

如果没有3操作的话,那就直接开bitset就好了。

那么我们考虑3操作。如果我们在bitset里面存的不是原数,而是把原数的质因子都设成1的话,那么我们发现,1,2操作都没有变化,而3操作可以直接&起来,但是输出的时候就不太好办了。解决方法就是容斥一下,注意要预处理好容斥的系数,不然复杂度会爆。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<bitset>
#include<cctype>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
using namespace std; inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
} template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
} template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
} template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
} typedef long long ll;
const int Maxn=110000;
const int inf=0x3f3f3f3f; bitset<7001> a[7001],b[7001],c[Maxn];
int miu[Maxn],bj[Maxn],p[Maxn],tot,n,q,x,u,v,opt; void ycl() {
miu[1]=1;
for(int i=2;i<=7000;i++) {
if(!bj[i]) {
p[++tot]=i;
miu[i]=1;
}
int j=0,temp;
while(j++,(temp=i*p[j])<=7000) {
bj[temp]=1;
if(i%p[j]==0) break;
miu[temp]=miu[i];
}
}
for(int i=1;i<=7000;i++)
for(int j=i;j<=7000;j+=i)
a[j].set(i),b[i].set(j,miu[j/i]);
} signed main() {
// freopen("test.in","r",stdin);
ycl();
read(n,q);
while(q--) {
read(opt,x);
switch(opt) {
case 1 : read(v),c[x]=a[v];break;
case 2 : read(u,v),c[x]=c[u]^c[v];break;
case 3 : read(u,v),c[x]=c[u]&c[v];break;
case 4 : read(v),putchar('0'+((c[x]&b[v]).count()&1));
}
}
return 0;
}

codeforces 1097 Hello 2019的更多相关文章

  1. codeforces#1097 D. Makoto and a Blackboard(dp+期望)

    题意:现在有一个数写在黑板上,它以等概率转化为它的一个约数,可以是1,问经过k次转化后这个数的期望值 题解:如果这个数是一个素数的n次方,那么显然可以用动态规划来求这个数的答案,否则的话,就对每个素因 ...

  2. Codeforces 1097 G. Vladislav and a Great Legend

    题目链接 一道好题. 题意:给定一棵\(n\)个点的树,求: \[\sum_{S\subseteq \{1,2,\dots,n\}}f(S)^k\] 其中\(f(S)\)代表用树边将点集\(S\)连通 ...

  3. Codeforces 1097 Alex and a TV Show

    传送门 除了操作 \(3\) 都可以 \(bitset\) 现在要维护 \[C_i=\sum_{gcd(j,k)=i}A_jB_k\] 类比 \(FWT\),只要求出 \(A'_i=\sum_{i|d ...

  4. [题解][Codeforces]Good Bye 2019 简要题解

    构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...

  5. Hello 2019 (D~G)

    目录 Codeforces 1097 D.Makoto and a Blackboard(DP 期望) E.Egor and an RPG game(思路 LIS Dilworth定理) F.Alex ...

  6. Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)

    Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...

  7. (AB)Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round

    A. Right-Left Cipher time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)

    Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...

  9. Codeforces Hello 2019

    Hello 2019 手速场qwq 反正EGH太神仙了啊.jpg 考试的时候不会啊.jpg A 暴力.jpg #include <cstdio> #include <algorith ...

随机推荐

  1. JDK 伪共享解决方案

    关于AtomicReference AtomicReference是由JAVA5引入的,用于对一个对象引用进行原子操作,我们可以看到AtomicReference的实现是用CAS技术对引用进行指令级别 ...

  2. javaScript高级教程(七)正则表达式中括号三种常见作用

    括号用来将子表达式标记起来,以区别于其他表达式 比如很多的命令行程序都提供帮助命令,键入 h 和键入 help 的意义是一样的,那么就会有这样的表达式: h(elp)? 字符h之后的elp可有可无这里 ...

  3. Unity无法创建新工程

    1.解决方法 重新登录一遍账号

  4. modelform和modelserializer

    modelform modelform比form强悍很多

  5. JavaScript加强

    1.Aptana简介 Aptana是一个非常强大,开源,专注于JavaScript的Ajax开发IDE它的特性包括 1.JavaScript,JavaScript函数,HTML,CSS语言的Code  ...

  6. iOS开发--UILabel根据内容自动调整高度

    写法一:对象方法,传入:字体/最大尺寸. 即可得到宽高, 最大尺寸主要限制宽度,如果是一行就给个{MAXFLOAT,MAXFLOAT};如果是多行就限制X值,Y值随便给 - (CGSize)sizeW ...

  7. Redis的设计与实现——字典

    参考博客 绝大多数语言中的字典底层实现基本上都是哈希表.哈希表中用 “负载因子” 来衡量哈希表的 空/满 程度.为了让负载因子在一定的合理范围之内,提高查询的性能,一般的做法是让哈希表扩容,然后reh ...

  8. MYSQL主从不同步延迟原理分析及解决方案(摘自http://www.jb51.net/article/41545.htm)

    1. MySQL数据库主从同步延迟原理.要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主 库对所有DDL和DML产生binlog,binlog是顺序写,所 ...

  9. Perl的debug小技巧

    进入Perl的调试环境的命令:  Perl  -d  perl_file 设置断点:b + perl代码中的行号. 执行到断点:c 表示continue until breakpoint. 执行下一条 ...

  10. linux常用命令:chkconfig 命令

    chkconfig命令用来安装,查看或修改 services随系统启动的启动选项的设置.是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各 ...