# Codeforces Global Round 13

## B Minimal Cost

### $Code$

#include <bits/stdc++.h>
#define LL long long
#define LD long double
using namespace std;
const LL P=998244353;
const int N=3e5+10;
const int INF=1e9;
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void print(LL x){
if(x>9) print(x/10);
putchar(x%10+'0');
}
void pls(LL &x,LL y){
x+=y;if(x>=P)x-=P;
}
int n;
int a[110];
void MAIN(){
int u,v;
for(int i=1;i<=n;++i){
}
int ans=min(u,v)+v;
for(int i=2;i<=n;++i){
if(abs(a[i]-a[i-1])>1) ans=min(ans,0);
}
for(int i=2;i<=n;++i){
if(abs(a[i]-a[i-1])==1) ans=min(ans,min(u,v));
}
printf("%d\n",ans);
return;
}

int main(){
while(ttt--) MAIN();
return 0;
}


## E Fib-tree

### $Code$

#include <bits/stdc++.h>
#define LL long long
#define LD long double
using namespace std;
const LL P=998244353;
const int N=3e5+10;
const int INF=1e9;
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void print(LL x){
if(x>9) print(x/10);
putchar(x%10+'0');
}
void pls(LL &x,LL y){
x+=y;if(x>=P)x-=P;
}
int n,cnt;
int fib[N],mp[N];
int hed[N];
int vis[N],used[N];
struct edge{
int r,nxt,id;
}e[N<<1];
void insert(int u,int v,int w){
e[++cnt].r=v;e[cnt].nxt=hed[u];hed[u]=cnt;e[cnt].id=w;
}
int fa[N],sz[N];
void dfs1(int x,int t){
vis[x]=t;sz[x]=1;
for(int i=hed[x];i;i=e[i].nxt){
if(used[e[i].id]) continue;
if(e[i].r==fa[x]) continue;
fa[e[i].r]=x;
dfs1(e[i].r,t);
sz[x]+=sz[e[i].r];
}
}
int X;
int tp;
int q[N];
void dfs2(int x){
for(int i=hed[x];i;i=e[i].nxt){
if(used[e[i].id]) continue;
if(e[i].r==fa[x]) continue;
dfs2(e[i].r);
if(mp[sz[e[i].r]]==X-1||mp[sz[e[i].r]]==X-2){
q[++tp]=e[i].id;
}
}
}
void MAIN(){
fib[1]=1;fib[2]=2;
mp[1]=1;mp[2]=2;
for(int i=3;;++i){
fib[i]=fib[i-1]+fib[i-2];
if(fib[i]>n) break;
mp[fib[i]]=i;
}
int u,v;
for(int i=1;i<n;++i){
insert(u,v,i);
insert(v,u,i);
}
int mx=n,t=0;
int flag=0;
while(mx>3){
++t;mx=0;
for(int i=1;i<=n;++i){
if(vis[i]!=t){
fa[i]=0;
dfs1(i,t);
mx=max(mx,sz[i]);
if(mp[sz[i]]==0){
flag=1;break;
}
if(sz[i]<=3) continue;
tp=0;X=mp[sz[i]];
dfs2(i);
if(!tp){
flag=1;break;
}
while(tp>0){
used[q[tp]]=1;
--tp;
}
}
}
if(flag==1) break;
}
if(flag) puts("NO");
else puts("YES");
return;
}

int main(){
int ttt=1;
while(ttt--) MAIN();
return 0;
}


## F Magnets

### 题意

n个磁铁，分为3类，S，N，-（没有磁性），现在要从中找到所有没有磁性的。可以进行$n+\lfloor log_2n \rfloor$次询问，有一个仪器，每次询问可以在仪器右边放若干个磁铁，左边放若干个磁铁，仪器可以测出两边磁铁产生的磁力（$S_lS_r+N_lN_r-S_lN_r-N_lS_r$），数据保证至少有1个没有磁性和2个有磁性的。仪器的测量上限是n，也就是说测出的值不能超过n，否则仪器会崩溃。$1\leq n \leq 2000$

### $Code$

#include <bits/stdc++.h>
#define LL long long
#define LD long double
using namespace std;
const LL P=998244353;
const int N=3e5+10;
const int INF=1e9;
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void print(LL x){
if(x>9) print(x/10);
putchar(x%10+'0');
}
void pls(LL &x,LL y){
x+=y;if(x>=P)x-=P;
}

int n,res,K,T,tp;
int q[N];
int b[N];
void MAIN(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
printf("? %d %d\n",1,n-i);
fflush(stdout);
printf("%d\n",i);
fflush(stdout);
for(int j=i+1;j<=n;++j){
printf("%d ",j);
}
printf("\n");
fflush(stdout);
scanf("%d",&res);
if(res!=0){
K=i;
b[K+1]=res;
break;
}
}
for(int i=K+2;i<=n;++i){
printf("? %d %d\n",1,n-i+1);
fflush(stdout);
printf("%d\n",K);
fflush(stdout);
for(int j=i;j<=n;++j){
printf("%d ",j);
}
printf("\n");
fflush(stdout);
scanf("%d",&res);
b[i]=res;
}

tp=0;b[n+1]=0;
for(int i=n;i>K;--i){
if(b[i]==b[i+1]) q[++tp]=i;
}
T=0;
if(K>1){
n=K-1;
int l=1,r=n,mid,fff=0;
while(l<r){
mid=(l+r)>>1;
printf("? %d %d\n",1,mid-l+1);
fflush(stdout);
printf("%d\n",K);
fflush(stdout);
for(int j=l;j<=mid;++j){
printf("%d ",j);
}
printf("\n");
fflush(stdout);
scanf("%d",&res);
if(res==0) l=mid+1;
else {
r=mid;
fff=1;
}
}
T=l;
if(fff==0){
printf("? %d %d\n",1,1);
fflush(stdout);
printf("%d\n",K);
fflush(stdout);
printf("%d\n",T);
fflush(stdout);
scanf("%d",&res);
fff=res;
}
if(fff==0) {
for(int j=1;j<=n;++j) q[++tp]=j;
}
else {
for(int j=1;j<=n;++j) if(j!=T) q[++tp]=j;
}
}
printf("! %d",tp);
for(int i=1;i<=tp;++i) printf(" %d",q[i]);
printf("\n");
fflush(stdout);
return;
}

int main(){
int ttt;scanf("%d",&ttt);
while(ttt--) MAIN();
return 0;
}


## G Switch and Flip

### 题解

(2,3,4,5,...,n,1)->(2,-1,4,5,...,n,-3)->(2,-1,3,5,...,n,-4)->...->(2,-1,3,4,...,n-1,-n)->(n,-1,3,4,...,n-1,-2)->(1,-n,3,4,...,n-1,-2)->(1,2,3,.....,n)

(a2,a3,a4,..,an,a1)(b2,b3,b4,..,bn,b1)->(-b2,a3,a4,..,an,a1)(-a2,b3,b4,..,bn,b1)->...->(-b1,a3,a4,..,an,a1)(-a2,b2,b3,..,bn)->..->(-b1,a2,a3,..,an)(-a1,b2,b3,..,bn)->(a1,a2,a3,..,an)(b1,b2,b3,..,bn)

### $Code$

#include <bits/stdc++.h>
#define LL long long
#define LD long double
using namespace std;
const LL P=998244353;
const int N=3e5+10;
const int INF=1e9;
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void print(LL x){
if(x>9) print(x/10);
putchar(x%10+'0');
}
void pls(LL &x,LL y){
x+=y;if(x>=P)x-=P;
}
int n,cnt;
int a[N];
int len[N];
bool vis[N];
vector<int> p[N];
int t;
int l[N],r[N];
void MAIN(){
for(int i=1;i<=n;++i) {
vis[i]=0;
}
//for(int i=1;i<=n;++i) cout<<a[i]<<" ";puts("");
for(int i=1;i<=n;++i){
if(!vis[i]){
++cnt;
p[cnt].clear();
len[cnt]=0;
for(int j=i;;j=a[j]){
if(!vis[j]){
vis[j]=1;
++len[cnt];
p[cnt].push_back(j);
}
else break;
}
}
}
t=0;
if(cnt==1){
for(int i=1;i<len[cnt]-1;++i){
++t;
l[t]=p[cnt][i];r[t]=p[cnt][len[cnt]-1];
}
++t;
l[t]=p[cnt][0];r[t]=p[cnt][len[cnt]-1];
++t;
l[t]=p[cnt][0];r[t]=p[cnt][1];
++t;
l[t]=p[cnt][1];r[t]=p[cnt][len[cnt]-1];
}
else{
while(cnt>=2){
++t;
l[t]=p[cnt][0];r[t]=p[cnt-1][0];
for(int i=1;i<len[cnt];++i){
++t;
l[t]=p[cnt][i];r[t]=p[cnt-1][0];
}
for(int i=1;i<len[cnt-1];++i){
++t;
l[t]=p[cnt-1][i];r[t]=p[cnt][0];
}
++t;
l[t]=p[cnt][0];r[t]=p[cnt-1][0];
cnt-=2;
}
if(cnt==1){
++cnt;
len[cnt]=1;
++t;
l[t]=p[cnt][0];r[t]=p[cnt-1][0];
for(int i=1;i<len[cnt];++i){
++t;
l[t]=p[cnt][i];r[t]=p[cnt-1][0];
}
for(int i=1;i<len[cnt-1];++i){
++t;
l[t]=p[cnt-1][i];r[t]=p[cnt][0];
}
++t;
l[t]=p[cnt][0];r[t]=p[cnt-1][0];
cnt-=2;
}
}
printf("%d\n",t);
for(int i=1;i<=t;++i){
printf("%d %d\n",l[i],r[i]);
}
return;
}

int main(){
int ttt=1;
while(ttt--) MAIN();
return 0;
}


## H Yuezheng Ling and Dynamic Tree

### $Code$

#include <bits/stdc++.h>
#define LL long long
#define LD long double
using namespace std;
const LL P=998244353;
const int N=3e5+10;
const int INF=1e9;
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void print(LL x){
if(x>9) print(x/10);
putchar(x%10+'0');
}
void pls(LL &x,LL y){
x+=y;if(x>=P)x-=P;
}
const int E=320;
int n,Q;
int a[N],g[N],tag[N],mx[N],b[N];
void init(int i){
int L=(i-1)*E+1,R=min(n,i*E);
mx[i]=0;
for(int j=L;j<=R;++j){
if(a[j]>mx[i]) mx[i]=a[j];
if(a[j]<L) b[j]=j;
else b[j]=b[a[j]];
}
}
void MAIN(){
int L,R;
a[1]=1;
for(int i=1;i<=n;++i) g[i]=(i+E-1)/E;
for(int i=1;i<=g[n];++i) {
tag[i]=0;
init(i);
}
int op,l,r,x;
while(Q--){
if(op==1){
if(g[l]==g[r]){
for(int i=l;i<=r;++i){
a[i]=max(a[i]-x,1);
}
if(mx[g[l]]>(g[l]-1)*E) init(g[l]);
}
else{
for(int i=l;i<=g[l]*E;++i){
a[i]=max(a[i]-x,1);
}
if(mx[g[l]]>(g[l]-1)*E) init(g[l]);

for(int i=(g[r]-1)*E+1;i<=r;++i){
a[i]=max(a[i]-x,1);
}
if(mx[g[r]]>(g[r]-1)*E) init(g[r]);

for(int i=g[l]+1;i<g[r];++i){
if(mx[i]<(i-1)*E) tag[i]+=x;
else{
for(int j=(i-1)*E+1;j<=i*E;++j){
a[j]=max(a[j]-x,1);
}
init(i);
}
}
}
}
else{
while(1){
if(l==r) break;
if(l>r) swap(l,r);
if(g[l]!=g[r]){
r=max(a[b[r]]-tag[g[r]],1);
continue;
}
if(b[l]!=b[r]){
l=max(a[b[l]]-tag[g[l]],1);
r=max(a[b[r]]-tag[g[r]],1);
continue;
}
r=max(a[r]-tag[g[r]],1);
}
printf("%d\n",l);
}
}
return;
}

int main(){
int ttt=1;
while(ttt--) MAIN();
return 0;
}


## I Ruler Of The Zoo

posted @ 2021-03-02 14:54  Iscream-2001  阅读(76)  评论(0编辑  收藏  举报
/* */