Codeforces Round #443 Div. 1
A:考虑每一位的改变情况,分为强制变为1、强制变为0、不变、反转四种,得到这个之后and一发or一发xor一发就行了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 500010
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 a[20];
signed main()
{
int n=read(),x=0;
while (n--)
{
char c=getchar();
while (c!='|'&&c!='^'&&c!='&') c=getchar();
int u=read();
for (int i=0;i<10;i++)
if (u&(1<<i))
{
if (c=='|') a[i]=1;
if (c=='^')
{
if (a[i]==0) a[i]=3;
else if (a[i]==1) a[i]=2;
else if (a[i]==2) a[i]=1;
else if (a[i]==3) a[i]=0;
}
}
else
{
if (c=='&') a[i]=2;
}
}
cout<<3<<endl;
for (int i=1;i<=3;i++)
{
int x=0;
for (int j=0;j<10;j++)
if (a[j]==i) x|=1<<j;
if (i==2) cout<<'&'<<' '<<(1023^x)<<endl;
else
{
if (i==1) cout<<'|';else cout<<'^';
cout<<' '<<x<<endl;
}
}
return 0;
//NOTICE LONG LONG!!!!!
}
B:先按k=1的情况处理一下。然后若考虑首尾相接是否会超过m个,若会则删掉,若恰好有k个则继续删。最后如果只剩下一种数特殊讨论。坑点比较多。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#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,m,k,a[N],b[N],stk[N],top;
ll ans;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read(),k=read();
for (int i=1;i<=n;i++) a[i]=read();
int u=0;int cnt=0;
for (int i=1;i<=n;i++)
{
if (!top) stk[++top]=a[i],cnt++;
else
{
if (stk[top]==a[i]) cnt++;
else cnt=1;
stk[++top]=a[i];
}
if (cnt==m)
{
top-=m;ans+=1ll*k*m;cnt=0;
for (int j=top;j>=0;j--) if (stk[j]!=stk[top]) {cnt=top-j;break;}
}
}
u=top;memcpy(b,stk,sizeof(b));
int nnn=n;
n=u;memcpy(a,b,sizeof(a));
bool flag=0;
for (int i=2;i<=n;i++) if (a[i]!=a[1]) {flag=1;break;}
if (!flag) {cout<<1ll*nnn*k%m;return 0;}
int l=1,r=n;
while (l<=r)
{
int x=l,y=r;
if (a[l]!=a[r]) break;
while (a[x+1]==a[l]) x++;
while (a[y-1]==a[r]) y--;
if (x>=y)
{
ans+=(1ll*k*(r-l+1)/m)*m;
if (1ll*k*(r-l+1)%m==0) ans+=n-(r-l+1);
break;
}
if (x-l+1+r-y+1>=m)
{
ans+=1ll*(k-1)*m;
if (x-l+1+r-y+1>m) break;
else if (m==(x-l+1+r-y+1)) l=x+1,r=y-1;
else break;
}
else break;
}
ans=1ll*nnn*k-ans;
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
C:考虑建图,a向b连边表示a可以打败b。这样缩点后度数为0的点(显然只会存在一个)中的所有选手都可能取胜。考虑动态维护。每个SCC记录大小和各项的minmax。注意到所有SCC每一项都构成偏序关系(maxi<mini+1),于是用一个set,新加入一个点时找到前驱后继,看新点能否与其互相打败而合并成一个新的SCC即可。具体实现参考了这份代码https://codeforces.com/contest/878/submission/31775120,感觉过于优美。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
#define ll long long
#define N 50010
#define M 12
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;
struct data
{
int size,min[M],max[M];
bool operator <(const data&a) const
{
for (int i=1;i<=m;i++) if (max[i]>a.min[i]) return 0;
return 1;
}
void merge(const data&a)
{
size+=a.size;
for (int i=1;i<=m;i++)
{
if (a.min[i]<min[i]) min[i]=a.min[i];
if (a.max[i]>max[i]) max[i]=a.max[i];
}
}
};
multiset<data> q;
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++)
{
data p;p.size=1;
for (int j=1;j<=m;j++) p.min[j]=p.max[j]=read();
multiset<data>::iterator first_beat_p=q.lower_bound(p),first_p_cannot_beat=q.upper_bound(p);
while (first_beat_p!=first_p_cannot_beat)
{
p.merge(*first_beat_p);
first_beat_p=q.erase(first_beat_p);
}
q.insert(p);multiset<data>::iterator tmp=q.end();tmp--;
printf("%d\n",(*tmp).size);
}
return 0;
//NOTICE LONG LONG!!!!!
}
D:考虑所有数值都为01的情况。这样一共只有2k种本质不同的特征,可以bitset记录每种特征最后的答案直接暴力过去。不为01的话容易想到二分答案之类,实际上使用完全相同的做法得到01时的答案,最后类似于二分答案的做即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
#define ll long long
#define N 100010
#define K 12
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,q,k,a[K][N],b[N][K],cnt,u;
bitset<(1<<K)> S[N];
bool cmp(const int &x,const int &y)
{
return a[x][u]<a[y][u];
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
#endif
n=read(),k=read(),q=read();
for (int i=0;i<k;i++)
for (int j=1;j<=n;j++)
a[i][j]=read();
for (int i=0;i<k;i++)
{
for (int j=0;j<(1<<k);j++)
S[i][j]=(j&(1<<i))>0;
}
for (u=1;u<=n;u++)
{
for (int j=0;j<k;j++) b[u][j]=j;
sort(b[u],b[u]+k,cmp);
}
cnt=k-1;
for (int i=1;i<=q;i++)
{
int op=read(),x=read()-1,y=read();
if (op==1) S[++cnt]=S[x]|S[y-1];
if (op==2) S[++cnt]=S[x]&S[y-1];
if (op==3)
{
u=0;
for (int j=k-1;j>=0;j--)
{
u|=1<<b[y][j];
if (S[x][u]) {printf("%d\n",a[b[y][j]][y]);break;}
}
}
}
return 0;
//NOTICE LONG LONG!!!!!
}
Codeforces Round #443 Div. 1的更多相关文章
- Codeforces Round #443 (Div. 2) 【A、B、C、D】
Codeforces Round #443 (Div. 2) codeforces 879 A. Borya's Diagnosis[水题] #include<cstdio> #inclu ...
- Codeforces Round #443 (Div. 1) D. Magic Breeding 位运算
D. Magic Breeding link http://codeforces.com/contest/878/problem/D description Nikita and Sasha play ...
- Codeforces Round #443 (Div. 1) B. Teams Formation
B. Teams Formation link http://codeforces.com/contest/878/problem/B describe This time the Berland T ...
- Codeforces Round #443 (Div. 1) A. Short Program
A. Short Program link http://codeforces.com/contest/878/problem/A describe Petya learned a new progr ...
- Codeforces Round #443 (Div. 2) C. Short Program
C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Codeforces Round #443 (Div. 1) C. Tournament
题解: 思路挺简单 但这个set的应用好厉害啊.. 我们把它看成图,如果a存在一门比b大,那么a就可以打败b,a——>b连边 然后求强联通分量之后最后顶层的强联通分量就是能赢的 但是因为是要动态 ...
- Codeforces Round #443 (Div. 2)
C. Short Program Petya learned a new programming language CALPAS. A program in this language always ...
- Codeforces Round #443 (Div. 2) C 位运算
C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 【Codeforces Round #443 (Div. 2) A】Borya's Diagnosis
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟 [代码] #include <bits/stdc++.h> using namespace std; const ...
随机推荐
- Netty入门(二)之PC聊天室
参看Netty入门(一):Netty入门(一)之webSocket聊天室 Netty4.X下载地址:http://netty.io/downloads.html 一:服务端 1.SimpleChatS ...
- Python-sys模块-61
sys 模块:和Python解释器打交道的模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退 ...
- 小P的金字塔
题目描述 小P感到自己前几天太作了,于是非常有远见的决定为自己建立一座金字塔. 现在他有n种标准长方体的石头,每种石头只有两个,第i种石头是长宽高分别为Xi,Yi,Zi的长方体.由于整个工程只有小P一 ...
- 数学基础IV 欧拉函数 Miller Rabin Pollard's rho 欧拉定理 行列式
找了一些曾经没提到的算法.这应该是数学基础系最后一篇. 曾经的文章: 数学基础I 莫比乌斯反演I 莫比乌斯反演II 数学基础II 生成函数 数学基础III 博弈论 容斥原理(hidden) 线性基(h ...
- set和multiset的用法
set #include<iostream> #include<algorithm> #include<cstdio> #include<string.h&g ...
- Python学习第十五篇——类继承和类实例化
学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ...
- [options] 未与 -source 1.6 一起设置引导类路径
用ant与eclipse编译Cassandra 1.2.19,出现了“ [options] 未与 -source1.6一起设置引导类路径”的警告,并出现了一些编译错误,提示编译失败,上网找了很 多资料 ...
- 【问题解决方案】Git bash进入多层子目录问题(通配符问题留坑)
cd进入指定路径下:cd 斜杠 斜杠 方法一: 1- 撇丿,不是"那",盘符前面要加上 / (d盘前面也加,不加也行) 2- 路径名不区分大小写 3- 不用空格 4- 如果目录名中 ...
- 【kindle笔记】之 《恶意》-2018-4-20
[kindle笔记]读书记录-总 在答辩和考试和各种大作业的重压以及两天后全校停电的巨大挤压中,一口气读完了恶意这本书. 这本书是我读的东野圭吾的第二本书.第一本是心心念念的<解忧杂货店> ...
- CentOS搭建OpenVPN以及WIN&Android&iOS的安装连接
OpenVPNhttp://info.swufe.edu.cn/vpn/openvpn/#2 苹果.安卓智能手机openvpn的设置_百度经验https://jingyan.baidu.com/art ...