【2019년 8월 17일】

오늘 만든 이유 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

  • 这次真的很水
  • 脑子容易短路

추천

출처www.cnblogs.com/lxyyyy/p/11373712.html