codeforces 1097 Hello 2019
又回来了。。
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的更多相关文章
- codeforces#1097 D. Makoto and a Blackboard(dp+期望)
题意:现在有一个数写在黑板上,它以等概率转化为它的一个约数,可以是1,问经过k次转化后这个数的期望值 题解:如果这个数是一个素数的n次方,那么显然可以用动态规划来求这个数的答案,否则的话,就对每个素因 ...
- Codeforces 1097 G. Vladislav and a Great Legend
题目链接 一道好题. 题意:给定一棵\(n\)个点的树,求: \[\sum_{S\subseteq \{1,2,\dots,n\}}f(S)^k\] 其中\(f(S)\)代表用树边将点集\(S\)连通 ...
- 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 ...
- [题解][Codeforces]Good Bye 2019 简要题解
构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...
- Hello 2019 (D~G)
目录 Codeforces 1097 D.Makoto and a Blackboard(DP 期望) E.Egor and an RPG game(思路 LIS Dilworth定理) F.Alex ...
- 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++ ...
- (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 ...
- 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)
Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...
- Codeforces Hello 2019
Hello 2019 手速场qwq 反正EGH太神仙了啊.jpg 考试的时候不会啊.jpg A 暴力.jpg #include <cstdio> #include <algorith ...
随机推荐
- 邮件的DNS设置
为了反垃圾,在发件人使用的域名下面最好配置两条DNS记录:SPF和DKIM,他们都是用来反垃圾的,邮件接受服务器会检查这两项,只有符合要求才会进入用户的邮箱. 一般来说,大批量发送邮件时,我们会使用第 ...
- extjs错误,看到红色才能让自己记住知识点
1.Cannot call method 'getColumnCount' of undefined Hi, maybe you use colModel before rendering.Notic ...
- 【Python】if相关知识点
1.9选课中心前两页课程名称打印到固定系统文件夹的某个csv文件中. #-*- coding: UTF-8 -*- #coding==utf-8 #from selenium.webdriver.su ...
- mysql 使用存储引擎
三 使用存储引擎 方法1:建表时指定引擎 指定innodb,不写默认也是innodb use 数据库先 create table innodb_t1(id int,name char)engine=i ...
- dedecms后台每页文章条数如何修改(“文档列表”每一页显示的文档条数)
小明在学习采集,弄了个dedecms作为发布平台,几个小时后跑来报喜说好简单,但又不想制造那么多spam,每个分类只保留几条就好.在后台删除这些文章,每页只显示30个,看了下有100多页,立马沮丧了, ...
- 【剑指offer】变态跳台阶
一.题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路: f(n)=f(n-1)+f(n-2)+...+f(0),f(1) ...
- jconsole监控远程 spring boot程序
监控java 程序 增加启动参数 java \ -Djava.rmi.server.hostname=192.168.1.97 \ -Dcom.sun.management.jmxremote \- ...
- 用python参加Kaggle的些许经验总结(收藏)
Step1: Exploratory Data Analysis EDA,也就是对数据进行探索性的分析,一般就用到pandas和matplotlib就够了.EDA一般包括: 每个feature的意义, ...
- ACM 未解决的问题
还没有搞定的ACM问题列表. google code jam Round1A Round1B Round1C Round2 Round3 Onsite Finals 百度之星 一.资格赛题目: dis ...
- 剑指offer4
中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,先左后根再右.巧记:左根右. 现在有一个问题,已知二叉树的前序遍历和中序遍历:PreOrder: GDAFE ...