关键词:
T1 5483. 【清华集训2017模拟11.26】简单路径
T2 5484. 【清华集训2017模拟11.26】快乐树
T3 5485. 【清华集训2017模拟11.26】字符串
T1 结论题,结论很显然任意两条路径权异或后,会将两条路径的交的贡献删去。
然后用个桶存一下出现过的异或和,暴力判一下就可以了
code
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 #define fo(i,a,b) for(int i=a;i<=b;i++) 6 #define fd(i,a,b) for(int i=a;i>=b;i--) 7 #define fh(i,x) for(int i=head[x];i;i=next[i]) 8 typedef long long LL; 9 using namespace std; 10 inline int max(int x,int y) {return (x<y)?y:x;} 11 inline int min(int x,int y) {return (x<y)?x:y;} 12 inline int read() { 13 int x=0,f=1;char ch=getchar(); 14 while(ch<‘0‘||ch>‘9‘) f=(ch==‘-‘)?-1:f,ch=getchar(); 15 while(ch>=‘0‘&&ch<=‘9‘) x=x*10+(ch-‘0‘),ch=getchar();return f*x; 16 } 17 const int N=1e3+100; 18 struct node { 19 int _lca,v; 20 node() {} 21 node(int a,int b):_lca(a),v(b) {} 22 }; 23 struct node1 { 24 int val,u,v,_lca; 25 node1() {} 26 node1(int _val,int _u,int _v,int l):val(_val),u(_u),v(_v),_lca(l){} 27 }to1[N*N],g[N*N]; 28 int to[N],w[N],next[N],head[N],tot,cnt,mx; 29 int tot1,next1[N*N],head1[N*N],fa[N],ans; 30 int dep[N],go[N][20],gw[N][20],n,x; 31 void add(int x,int y,int ww) {to[++tot]=y,w[tot]=ww,next[tot]=head[x],head[x]=tot;} 32 void add1(int val,int u,int v,int _lca) {to1[++tot1]=node1(val,u,v,_lca),next1[tot1]=head1[val],head1[val]=tot1;} 33 void dfs(int x) { 34 fh(i,x) { 35 dep[to[i]]=dep[x]+1,go[to[i]][0]=x,gw[to[i]][0]=w[i]; 36 dfs(to[i]); 37 } 38 } 39 void init_lca() { 40 dep[0]=1,dfs(0); 41 fo(i,1,17) fo(j,0,n-1) go[j][i]=go[go[j][i-1]][i-1],gw[j][i]=gw[j][i-1]^gw[go[j][i-1]][i-1]; 42 } 43 node lca(int a,int b) { 44 if(dep[a]>dep[b]) swap(a,b); 45 int f=dep[b]-dep[a],z=0; 46 fo(i,0,17) if(f&(1<<i)) z=z^gw[b][i],b=go[b][i]; 47 if(a==b) return node(a,z); 48 fo(i,0,17) { 49 if(go[a][i]!=go[b][i]) z^=gw[a][i]^gw[b][i],a=go[a][i],b=go[b][i]; 50 } 51 return node(go[a][0],z^gw[a][0]^gw[b][0]); 52 } 53 int main() { 54 n=read(); 55 fo(i,1,n-1) fa[i]=read(); 56 fo(i,1,n-1) x=read(),add(fa[i],i,x); 57 init_lca(); 58 fo(i,0,n-1) { 59 fo(j,i+1,n-1) { 60 node tmp=lca(i,j); 61 add1(tmp.v,i,j,tmp._lca); 62 g[++cnt]=node1(tmp.v,i,j,tmp._lca); 63 mx=max(mx,tmp.v); 64 } 65 } 66 fd(i,2048,mx) { 67 fo(j,1,cnt) { 68 if(!head1[i^g[j].val])continue; 69 else { 70 printf("%d ",i);return 0; 71 } 72 } 73 } 74 printf("%d ",max(mx,ans)); 75 return 0; 76 }
T2 算是一道dp题吧?有一个结论:“0”的影响范围一定是包括0的联通块。
先做一遍不考虑有“0”的dp,f[x]表示以x为子树的最优解。
然后g[x]表示x在“0”的联通块里,则g[x]=Σmax(f[son1],g[son1])
ans=max(f[0],g[0]);
Code
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 #define fo(i,a,b) for(int i=a;i<=b;i++) 6 #define fd(i,a,b) for(int i=a;i>=b;i--) 7 #define fh(i,x) for(int i=head[x];i;i=next[i]) 8 typedef long long LL; 9 using namespace std; 10 inline int max(int x,int y) {return (x<y)?y:x;} 11 inline int min(int x,int y) {return (x<y)?x:y;} 12 inline int read() { 13 int x=0,f=1;char ch=getchar(); 14 while(ch<‘0‘||ch>‘9‘) f=(ch==‘-‘)?-1:f,ch=getchar(); 15 while(ch>=‘0‘&&ch<=‘9‘) x=x*10+(ch-‘0‘),ch=getchar();return f*x; 16 } 17 const int N=1e3+50; 18 int f[N],g[N],val[N],n,fa[N]; 19 int to[N],next[N],head[N],tot; 20 void add(int x,int y) {to[++tot]=y,next[tot]=head[x],head[x]=tot;} 21 void dfs(int x) { 22 f[x]=val[x]; 23 fh(i,x) dfs(to[i]); 24 fh(i,x) f[x]+=max(f[to[i]],0); 25 } 26 void dp(int x) { 27 fh(i,x) dp(to[i]); 28 fh(i,x) g[x]+=max(f[to[i]],g[to[i]]); 29 } 30 int main() { 31 n=read(); 32 fo(i,1,n-1) fa[i]=read(),add(fa[i],i); 33 fo(i,0,n-1) val[i]=read(); 34 dfs(0),dp(0); 35 printf("%d ",max(f[0],g[0])); 36 return 0; 37 }
T3
Code
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 #define fo(i,a,b) for(int i=a;i<=b;i++) 6 #define fd(i,a,b) for(int i=a;i>=b;i--) 7 #define fh(i,x) for(int i=head[x];i;i=next[i]) 8 typedef long long LL; 9 using namespace std; 10 inline int max(int x,int y) {return (x<y)?y:x;} 11 inline int min(int x,int y) {return (x<y)?x:y;} 12 inline int read() { 13 int x=0,f=1;char ch=getchar(); 14 while(ch<‘0‘||ch>‘9‘) f=(ch==‘-‘)?-1:f,ch=getchar(); 15 while(ch>=‘0‘&&ch<=‘9‘) x=x*10+(ch-‘0‘),ch=getchar();return f*x; 16 } 17 const int N=1e5+50,inf=0x3f3f3f3f; 18 char s[N]; 19 int g[N][27],b[27],cnt[N][27],f[N][27],l,r,n,m,now; 20 int main() { 21 //freopen("c.in","r",stdin),freopen("c.out","w",stdout); 22 n=read(),m=read(); 23 scanf("%s",s+1); 24 fo(i,1,n) cnt[i][s[i]-‘a‘]++; 25 fo(j,0,25) fo(i,1,n) cnt[i][j]+=cnt[i-1][j]; 26 fo(j,1,26) g[0][j]=1; 27 fo(i,1,n) { 28 int t=s[i]-‘a‘; 29 fo(j,1,26) b[j]=n+1; 30 fo(j,1,26) { 31 if(cnt[i-1][t]-cnt[g[i-1][j]-1][t]==0) b[j+1]=min(b[j+1],g[i-1][j]); 32 else b[j]=min(b[j],g[i-1][j]); 33 } 34 b[1]=min(b[1],i); 35 fo(j,1,26) g[i][j]=b[j]; 36 } 37 fo(i,0,27) f[1][i]=1; 38 fo(i,2,n) { 39 fo(j,0,26) f[i][j]=n+1; 40 fo(j,0,26) { 41 fo(t,1,26) { 42 l=g[i][t],l--; 43 (t==1)?r=i:r=g[i][t-1]; 44 r--; 45 fo(st,0,j+1-t) f[i][j]=min(f[i][j],f[l][st]+1); 46 } 47 } 48 if(i<n) fo(j,1,26) f[i][j]=min(f[i][j],f[i][j-1]); 49 } 50 fd(j,26,0) { 51 if(f[n][j]<=m) now=j; 52 else break; 53 } 54 printf("%d ",m+now); 55 }
jzoj3539清华集训2014模拟数论高斯消元折射伤害(代码片段)
【清华集训2014模拟】折射伤害题面DescriptionInputOutputSampleInputSampleOutputDataConstraint解题思路Code题面Description在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能“折射”,即减少自己受... 查看详情
[loj#2327]「清华集训2017」福若格斯
[LOJ#2327]「清华集训2017」福若格斯试题描述小d是4xx9小游戏高手。有一天,小d发现了一个很经典的小游戏:跳青蛙。游戏在一个(5)个格子的棋盘上进行。在游戏的一开始,最左边的两个格子上各有一个向右的青蛙,最右边的两个... 查看详情
清华集训2017游记
Day0报到日火车上膜了一发附中大佬试机时感觉机房很热,头脑很不清醒晚上和cjl,xjt一起吃火锅,等了半天,感觉有毒Day1水落在酒店餐厅了,幸好赛场发水赛前松爷在群里发了一句GL&HF,非常慌开场看了三题,T1数学题,自己... 查看详情
[loj#2325]「清华集训2017」小y和恐怖的奴隶主
[LOJ#2325]「清华集训2017」小Y和恐怖的奴隶主试题描述"Afight?Countmein!"要打架了,算我一个。"Everyone,getinhere!"所有人,都过来!小Y是一个喜欢玩游戏的OIer。一天,她正在玩一款游戏,要打一个Boss。虽然这个Boss有(10^{100})点生命值,... 查看详情
*loj#2322.「清华集训2017」helloworld!
$n\leq50000$的树,有点权$\leq1e13$,$q\leq400000$次操作,有两种操作:从$s$跳到$t$每次$k$步,不到$k$步直接跳到$t$,每次把经过的点取根号;同样的跳法,对经过的点求和。首先一个数根号没几次就变0了因此可以大力修改。根号大力... 查看详情
「清华集训2017」无限之环(代码片段)
无限之WAhttps://www.luogu.org/problemnew/show/P4003本题如果知道是网络流的话,其实建图不算特别神奇,但是比较麻烦。数据范围过大,插头dp不能处理,而且是一个网格图,考虑网络流。先看是不是二分图?每个格子只会和相邻四个格... 查看详情
libreoj#2325.「清华集训2017」小y和恐怖的奴隶主(矩阵快速幂优化dp)
哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=sumfrac{1}{sum+1}*(f(i+1,s‘)+[s==s‘])$ 状态数只有$C_{8+3}^3=165$个,所... 查看详情
2017冬季24集训模拟-1.寻找幽灵
————————————————————————————————————————————题解把最短路处理出来然后做背包没有把head数组和all初始化qwq1#include<iostream>2#include<queue>3#include<set>4#include<cstdio... 查看详情
2017冬季24集训模拟-4.排座椅
————————————————————题解统计这一列或行放通道能隔开几个人,然后贪心输出没有排序QWQ1#include<iostream>2#include<queue>3#include<set>4#include<cstdio>5#include<cstring>6#include<vector>7#include&l 查看详情
2017冬季24集训模拟-3.耀西岛
——————————————————————————题解路径的长度是1-200000然后路径的条数有n*(n+1)/2根据鸽巢原理n*(n+1)/2> 200000就一定是YES所以复杂度只有n^21#include<iostream>2#include<queue>3#include<set>4#includ... 查看详情
清华集训2015v
#164.【清华集训2015】Vhttp://uoj.ac/problem/164 统计 描述 提交 自定义测试Picks博士观察完金星凌日后,设计了一个复杂的电阻器。为了简化题目,题目中的常数与现实世界有所不同。这个电阻器内有编号为 1∼n1&si... 查看详情
uoj#346.清华集训2017某位歌姬的故事动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ346.html题解首先按照$m_i$的大小排个序。如果某一个区间和一个m值比他小的区间有交,那么显然可以将这个区间控制的区域删除掉重合的那一段。如果一个区间被删没了,那么显然答案为0。在... 查看详情
luogup4002[清华集训2017]生成树计数(代码片段)
Link下文中的点指的是题目给的(n)个连通块。因为题目给的式子只与度数和点权相关,因此考虑Prufer序列。枚举每个点在Prufer序列中的出现次数,那么此时的贡献就是Prufer序列的个数乘上该生成树的价值。(ans=(n-2)!sumlimits_sumd_i=n-2p... 查看详情
2017.11.26计算机算法之分治与递归——汉诺塔
1、我的递归算法(纯粹的递归)#include<stdio.h>//当盘子数n等于15时,移动次数已经达到32767,运行时间已经达到15.540slonglongcount;voidhanoi(intn,chara,charb,charc)//借助C将A上的盘子全部移动到B{if(n==0)return;hanoi(n-1,a,c,b);printf("%c-->%c ",... 查看详情
2017.12.02noip提高组模拟赛a组
...IP提高组】模拟赛A组T13555【GDKOI2014模拟】树的直径T23542【清华集训2014】冒泡排序T33486【NOIP2013模拟联考10】道路改建(rebuild)T1树直径的一个性质,两棵树合并,形成新的树的直径的两个端点为原树中的四个端点之二。可以用反证... 查看详情
2014清华集训奇数国
3813:奇数国TimeLimit: 10Sec MemoryLimit: 256MBhttp://www.lydsy.com/JudgeOnline/problem.php?id=3813Description在一片美丽的大陆上有100000个国家,记为1到100000。这里经济发达,有数不尽的账房,并且每个国家有一个银行。某大公司的领... 查看详情
loj#6703-「清华集训2017」生成树计数(代码片段)
[sum_sumv_i=n-2prod(a_i^v_i+1*(v_i+1)^m/v_i!)*(sum(v_i+1)^m)]将(sum(v_i+1)^m)中的贡献分开算。我们有两个生成函数。第一个:[sum_ia^i+1*(v_i+1)^mx^i/i!]第二个:[sum_ia^i+1*(i+1)^2mx^i/i!]先将(proda)算到前面。令:[A(x)=sumx^i*(i+1)^m/i!B(x)=sumx^i*(i+1)^2m/i!]我们... 查看详情
清华集训2014玄学(代码片段)
清华集训2014玄学一列对象,常见的区间修改,单点询问,修改操作易于复合,但未必交换以及有逆。现在询问的时候忽视掉一段前缀与后缀,只留下中间一段连续的修改强制在线,(nleq10^5,qleq6*10^5),保证修改操作不超过(10^5)。... 查看详情