又回来了。。

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. oracle(八)块清除

    (1)  快速块清除(fast block cleanout), 当事务修改的数据库全部保存在buffer cache并且修改数据块的数据量没有超过cache buffer 的10%,快速清除事务信息 ...

  2. 【JS】自学

    JS自学网址: http://www.runoob.com/js/js-tutorial.html

  3. 【Pyton】【小甲鱼】类和对象:一些相关的BIF(内置函数)

    1.issubclass(class,classinfo) 1)一个类被认为是其自身的子类 2)classinfo可以使类对象组成的元祖,只要class与其中任何一个候选类的子类,则返回True. & ...

  4. python基础班-淘宝-目录.txt

    卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python基础班-淘宝-目录.txt│ ├─1-1 Linux基础│ ├─01-课程简介│ │ 01-课程 ...

  5. /etc/issue 查看系统版本号

    查看系统版本号 [root@mysql bin]# cat /etc/issue CentOS release 6.4 (Final) Kernel \r on an \m

  6. Spark ClassNotFoundException $$anonfun$2

    Spark ClassNotFoundException $$anonfun$2 1. 软件环境: 软件 版本 Spark 原生1.6.0 Hadoop 原生2.6.5 2. 应用场景&问题描 ...

  7. openstack 部署笔记--neutron控制节点

    控制节点 配置neutron用户及服务 $ . admin-openrc $ openstack user create --domain default --password-prompt neut ...

  8. &nbsp

    这个东西在 html 里是空格占位符,普通的空格在 html 里如果连续的多个可能被认为只有一个,而这个东西你写几个就能占几个空格位.

  9. matplotlib —— 调整坐标轴

    import matplotlib.pyplot as plt import numpy as np # 绘制普通图像 x = np.linspace(-1, 1, 50) y1 = 2 * x + ...

  10. testng入门教程13同文件数据驱动

    下面是@DataProvider有name和没有name时 有name的时候可以引用name 即:@DataProvider(name="testData")----------& ...