Wannafly挑战赛1
A Treepath
题意: 给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
tags:类似于树 dp, dfs搜一下,记录下每个子树上离子树根距离为奇数和偶数的数量。
#include
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i&#61;a; i<&#61;b; &#43;&#43;i)
#define per(i,b,a) for (int i&#61;b; i>&#61;a; --i)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define PII pair
typedef long long ll;
const int N &#61; 100005;int n, x, y;
vector<int > G[N];
PII dfs(int u, int fa)
{if(G[u].size()&#61;&#61;1) return MP(0,0);PII ans&#61;MP(0,0), tmp;for(int i&#61;0, to; to&#61;G[u][i], i
}
int main()
{scanf("%d", &n);rep(i,1,n-1){scanf("%d%d", &x, &y);G[x].PB(y); G[y].PB(x);}PII ans &#61; dfs(1, 0);&#43;&#43;ans.se;printf("%lld\n", ans.fi*(ans.fi-1)/2 &#43; ans.se*(ans.se-1)/2 );return 0;
}
B Xorto
题意&#xff1a; 给定一个长度为n的整数数组&#xff0c;问有多少对互不重叠的非空区间&#xff0c;使得两个区间内的数的异或和为0。
tags&#xff1a; 比赛的时候给水过去的。。数据好像有点水
首先肯定预处理出前缀&#xff0c;然后维护一个权值数组&#xff0c;O(n^2) 枚举区间 。
#include
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i&#61;a; i<&#61;b; &#43;&#43;i)
#define per(i,b,a) for (int i&#61;b; i>&#61;a; --i)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi first
#define se second
typedef long long ll;
const int N &#61; 100005, M &#61; 2000005;int n, s[N];
ll ans, cnt[M];
int main()
{scanf("%d", &n);int ai;rep(i,1,n){scanf("%d", &ai);s[i] &#61; s[i-1]^ai;}rep(i,1,n)rep(j,i,n)&#43;&#43;cnt[s[j]^s[i-1]];rep(i,1,n){rep(j,i,n)--cnt[s[j]^s[i-1]];rep(j,1,i)ans &#43;&#61; cnt[s[i]^s[j-1]];}printf("%lld\n", ans);return 0;
}