오늘 만든 이유 BIE 나에게 물었다 밖으로 연주와 어제 패닉저장 잊어 버렸 ... 쿵 오늘
은 성가신 인하 형식을 모르는 경우 폭격 ... Typora에서 폭격 공원의 블로그에 좋은
플립 게임
도시 된 바와 같이, 4 × 4 바둑판있다. 각 조각 주위 부재 자체와 사방은 (존재하는 경우), 즉 블랙에서 화이트에서 블랙 반전 흰색으로 반전되며, 한 장을 제공 할 수있다. 적어도 모든 조각이 같은 색이되었다 할 수있을 필요가 얼마나 많은 단계를 부탁드립니다.
emmm 어쨌든 그냥 잤를 작은 데이터와 같은 압력 DP를 썼다
갱스터 프로그램의 첫 번째 행은 다음과 같은 프로그램이 결정한 것입니다 확인했다
나는 압력을 좋아한다
#include
using namespace std;
#define ll long long
#define rg register
#define lson o<<1
#define rson o<<1|1
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)>(y)?(y):(x))
const int N=1000+5,M=200000+5,inf=0x3f3f3f3f,P=19650827;
int a[10][10],f[1<<20],st=0;
char aa[10][10];
template
void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int qsta(int i,int j,int sta){
sta^=(1<<((i<<2)+j))^(1<<(((i+1)<<2)+j))^(1<<((i<<2)+j+1));
if(i==3) sta^=(1<<(((i+1)<<2)+j));
if(i) sta^=(1<<(((i-1)<<2)+j));
if(j==3) sta^=(1<<((i<<2)+j+1));
if(j) sta^=(1<<((i<<2)+j-1));
return sta;
}
int main(){
//freopen("T1.txt","r",stdin);
//freopen("xor.out","w",stdout);
for(int i=0;i<4;++i) scanf("%s",aa[i]);
memset(f,inf,sizeof(f));
for(int i=0;i<4;++i)
for(int j=0;j<4;++j)
if(aa[i][j]=='b') st^=(1<<((i<<2)+j));
f[st]=0;
for(int i=0;i<4;++i)
for(int j=0;j<4;++j){
for(int sta=0;sta<1<<16;++sta)
if(f[sta]!=inf){
int to=qsta(i,j,sta);
f[to]=Min(f[to],f[sta]+1);
}
}
int ans=Min(f[0],f[(1<<16)-1]);
if(ans==inf) puts("Impossible");
else printf("%d",ans);
return 0;
}
dalao 년대
//ID: LRL52 Date: 2019.8.17
#define rep(i, a, b) for(int i = (a); i <= (b); ++i)
#include
using namespace std;
const int N = 155, M = 2055;
const int inf = 0x3f3f3f3f;
char s[N];
int a[N][N], b[N][N], ans = inf, nowans, cnt;
void flip(int i, int j){
++nowans;
b[i][j] ^= 1;
if(i > 0) b[i - 1][j] ^= 1;
if(j > 0) b[i][j - 1] ^= 1;
if(i < 3) b[i + 1][j] ^= 1;
if(j < 3) b[i][j + 1] ^= 1;
}
void Solve(int color){
for(int i = 0; i < (1 << 4); ++i){
memcpy(b, a, sizeof(a)); nowans = 0;
for(int j = 0; j < 4; ++j)
if((1 << j) & i) flip(0, 3 - j);
for(int j = 1; j < 4; ++j)
for(int k = 0; k < 4; ++k)
if(b[j - 1][k] != color) flip(j, k);
cnt = 0;
for(int j = 0; j < 4; ++j)
for(int k = 0; k < 4; ++k)
cnt += b[j][k] == color;
if(cnt == 16) ans = min(ans, nowans);
}
}
int main(){
//freopen("game.in", "r", stdin);
//freopen("game.out", "w", stdout);
rep(i, 0, 3){
scanf("%s", s);
rep(j, 0, 3)
a[i][j] = s[j] == 'w' ? 0 : 1;
}
Solve(0);
Solve(1);
if(ans != inf) printf("%d\n", ans);
else puts("Impossible");
return 0;
}
제도
섬이되면, 섬 직사각형, 정사각형 영역이 N * M으로 지정되어 있으며, 각 영역은 소정의 높이를 갖는다. 불행하게도, 해수면은 첫 해 내가 상승하기 시작, 해수면은 t은 [I]입니다. 영역의 높이가 해수면 동일 미만인 경우, 침수 된 것으로 간주된다. 그 통신 영역은 통신 블록에 침수되지. 지금 해 묻는 어떻게 통신 블록의 많은. 예를 들어 첫 해 바다 레벨 1, 두 개의 통신 블록이있다. 두 번째 해의 해수면은 2 세 통신 블록이있다.
나는 거꾸로 생각하고 (컬렉션을 확인합니까나는 LCH 사랑)하지만 ... 실제로 연결된 블록의 수를 처리하는 방법을 생각하지 않았다 다음은 폭력의 폭격라고
할 때마다 포인트가 추가 된 뒤로 마련하기를 다음 그것을 발견하고 통신 블록 전에 함께 상기 수의 감소
다음과 3시로부터 5시 죽은이를 엽니 다 내게 배열 시간 N의 크기를 말할 수 없다 전송 ...
30 희미한
#include
using namespace std;
#define ll long long
#define rg register
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)>(y)?(y):(x))
const int N=3000+5,M=1e5+5,inf=0x3f3f3f3f,P=19650827;
int n,m,t,tot,mx,mn=inf,h[N*N],a[M],ans[M];
int cnt=0,bl[N*N];
template
void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
void print(int x,int k){
if(x>tot) return;
if(x+m<=tot&&!bl[x+m]&&h[x+m]>a[k]) bl[x+m]=bl[x],print(x+m,k);
if(x>m&&!bl[x-m]&&h[x-m]>a[k]) bl[x-m]=bl[x],print(x-m,k);
if(x%m&&!bl[x+1]&&h[x+1]>a[k]) bl[x+1]=bl[x],print(x+1,k);
if(x>1&&!bl[x-1]&&h[x-1]>a[k]) bl[x-1]=bl[x],print(x-1,k);
}
int main(){
//freopen("T2.txt","r",stdin);
//freopen("xor.out","w",stdout);
rd(n),rd(m),tot=n*m;
for(int x=1;x<=tot;++x) rd(h[x]),mx=Max(mx,h[x]),mn=Min(mn,h[x]);
rd(t);
for(int i=t;i;--i) rd(a[i]);
for(int k=1;k<=t;++k){
if(a[k]>=mx) continue;
if(a[k]
100昏
#include
using namespace std;
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)>(y)?(y):(x))
const int N=3000+5,M=1e5+5,inf=0x3f3f3f3f,P=19650827;
int n,m,T,H,tot,ans,t[M],h[N*N],Ans[M];
template
void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
struct node{
int hei,id;
bool operator<(const node&A)const{return hei>A.hei;}
}a[N*N];
int f[N*N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void Union(int x,int y){
if(h[x]<=H) return;
if(find(x)!=find(y)) --ans,f[f[x]]=f[y];
}
void inser(int id){
if(id%m) Union(id+1,id);
if((id-1)%m) Union(id-1,id);
if(id>m) Union(id-m,id);
if(id+m<=tot) Union(id+m,id);
}
int main(){
// freopen("T2.txt","r",stdin);
//freopen("xor.out","w",stdout);
rd(n),rd(m),tot=n*m;
for(int i=1;i<=tot;++i) rd(h[i]),a[i].id=f[i]=i,a[i].hei=h[i];
sort(a+1,a+tot+1);
rd(T);
for(int i=T;i;--i) rd(t[i]);
int pos=1;
for(int i=1;i<=T;++i){
H=t[i];
while(pos<=tot&&a[pos].hei>H) ++ans,inser(a[pos++].id);
Ans[i]=ans;
}
for(int i=T;i;--i) printf("%d ",Ans[i]);
return 0;
}
吴神的择偶原则
给出N个数,求每一个数中与其它数相与的结果为0,如果有多个,选最大的,如果没有输出0
80昏
#include
using namespace std;
#define ll long long
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)>(y)?(y):(x))
const int N=1e6+5,M=200000+5,inf=0x3f3f3f3f,P=19650827;
int n,a[N],f[N];
template
void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int main(){
freopen("T3.txt","r",stdin);
freopen("xor.out","w",stdout);
rd(n);
for(int i=1;i<=n;++i) rd(a[i]);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j) if(!(a[i]&a[j])) f[i]=Max(f[i],a[j]),f[j]=Max(f[j],a[i]);
for(int i=1;i<=n;++i) printf("%d ",f[i]);
return 0;
}
正解
正难则反:一个数A,取反为B,对于C,如果A&C=0 , 则有C|B=B
dp[B] = max(dp[C]) C满足C|B=B
这几天疯狂把数组大小开小
#include<bits/stdc++.h>
using namespace std;
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)>(y)?(y):(x))
const int N=1e6+5,M=150000+5,inf=0x3f3f3f3f,P=19650827;
int n,mx,a[N],f[1<<21];
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int main(){
freopen("T3.txt","r",stdin);
// freopen("xor.out","w",stdout);
rd(n);
for(int i=1;i<=n;++i) rd(a[i]),f[a[i]]=a[i],mx=Max(mx,a[i]);
int cnt=0;
while((1<<cnt)<=mx) ++cnt;
for(int i=0;i<(1<<cnt);++i)
for(int j=0;j<cnt;++j)
if(!((1<<j)&i)) f[i|(1<<j)]=Max(f[i|(1<<j)],f[i]);
for(int i=1;i<=n;++i) printf("%d ",f[((1<<cnt)-1)^a[i]]);
return 0;
}
summary
- 这次真的很水
- 脑子容易短路