\(에이\)
그는 직접 전송을 원한다
typedef long long ll;
const int N=55;
ll f[N][2];int a[N],n,p;
int main(){
scanf("%d%d",&n,&p);
fp(i,1,n)scanf("%d",&a[i]),a[i]&=1;
f[0][0]=1;
fp(i,1,n){
f[i][0]=f[i-1][0],f[i][1]=f[i-1][1];
if(a[i]&1)f[i][0]+=f[i-1][1],f[i][1]+=f[i-1][0];
else f[i][0]+=f[i-1][0],f[i][1]+=f[i-1][1];
}
printf("%lld\n",f[n][p]);
return 0;
}
\(비\)
나는 해요 \ (ZZ \) ...
각 번호의 기여는, 우리는 다음 라인에 상하한의 기여도의 합을 계산하는 몇 가지 긍정적 인 기여를 열거하는 (+) 또는 (-) 인
typedef long long ll;
int n,a,b,c,d;ll l,r;
int main(){
scanf("%d%d%d%d%d",&n,&a,&b,&c,&d),b-=a;
fp(i,0,n-1){
l=1ll*i*c-1ll*(n-1-i)*d;
r=1ll*i*d-1ll*(n-1-i)*c;
if(b>=l&&b<=r)return puts("YES"),0;
}
puts("NO");
return 0;
}
\(씨\)
내 마음은 그것의 붙여 넣기로 가득 ......
다수 들어 \ (나는 \) 이 경우, \ (CNT [내가] \) 시간, 우리가 볼 수있다 (\ [I-CNT는 [내가 ] + 1, 난] \) 위치 섹션을 추가 그것은 수 변경할 필요하다 \ (0 \) , 다음 수정 사항 수있다 \ (O를 (1) \)
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=2e5+5;
int cnt[N],vis[N],a[N],n,m,res;
inline void ins(R int x){++cnt[x];if(x-cnt[x]+1>=1&&!vis[x-cnt[x]+1]++)--res;}
inline void del(R int x){if(x-cnt[x]+1>=1&&!--vis[x-cnt[x]+1])++res;--cnt[x];}
int main(){
scanf("%d%d",&n,&m),res=n;
fp(i,1,n)scanf("%d",&a[i]),ins(a[i]);
for(R int i=1,x,y;i<=m;++i){
scanf("%d%d",&x,&y);
del(a[x]),a[x]=y,ins(a[x]);
printf("%d\n",res);
}
return 0;
}
\(디\)
참조하는 데 오랜 시간이 같은 문제에 대한 해결책의 결과는 신들의 결론을 찾을 수 없습니다 ......
우리는 그들 각각의 서브 트리 고려 \ (SG의 \) 는 다음 잎의 경우, 값을 \ (SG (U) = 0 \) , 그렇지 않으면 각 아들이 하위 게임에 해당, 아들 노드 계산 \을 (V \) 의 \ (SG의 \) 값 후에, 그때 \ (V \) 서브 트리 플러스 \는 ((U는 V) \ ) 이 가장자리들 (\ SG의 \) 값이 \ (SG (V) +1 \ )
삭제 된 증명 한 경우 (\ (U는 V) \ ) 이 에지 후 \ (SG = 0 \) , 그렇지 삭제 가정이다 \ (V \) , 트리의 서브 트리 쪽 하여 얻어진 \ (V의 \) 원래의 서브 트리 \ (T \) 얻을 수 \ (T '\) , 우리는 유도를 사용하는 경우, (\ (T는 SG') \ ) 이상 걸릴 수있다 (\ [0 + 1,1 + 1,2 +. 1, ..., SG (T) +. 1 -1] \) 이므로 \ (SG (U) = SG (T) +1 \)
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=1e5+5;
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int sg[N],n;
void dfs(int u,int fa){
sg[u]=0;
go(u)if(v!=fa)dfs(v,u),sg[u]^=sg[v]+1;
}
int main(){
scanf("%d",&n);
for(R int i=1,u,v;i<n;++i)scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(1,0);
puts(sg[1]?"Alice":"Bob");
return 0;
}
\(이자형\)
각각의 포인트를 들어 \ (I는 \) 의 경우 \는 (C_I = 0 \) 다음하자 \ (L = A_I \) 그렇지 배치 \ (L = -c_i \) 의 경우 \는 (d_i = 0 \) 다음하자 (\ R = -b_i는 \) 그렇지 렛츠 \ (R = D_i \) , 발명자 그 경우 \는 ((리튬, ri) \를 ) 에 접속 될 수있다 (\ (L, R) \ ) 오른쪽의 경우에만, \ (리 = 연구 \)
그래서 우리는 ((L, R) \ \ ) 는 AS (\ L의 \) 에 접속된다 \ (R & 중위 \) 한 에지, 다음이 이제 각 경로의 시작 부분에 양수가되도록, 경로들로 분해해야 상기 단부는 제외이다. 그러면 명확도 동일한보다 큰 양수가 아닌도 이하, 및 적어도 하나의 포인트 중 네거티브 정도는 각각의 통신 블록의 분해하지 않아도,도 (다르게 것은 고리 동일하지 않으며 ) 경로들로
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=405;
int fa[N],vis[N],in[N],out[N],n,h;
inline int find(R int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
scanf("%d%d",&n,&h);
fp(i,0,h<<1)fa[i]=i;
for(R int i=1,a,b,c,d,l,r;i<=n;++i){
scanf("%d%d%d%d",&a,&b,&c,&d);
l=(c?-c:a)+h,r=(d?d:-b)+h,fa[find(l)]=find(r);
++out[l],++in[r];
}
fp(i,-h,-1)if(out[i+h]>in[i+h])return puts("NO"),0;
fp(i,1,h)if(in[i+h]>out[i+h])return puts("NO"),0;
fp(i,0,h<<1)if(in[i]!=out[i])vis[find(i)]=1;
fp(i,0,h<<1)if(in[i]&&out[i]&&!vis[find(i)])return puts("NO"),0;
puts("YES");
return 0;
}
\(에프\)
우선, 경로가 심한 쓸 수 있도록, 이진수로 압축 될 수있다 (\을 O (2 ^ {2N }) \) \ 께 (DP \)
만 접두사 전에 언제든지 경우 경로 접두어 덜하고, 우리는 합법적 인 경로를 발견하는 방법을 최적화 고려
지금 세트 고려 \ (I는 \) 로, 다음 전방 힘 \ (j-1 \) 하나의 동일한 단계의 계정 \ (J \) 단계
멀리 이전 단계 경우 동일한 직접 무시가, 또는 경우 \ (1 \)는 지금까지 갈 \ (0 \) 분명히 \ (GG \) , 만 멀리 이전 단계를 고려할 필요가있다 (1 \) \ 지금까지 갈 \ (0 \)
우리는 찾을 \ (I-1 \) 다음에 \ (1 \) 위치를하고 해당 넣어 \ (1 \) 제한은 여전히 합법적 그래서, 앞으로 이동하는 위치를
다음이 있다면 \ (1 \) 다음 현재 도로 분명히 쉽게 갈 수 있습니다
적은 직접 \ (DP \) 거기에
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=(1<<20)+5;
int f[25][N],g[N],is[25][25],nxt[N][25],n,m,k,res,lim;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d%d",&n,&m,&k),--n,lim=(1<<n);
memset(is,-1,sizeof(is));
for(R int i=1,a,b,c;i<=k;++i)scanf("%d%d%d",&a,&b,&c),is[a][b-1]=c;
fp(s,0,lim-1){
R int p=-1;
fd(i,n-1,0){
if(s>>i&1)p=i;
nxt[s][i]=p;
}
}
f[n][0]=1;
fp(i,1,m){
fp(j,0,lim-1)g[j]=f[n][j];
memset(f,0,sizeof(f));
fp(j,0,lim-1)f[0][j]=g[j];
fp(j,0,n-1)fp(k,0,lim-1)if(f[j][k])
fp(l,0,1){
if(is[i][j]!=-1&&l!=is[i][j])continue;
R int t=k>>j&1;
if(l==0&&t==1)continue;
if(l==t)upd(f[j+1][k],f[j][k]);
else{
R int p=nxt[k][j];
if(p==-1)upd(f[j+1][k|(1<<j)],f[j][k]);
else upd(f[j+1][k^(1<<j)^(1<<p)],f[j][k]);
}
}
}
fp(i,0,lim-1)upd(res,f[n][i]);
printf("%d\n",res);
return 0;
}