[CLYZ2017]day7


采蘑菇

solution

30分

\(dfs\)利用类似尺取的方式算出每个点到其他点的颜色数.

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define M 2005
#define N 300005
#define min(a,b) ab?a:b
using namespace std;
typedef long long ll;
struct graph{
    int nxt,to;
}e[N<<1];
ll ans,sum;
int c[N],g[N],t[N],tot[N],n,cnt;
bool v[M];
inline int read(){
    int ret=0;char c=getchar();
    while(!isdigit(c))
        c=getchar();
    while(isdigit(c)){
        ret=(ret<<1)+(ret<<3)+c-'0';
        c=getchar();
    }
    return ret;
}
inline void addedge(int x,int y){
    e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;
}
inline void dfs(int u){
    if(!tot[c[u]]) ++sum;
    ++tot[c[u]];ans+=sum;
    for(int i=g[u];i;i=e[i].nxt)
        if(!v[e[i].to]){
            v[e[i].to]=true;
            dfs(e[i].to);
        }
    if(!(--tot[c[u]])) --sum;
}
inline void Aireen(){
    n=read();
    for(int i=1;i<=n;++i)
        c[i]=read();
    for(int i=1,j,k;i

序列游戏

solution

100分

先认识一个性质,会被删的一段数的大小趋势如下图:

solution

100分

约定层数和最后一层同奇偶的层为奇数层,不同的为偶数层.

显然偶数层的石子数不影响必胜态,因为后手移动偶数层的,先手可以通过将其移到下一层(偶数层)或移除的方式恢复必胜态.

所以只需求奇数层的石子的异或和.

求方案数也就是求有多少种移动方案可以使得奇数层异或和为\(0\),分类讨论枚举即可.

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define N 65536
using namespace std;
typedef long long ll;
int a[N],k,t,sum,cnt;
inline int read(){
    int ret=0;char c=getchar();
    while(!isdigit(c))
        c=getchar();
    while(isdigit(c)){
        ret=(ret<<1)+(ret<<3)+c-'0';
        c=getchar();
    }
    return ret;
}
inline bool chk(int i,int j){
    return (sum^a[j])>a[j]&&(sum^a[j])-a[j]<=a[i];
}
inline void Aireen(){
    scanf("%d",&t);;
    while(t--){
        scanf("%d",&k);
        for(int i=1;i<(1<0;i-=2)
            for(int j=(1<0;i-=2)
            for(int j=(1<0;i-=2)
            for(int j=(1<