A - Sasha and a Bit of Relax
code:
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
#define N 300006
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int a[N],n;
map<int,int>mp[2];
int main()
{
// setIO("input");
int i,j;
scanf("%d",&n);
ll ans=0ll;
mp[0][0]++;
for(i=1;i<=n;++i)
{
scanf("%d",&a[i]),a[i]^=a[i-1];
ans+=(ll)mp[i&1][a[i]];
mp[i&1][a[i]]++;
}
printf("%lld
",ans);
return 0;
}
B - Sasha and One More Name
code:
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
#define N 300006
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
char S[N],A[N];
int n;
int check()
{
int i,j,flag=0,mid=n/2;
for(i=2;i<=mid;++i) if(S[i]!=S[i-1]) { flag=1; break; }
return flag;
}
int check_1()
{
int i,j;
for(i=2;i<n;++i)
{
int tmp=0;
for(j=i;j<=n;++j) A[++tmp]=S[j];
for(j=1;j<i;++j) A[++tmp]=S[j];
int flag=0;
int mid=n/2;
for(j=1;j<=mid;++j) if(A[j]!=A[n-j+1]) flag=1;
if(!flag)
{
int flag2=0;
for(j=1;j<=n;++j) if(A[j]!=S[j]) flag2=1;
if(flag2) return 1;
}
}
return 0;
}
int main()
{
// setIO("input");
int i,j;
scanf("%s",S+1),n=strlen(S+1);
if(!check()) printf("Impossible
");
else if(check_1()) printf("1
");
else printf("2
");
return 0;
}
D - Sasha and Interesting Fact from Graph Theory
code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 2000001
#define ll long long
#define mod 1000000007
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int fac[N],inv[N];
int qpow(int x,int y)
{
if(y<0) return qpow(x,y+mod-1);
int tmp=1;
for(;y>0;y>>=1,x=(ll)x*x%mod)
if(y&1) tmp=(ll)tmp*x%mod;
return tmp;
}
int C(int x,int y)
{
if(x<0||y<0||x<y) return 0;
return (ll)fac[x]*inv[y]%mod*inv[x-y]%mod;
}
int main()
{
// setIO("input");
int i,j,n,m,a,b,ans=0;
fac[0]=inv[0]=1;
for(i=1;i<N;++i) fac[i]=(ll)fac[i-1]*i%mod,inv[i]=qpow(fac[i],mod-2);
scanf("%d%d%d%d",&n,&m,&a,&b);
for(i=0;i<=n-2;++i)
{
(ans+=(ll)C(m-1,i)*C(n-2,i)%mod*(i+2)%mod*qpow(n,n-i-3)%mod*qpow(m,n-2-i)%mod*fac[i]%mod)%=mod;
}
printf("%d
",ans);
return 0;
}
CF1109F Sasha and Algorithm of Silence's Sounds
code:
#include <cstdio>
#include <map>
#include <vector>
#include <cmath>
#include <cstring>
#include <algorithm>
#define M 2006
#define N 200009
#define inf 1000000
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,m,total;
namespace LCT
{
#define lson s[x].ch[0]
#define rson s[x].ch[1]
int sta[N];
struct data
{
int ch[2],rev,f;
}s[N];
int get(int x) { return s[s[x].f].ch[1]==x; }
int isrt(int x) { return !(s[s[x].f].ch[0]==x||s[s[x].f].ch[1]==x); }
void rotate(int x)
{
int old=s[x].f,fold=s[old].f,which=get(x);
if(!isrt(old)) s[fold].ch[s[fold].ch[1]==old]=x;
s[old].ch[which]=s[x].ch[which^1],s[s[old].ch[which]].f=old;
s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold;
}
void mark(int x)
{
swap(lson,rson),s[x].rev^=1;
}
void pushdown(int x)
{
if(s[x].rev)
{
if(lson) mark(lson);
if(rson) mark(rson);
s[x].rev=0;
}
}
void splay(int x)
{
int u=x,v=0,fa;
for(sta[++v]=u;!isrt(u);u=s[u].f) sta[++v]=s[u].f;
for(;v;--v) pushdown(sta[v]);
for(u=s[u].f;(fa=s[x].f)!=u;rotate(x))
if(s[fa].f!=u)
rotate(get(fa)==get(x)?fa:x);
}
void Access(int x)
{
for(int y=0;x;y=x,x=s[x].f)
{
splay(x);
rson=y;
}
}
void makert(int x)
{
Access(x),splay(x),mark(x);
}
int findrt(int x)
{
Access(x),splay(x);
while(s[x].ch[0]) pushdown(x),x=s[x].ch[0];
return x;
}
void link(int x,int y)
{
makert(x),makert(y),s[y].f=x;
}
void cut(int x,int y)
{
makert(x),Access(y),splay(y);
s[y].ch[0]=s[x].f=0;
}
#undef lson
#undef rson
};
namespace seg
{
#define lson now<<1
#define rson now<<1|1
struct node
{
int mn,num_mn,sum;
node() { mn=num_mn=sum=0; }
node operator+(const node &b) const
{
node c;
c.sum=sum+b.sum;
c.mn=min(b.sum+mn,b.mn);
if(b.sum+mn==c.mn) c.num_mn+=num_mn;
if(b.mn==c.mn) c.num_mn+=b.num_mn;
return c;
}
}s[N<<2];
void build(int l,int r,int now)
{
s[now].mn=inf;
if(l==r)
{
s[now].mn=s[now].num_mn=s[now].sum=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson),build(mid+1,r,rson);
s[now]=s[lson]+s[rson];
}
void update(int l,int r,int now,int p,int v)
{
if(l==r)
{
s[now].sum+=v;
s[now].mn+=v;
s[now].num_mn=1;
return;
}
int mid=(l+r)>>1;
if(p<=mid) update(l,mid,lson,p,v);
else update(mid+1,r,rson,p,v);
s[now]=s[lson]+s[rson];
}
node query(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return s[now];
int mid=(l+r)>>1;
if(L<=mid&&R>mid) return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);
else if(L<=mid) return query(l,mid,lson,L,R);
else return query(mid+1,r,rson,L,R);
}
#undef lson
#undef rson
};
int l,r;
struct Pos
{
int x,y;
Pos(int x=0,int y=0):x(x),y(y){}
}pos[M*M];
int G[M][M];
int go(int x,int y)
{
if(y>=l&&y<=r)
{
if(LCT::findrt(x)==LCT::findrt(y)) return 1;
else { LCT::link(x,y); return 0; }
}
else return 0;
}
void recover(int x,int y)
{
if(y>=l&&y<=r)
{
if(LCT::findrt(x)==LCT::findrt(y)) LCT::cut(x,y);
}
}
int check(int x)
{
int flag=1;
int xx=pos[x].x,yy=pos[x].y;
if(xx-1>=1&&go(x,G[xx-1][yy])) flag=0;
if(xx+1<=n&&go(x,G[xx+1][yy])) flag=0;
if(yy-1>=1&&go(x,G[xx][yy-1])) flag=0;
if(yy+1<=m&&go(x,G[xx][yy+1])) flag=0;
recover(x,G[xx-1][yy]);
recover(x,G[xx+1][yy]);
recover(x,G[xx][yy-1]);
recover(x,G[xx][yy+1]);
return flag;
}
void update(int x,int y)
{
if(y>=l&&y<=r)
{
LCT::cut(x,y);
seg::update(1,total,1,x,1);
}
}
void Del(int x)
{
int xx=pos[x].x,yy=pos[x].y;
update(x,G[xx-1][yy]);
update(x,G[xx+1][yy]);
update(x,G[xx][yy-1]);
update(x,G[xx][yy+1]);
}
void rese(int x,int y)
{
if(y>=l&&y<=r)
{
LCT::link(x,y);
seg::update(1,total,1,y,-1);
}
}
void Add(int x)
{
int xx=pos[x].x,yy=pos[x].y;
rese(x,G[xx-1][yy]);
rese(x,G[xx+1][yy]);
rese(x,G[xx][yy-1]);
rese(x,G[xx][yy+1]);
}
int main()
{
// setIO("input");
int i,j;
ll ans=0;
scanf("%d%d",&n,&m),total=n*m;
seg::build(1,total,1);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j) scanf("%d",&G[i][j]),pos[G[i][j]]=Pos(i,j);
for(l=r=1;r<=total;++r)
{
while(!check(r))
{
Del(l),++l;
}
Add(r);
seg::node p=seg::query(1,total,1,l,r);
if(p.mn==1) ans+=(ll)p.num_mn;
}
printf("%lld
",ans);
return 0;
}