正文
codeforces刷题记录
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)
C. Magic Grid
-
这种题直接构造
-
数n是2的n次方的倍数的时候可以这样划分数
-
比如n是4的倍数 n=k*4
-
000 001 010 011
-
100 101 110 111
-
(k-1)00 (k-1)01 (k-1)10 (k-1)11
-
然后填格子
Codeforces Round #581 (Div. 2)
D2. Kirk and a Binary String (hard version)
-
题意:给一个只含01的串,然后构造另外一个串,满足任意给定l~r,新串与原串不最长下降子序列长度相同
-
000001111111这种的你把前面的1变成0是不会有影响的
-
111100000这种的完全不能变
-
所以考虑得到这个不下降子序列的方法:让1和后面所有的0打包,剩下的全要,打包的那部分要一半
-
显然剩下的那部分里把1全变成0是没有影响的
Codeforces Global Round 4
D. Prime Graph
-
题意给一个n,构造这样一个简单图:总边数是质数然后每个边的度是质数
-
光是给出每个边的度是不能构造出一张图来的
-
(n-1) + n/4*2 = x 在 n-1 和 (n-1) + n/4*2之间是一定有一个质数的
-
所以光是用度数为2,3就可以完事了~
-
所以遇到这种题目直接玄学构造就好了啊(疯狂打表)
Codeforces Global Round 2
C. Ramesses and Corner Inversion
-
题意:给两个矩阵,问可不可以用上面描述的操作把上面的变成下面的
-
所以这种题就想办法用机智的姿势把上面的变成下面的就好了啊为什么我还是每次都不会quq
-
看题解就完事了
-
真的要学会观察,用简单有规律的去表示复杂的
Codeforces Round #588 (Div. 2)
D.D. Marcin and Training Camp
-
死于认为7000过不了O(n^2)
-
害,还是太菜了
-
#include <bits/stdc++.h>
#define nmax 7010
using namespace std;
typedef long long ll;
ll a[nmax],b[nmax],c[nmax];
ll ans=;
int n,idx=;
map <ll,int> m;
int main(){
cin>>n;
for (int i=; i<n; i++) {
scanf("%I64d",&a[i]);
m[ a[i] ]++;
if(m[ a[i] ]==) c[idx++]=a[i];
}
for (int i=; i<n; i++) scanf("%I64d",&b[i]);
for (int i=; i<n; i++) {
if(m[a[i]]>) ans+=b[i];
else{
for (int j=; j<idx; j++) {
bool flag=true;
for (ll k=; k<=; k++) {
//printf("%lld%lld quq\n",c[j]&(1LL<<k) ,a[i]&(1LL<<k) );
if( (a[i]&(1LL<<k)) && !(c[j]&(1LL<<k)) ){、、这里调试了好久,!=0就过不了,改成非就过了,神奇
flag=false;
break;
}
}
if(flag) { ans+=b[i]; break; }
}
}
}
cout<<ans<<endl;
return ;
}
 ̄□ ̄||
C. Anadi and Domino
-
暴力题,,,看一眼题解就ok了,枚举全排列
-
这场怎么感觉全是暴力题。。。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int g[][]={};
int n,m,a,b,ans=;
int ma[],mb[];
void mj(int cnt,int* x){
if(cnt==n
) {
int d[][];
memset(d,,sizeof(d));
for (int i=; i<m; i++){
d[ x[ma[i]] ][ x[mb[i]] ]++;
if(x[ma[i]]!=x[mb[i]]) d[ x[mb[i]] ][ x[ma[i]] ]++;
}
int ta=;
for (int i=; i<=; i++) for (int j=i; j<=; j++) if(d[i][j]) ta++;
ans=max(ans,ta);
return;
}
int tx[n+];
for (int i=; i<=cnt; i++) tx[i]=x[i];
for (int i=; i<=; i++) {
tx[cnt+]=i;
mj(cnt+,tx);
}
}
int main(){
cin>>n>>m;
if(m==) { cout<<<<endl; return ; }
for (int i=; i<m; i++) {
scanf("%d%d",&ma[i],&mb[i]);
g[a][b]=g[b][a]=;
}
int x[n+];
mj(,x);
cout<<ans<<endl;
return ;
}
o(╥﹏╥)o
- 这种题直接构造
- 数n是2的n次方的倍数的时候可以这样划分数
- 比如n是4的倍数 n=k*4
- 000 001 010 011
- 100 101 110 111
- (k-1)00 (k-1)01 (k-1)10 (k-1)11
- 然后填格子
Codeforces Round #581 (Div. 2)
D2. Kirk and a Binary String (hard version)
-
题意:给一个只含01的串,然后构造另外一个串,满足任意给定l~r,新串与原串不最长下降子序列长度相同
-
000001111111这种的你把前面的1变成0是不会有影响的
-
111100000这种的完全不能变
-
所以考虑得到这个不下降子序列的方法:让1和后面所有的0打包,剩下的全要,打包的那部分要一半
-
显然剩下的那部分里把1全变成0是没有影响的
Codeforces Global Round 4
D. Prime Graph
-
题意给一个n,构造这样一个简单图:总边数是质数然后每个边的度是质数
-
光是给出每个边的度是不能构造出一张图来的
-
(n-1) + n/4*2 = x 在 n-1 和 (n-1) + n/4*2之间是一定有一个质数的
-
所以光是用度数为2,3就可以完事了~
-
所以遇到这种题目直接玄学构造就好了啊(疯狂打表)
Codeforces Global Round 2
C. Ramesses and Corner Inversion
-
题意:给两个矩阵,问可不可以用上面描述的操作把上面的变成下面的
-
所以这种题就想办法用机智的姿势把上面的变成下面的就好了啊为什么我还是每次都不会quq
-
看题解就完事了
-
真的要学会观察,用简单有规律的去表示复杂的
Codeforces Round #588 (Div. 2)
D.D. Marcin and Training Camp
-
死于认为7000过不了O(n^2)
-
害,还是太菜了
-
#include <bits/stdc++.h>
#define nmax 7010
using namespace std;
typedef long long ll;
ll a[nmax],b[nmax],c[nmax];
ll ans=;
int n,idx=;
map <ll,int> m;
int main(){
cin>>n;
for (int i=; i<n; i++) {
scanf("%I64d",&a[i]);
m[ a[i] ]++;
if(m[ a[i] ]==) c[idx++]=a[i];
}
for (int i=; i<n; i++) scanf("%I64d",&b[i]);
for (int i=; i<n; i++) {
if(m[a[i]]>) ans+=b[i];
else{
for (int j=; j<idx; j++) {
bool flag=true;
for (ll k=; k<=; k++) {
//printf("%lld%lld quq\n",c[j]&(1LL<<k) ,a[i]&(1LL<<k) );
if( (a[i]&(1LL<<k)) && !(c[j]&(1LL<<k)) ){、、这里调试了好久,!=0就过不了,改成非就过了,神奇
flag=false;
break;
}
}
if(flag) { ans+=b[i]; break; }
}
}
}
cout<<ans<<endl;
return ;
}
 ̄□ ̄||
C. Anadi and Domino
-
暴力题,,,看一眼题解就ok了,枚举全排列
-
这场怎么感觉全是暴力题。。。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int g[][]={};
int n,m,a,b,ans=;
int ma[],mb[];
void mj(int cnt,int* x){
if(cnt==n
) {
int d[][];
memset(d,,sizeof(d));
for (int i=; i<m; i++){
d[ x[ma[i]] ][ x[mb[i]] ]++;
if(x[ma[i]]!=x[mb[i]]) d[ x[mb[i]] ][ x[ma[i]] ]++;
}
int ta=;
for (int i=; i<=; i++) for (int j=i; j<=; j++) if(d[i][j]) ta++;
ans=max(ans,ta);
return;
}
int tx[n+];
for (int i=; i<=cnt; i++) tx[i]=x[i];
for (int i=; i<=; i++) {
tx[cnt+]=i;
mj(cnt+,tx);
}
}
int main(){
cin>>n>>m;
if(m==) { cout<<<<endl; return ; }
for (int i=; i<m; i++) {
scanf("%d%d",&ma[i],&mb[i]);
g[a][b]=g[b][a]=;
}
int x[n+];
mj(,x);
cout<<ans<<endl;
return ;
}
o(╥﹏╥)o
- 题意:给一个只含01的串,然后构造另外一个串,满足任意给定l~r,新串与原串不最长下降子序列长度相同
- 000001111111这种的你把前面的1变成0是不会有影响的
- 111100000这种的完全不能变
- 所以考虑得到这个不下降子序列的方法:让1和后面所有的0打包,剩下的全要,打包的那部分要一半
- 显然剩下的那部分里把1全变成0是没有影响的
Codeforces Global Round 4
D. Prime Graph
-
题意给一个n,构造这样一个简单图:总边数是质数然后每个边的度是质数
-
光是给出每个边的度是不能构造出一张图来的
-
(n-1) + n/4*2 = x 在 n-1 和 (n-1) + n/4*2之间是一定有一个质数的
-
所以光是用度数为2,3就可以完事了~
-
所以遇到这种题目直接玄学构造就好了啊(疯狂打表)
Codeforces Global Round 2
C. Ramesses and Corner Inversion
-
题意:给两个矩阵,问可不可以用上面描述的操作把上面的变成下面的
-
所以这种题就想办法用机智的姿势把上面的变成下面的就好了啊为什么我还是每次都不会quq
-
看题解就完事了
-
真的要学会观察,用简单有规律的去表示复杂的
Codeforces Round #588 (Div. 2)
D.D. Marcin and Training Camp
-
死于认为7000过不了O(n^2)
-
害,还是太菜了
-
#include <bits/stdc++.h>
#define nmax 7010
using namespace std;
typedef long long ll;
ll a[nmax],b[nmax],c[nmax];
ll ans=;
int n,idx=;
map <ll,int> m;
int main(){
cin>>n;
for (int i=; i<n; i++) {
scanf("%I64d",&a[i]);
m[ a[i] ]++;
if(m[ a[i] ]==) c[idx++]=a[i];
}
for (int i=; i<n; i++) scanf("%I64d",&b[i]);
for (int i=; i<n; i++) {
if(m[a[i]]>) ans+=b[i];
else{
for (int j=; j<idx; j++) {
bool flag=true;
for (ll k=; k<=; k++) {
//printf("%lld%lld quq\n",c[j]&(1LL<<k) ,a[i]&(1LL<<k) );
if( (a[i]&(1LL<<k)) && !(c[j]&(1LL<<k)) ){、、这里调试了好久,!=0就过不了,改成非就过了,神奇
flag=false;
break;
}
}
if(flag) { ans+=b[i]; break; }
}
}
}
cout<<ans<<endl;
return ;
}
 ̄□ ̄||
C. Anadi and Domino
-
暴力题,,,看一眼题解就ok了,枚举全排列
-
这场怎么感觉全是暴力题。。。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int g[][]={};
int n,m,a,b,ans=;
int ma[],mb[];
void mj(int cnt,int* x){
if(cnt==n
) {
int d[][];
memset(d,,sizeof(d));
for (int i=; i<m; i++){
d[ x[ma[i]] ][ x[mb[i]] ]++;
if(x[ma[i]]!=x[mb[i]]) d[ x[mb[i]] ][ x[ma[i]] ]++;
}
int ta=;
for (int i=; i<=; i++) for (int j=i; j<=; j++) if(d[i][j]) ta++;
ans=max(ans,ta);
return;
}
int tx[n+];
for (int i=; i<=cnt; i++) tx[i]=x[i];
for (int i=; i<=; i++) {
tx[cnt+]=i;
mj(cnt+,tx);
}
}
int main(){
cin>>n>>m;
if(m==) { cout<<<<endl; return ; }
for (int i=; i<m; i++) {
scanf("%d%d",&ma[i],&mb[i]);
g[a][b]=g[b][a]=;
}
int x[n+];
mj(,x);
cout<<ans<<endl;
return ;
}
o(╥﹏╥)o
- 题意给一个n,构造这样一个简单图:总边数是质数然后每个边的度是质数
- 光是给出每个边的度是不能构造出一张图来的
- (n-1) + n/4*2 = x 在 n-1 和 (n-1) + n/4*2之间是一定有一个质数的
- 所以光是用度数为2,3就可以完事了~
- 所以遇到这种题目直接玄学构造就好了啊(疯狂打表)
Codeforces Global Round 2
C. Ramesses and Corner Inversion
-
题意:给两个矩阵,问可不可以用上面描述的操作把上面的变成下面的
-
所以这种题就想办法用机智的姿势把上面的变成下面的就好了啊为什么我还是每次都不会quq
-
看题解就完事了
-
真的要学会观察,用简单有规律的去表示复杂的
Codeforces Round #588 (Div. 2)
D.D. Marcin and Training Camp
-
死于认为7000过不了O(n^2)
-
害,还是太菜了
-
#include <bits/stdc++.h>
#define nmax 7010
using namespace std;
typedef long long ll;
ll a[nmax],b[nmax],c[nmax];
ll ans=;
int n,idx=;
map <ll,int> m;
int main(){
cin>>n;
for (int i=; i<n; i++) {
scanf("%I64d",&a[i]);
m[ a[i] ]++;
if(m[ a[i] ]==) c[idx++]=a[i];
}
for (int i=; i<n; i++) scanf("%I64d",&b[i]);
for (int i=; i<n; i++) {
if(m[a[i]]>) ans+=b[i];
else{
for (int j=; j<idx; j++) {
bool flag=true;
for (ll k=; k<=; k++) {
//printf("%lld%lld quq\n",c[j]&(1LL<<k) ,a[i]&(1LL<<k) );
if( (a[i]&(1LL<<k)) && !(c[j]&(1LL<<k)) ){、、这里调试了好久,!=0就过不了,改成非就过了,神奇
flag=false;
break;
}
}
if(flag) { ans+=b[i]; break; }
}
}
}
cout<<ans<<endl;
return ;
}
 ̄□ ̄||
C. Anadi and Domino
-
暴力题,,,看一眼题解就ok了,枚举全排列
-
这场怎么感觉全是暴力题。。。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int g[][]={};
int n,m,a,b,ans=;
int ma[],mb[];
void mj(int cnt,int* x){
if(cnt==n
) {
int d[][];
memset(d,,sizeof(d));
for (int i=; i<m; i++){
d[ x[ma[i]] ][ x[mb[i]] ]++;
if(x[ma[i]]!=x[mb[i]]) d[ x[mb[i]] ][ x[ma[i]] ]++;
}
int ta=;
for (int i=; i<=; i++) for (int j=i; j<=; j++) if(d[i][j]) ta++;
ans=max(ans,ta);
return;
}
int tx[n+];
for (int i=; i<=cnt; i++) tx[i]=x[i];
for (int i=; i<=; i++) {
tx[cnt+]=i;
mj(cnt+,tx);
}
}
int main(){
cin>>n>>m;
if(m==) { cout<<<<endl; return ; }
for (int i=; i<m; i++) {
scanf("%d%d",&ma[i],&mb[i]);
g[a][b]=g[b][a]=;
}
int x[n+];
mj(,x);
cout<<ans<<endl;
return ;
}
o(╥﹏╥)o
- 题意:给两个矩阵,问可不可以用上面描述的操作把上面的变成下面的
- 所以这种题就想办法用机智的姿势把上面的变成下面的就好了啊为什么我还是每次都不会quq
- 看题解就完事了
- 真的要学会观察,用简单有规律的去表示复杂的
Codeforces Round #588 (Div. 2)
D.D. Marcin and Training Camp
-
死于认为7000过不了O(n^2)
-
害,还是太菜了
-
#include <bits/stdc++.h>
#define nmax 7010
using namespace std;
typedef long long ll;
ll a[nmax],b[nmax],c[nmax];
ll ans=;
int n,idx=;
map <ll,int> m;
int main(){
cin>>n;
for (int i=; i<n; i++) {
scanf("%I64d",&a[i]);
m[ a[i] ]++;
if(m[ a[i] ]==) c[idx++]=a[i];
}
for (int i=; i<n; i++) scanf("%I64d",&b[i]);
for (int i=; i<n; i++) {
if(m[a[i]]>) ans+=b[i];
else{
for (int j=; j<idx; j++) {
bool flag=true;
for (ll k=; k<=; k++) {
//printf("%lld%lld quq\n",c[j]&(1LL<<k) ,a[i]&(1LL<<k) );
if( (a[i]&(1LL<<k)) && !(c[j]&(1LL<<k)) ){、、这里调试了好久,!=0就过不了,改成非就过了,神奇
flag=false;
break;
}
}
if(flag) { ans+=b[i]; break; }
}
}
}
cout<<ans<<endl;
return ;
}
 ̄□ ̄||
C. Anadi and Domino
-
暴力题,,,看一眼题解就ok了,枚举全排列
-
这场怎么感觉全是暴力题。。。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int g[][]={};
int n,m,a,b,ans=;
int ma[],mb[];
void mj(int cnt,int* x){
if(cnt==n
) {
int d[][];
memset(d,,sizeof(d));
for (int i=; i<m; i++){
d[ x[ma[i]] ][ x[mb[i]] ]++;
if(x[ma[i]]!=x[mb[i]]) d[ x[mb[i]] ][ x[ma[i]] ]++;
}
int ta=;
for (int i=; i<=; i++) for (int j=i; j<=; j++) if(d[i][j]) ta++;
ans=max(ans,ta);
return;
}
int tx[n+];
for (int i=; i<=cnt; i++) tx[i]=x[i];
for (int i=; i<=; i++) {
tx[cnt+]=i;
mj(cnt+,tx);
}
}
int main(){
cin>>n>>m;
if(m==) { cout<<<<endl; return ; }
for (int i=; i<m; i++) {
scanf("%d%d",&ma[i],&mb[i]);
g[a][b]=g[b][a]=;
}
int x[n+];
mj(,x);
cout<<ans<<endl;
return ;
}
o(╥﹏╥)o
- 死于认为7000过不了O(n^2)
- 害,还是太菜了
-
#include <bits/stdc++.h>
#define nmax 7010 using namespace std;
typedef long long ll;
ll a[nmax],b[nmax],c[nmax];
ll ans=;
int n,idx=;
map <ll,int> m; int main(){
cin>>n;
for (int i=; i<n; i++) {
scanf("%I64d",&a[i]);
m[ a[i] ]++;
if(m[ a[i] ]==) c[idx++]=a[i];
}
for (int i=; i<n; i++) scanf("%I64d",&b[i]);
for (int i=; i<n; i++) {
if(m[a[i]]>) ans+=b[i];
else{
for (int j=; j<idx; j++) {
bool flag=true;
for (ll k=; k<=; k++) {
//printf("%lld%lld quq\n",c[j]&(1LL<<k) ,a[i]&(1LL<<k) );
if( (a[i]&(1LL<<k)) && !(c[j]&(1LL<<k)) ){、、这里调试了好久,!=0就过不了,改成非就过了,神奇
flag=false;
break;
}
}
if(flag) { ans+=b[i]; break; } }
}
}
cout<<ans<<endl;
return ;
} ̄□ ̄||
C. Anadi and Domino
-
暴力题,,,看一眼题解就ok了,枚举全排列
-
这场怎么感觉全是暴力题。。。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int g[][]={};
int n,m,a,b,ans=;
int ma[],mb[];
void mj(int cnt,int* x){
if(cnt==n
) {
int d[][];
memset(d,,sizeof(d));
for (int i=; i<m; i++){
d[ x[ma[i]] ][ x[mb[i]] ]++;
if(x[ma[i]]!=x[mb[i]]) d[ x[mb[i]] ][ x[ma[i]] ]++;
}
int ta=;
for (int i=; i<=; i++) for (int j=i; j<=; j++) if(d[i][j]) ta++;
ans=max(ans,ta);
return;
}
int tx[n+];
for (int i=; i<=cnt; i++) tx[i]=x[i];
for (int i=; i<=; i++) {
tx[cnt+]=i;
mj(cnt+,tx);
}
}
int main(){
cin>>n>>m;
if(m==) { cout<<<<endl; return ; }
for (int i=; i<m; i++) {
scanf("%d%d",&ma[i],&mb[i]);
g[a][b]=g[b][a]=;
}
int x[n+];
mj(,x);
cout<<ans<<endl;
return ;
}
o(╥﹏╥)o
#include <bits/stdc++.h> using namespace std;
int g[][]={};
int n,m,a,b,ans=;
int ma[],mb[]; void mj(int cnt,int* x){
if(cnt==n
) {
int d[][];
memset(d,,sizeof(d));
for (int i=; i<m; i++){
d[ x[ma[i]] ][ x[mb[i]] ]++;
if(x[ma[i]]!=x[mb[i]]) d[ x[mb[i]] ][ x[ma[i]] ]++;
}
int ta=;
for (int i=; i<=; i++) for (int j=i; j<=; j++) if(d[i][j]) ta++;
ans=max(ans,ta);
return;
}
int tx[n+];
for (int i=; i<=cnt; i++) tx[i]=x[i];
for (int i=; i<=; i++) {
tx[cnt+]=i;
mj(cnt+,tx);
}
} int main(){
cin>>n>>m;
if(m==) { cout<<<<endl; return ; }
for (int i=; i<m; i++) {
scanf("%d%d",&ma[i],&mb[i]);
g[a][b]=g[b][a]=;
}
int x[n+];
mj(,x);
cout<<ans<<endl;
return ;
}
o(╥﹏╥)o