又回来了。。

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. 邮件的DNS设置

    为了反垃圾,在发件人使用的域名下面最好配置两条DNS记录:SPF和DKIM,他们都是用来反垃圾的,邮件接受服务器会检查这两项,只有符合要求才会进入用户的邮箱. 一般来说,大批量发送邮件时,我们会使用第 ...

  2. extjs错误,看到红色才能让自己记住知识点

    1.Cannot call method 'getColumnCount' of undefined Hi, maybe you use colModel before rendering.Notic ...

  3. 【Python】if相关知识点

    1.9选课中心前两页课程名称打印到固定系统文件夹的某个csv文件中. #-*- coding: UTF-8 -*- #coding==utf-8 #from selenium.webdriver.su ...

  4. mysql 使用存储引擎

    三 使用存储引擎 方法1:建表时指定引擎 指定innodb,不写默认也是innodb use 数据库先 create table innodb_t1(id int,name char)engine=i ...

  5. dedecms后台每页文章条数如何修改(“文档列表”每一页显示的文档条数)

    小明在学习采集,弄了个dedecms作为发布平台,几个小时后跑来报喜说好简单,但又不想制造那么多spam,每个分类只保留几条就好.在后台删除这些文章,每页只显示30个,看了下有100多页,立马沮丧了, ...

  6. 【剑指offer】变态跳台阶

    一.题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路: f(n)=f(n-1)+f(n-2)+...+f(0),f(1) ...

  7. jconsole监控远程 spring boot程序

    监控java 程序 增加启动参数 java  \ -Djava.rmi.server.hostname=192.168.1.97 \ -Dcom.sun.management.jmxremote \- ...

  8. 用python参加Kaggle的些许经验总结(收藏)

    Step1: Exploratory Data Analysis EDA,也就是对数据进行探索性的分析,一般就用到pandas和matplotlib就够了.EDA一般包括: 每个feature的意义, ...

  9. ACM 未解决的问题

    还没有搞定的ACM问题列表. google code jam Round1A Round1B Round1C Round2 Round3 Onsite Finals 百度之星 一.资格赛题目: dis ...

  10. 剑指offer4

    中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,先左后根再右.巧记:左根右. 现在有一个问题,已知二叉树的前序遍历和中序遍历:PreOrder:         GDAFE ...