新的一个月呀><
12.1
考试...
12.2
cf 740d 740D - Alyona and a tree
给出 一颗 树,每个树的节点有一个权值 ai ,每条边有一个权值,如果 dis(u,v) <= a[v] ,求对于每一个 v 满足这个条件的 u 的个数
像Lca 那样向上跳,然后树上的前缀和
话说...dep 数值写成 int 写得太隐蔽..wa 了一二三四五天..哭泣
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 8 typedef long long LL; 9 10 const int INF = (1<<30)-1; 11 const int maxn = 400005; 12 const int MAX_LOG = 20; 13 14 int n,m; 15 int first[maxn],ecnt; 16 int fa[MAX_LOG+1][maxn]; 17 LL a[maxn],ans[maxn],dep[maxn]; 18 LL dis[maxn]; 19 20 struct Edge{ 21 int u,v,nxt; 22 LL w; 23 }e[10*maxn]; 24 25 void init(){ 26 ecnt = 0; 27 memset(first,-1,sizeof(first)); 28 memset(fa,0,sizeof(fa)); 29 } 30 31 void Add_edge(int u,int v,LL w){ 32 e[ecnt].u = u; 33 e[ecnt].v = v; 34 e[ecnt].nxt = first[u]; 35 e[ecnt].w = w; 36 first[u] = ecnt++; 37 } 38 39 void dfs1(int u,int pre){ 40 fa[0][u] = pre; 41 for(int k = 1;k < MAX_LOG;++k) fa[k][u] = fa[k-1][fa[k-1][u]]; 42 int v = u; 43 for(int i = MAX_LOG-1;i >= 0;i--){ 44 while(v > 1 && dep[u]-dep[fa[i][v]] <= a[u]){ 45 v = fa[i][v]; 46 // printf("u = %d v = %d\n",u,v); 47 } 48 } 49 v = max(v,1); 50 ans[fa[0][v]]--; 51 ans[fa[0][u]]++; 52 for(int i = first[u];~i;i = e[i].nxt){ 53 v = e[i].v; 54 if(v == pre) continue; 55 dep[v] = dep[u] + e[i].w; 56 dfs1(v,u); 57 } 58 } 59 60 void dfs2(int u,int pre){ 61 for(int i = first[u];~i;i = e[i].nxt){ 62 int v = e[i].v; 63 if(v ==pre) continue; 64 dfs2(v,u); 65 ans[u] += ans[v]; 66 } 67 } 68 69 int main(){ 70 scanf("%d",&n); 71 init(); 72 for(int i = 1;i <= n;i++) scanf("%I64d",&a[i]); 73 for(int i = 1;i <= n-1;i++){ 74 int u; 75 LL w; 76 scanf("%d %I64d",&u,&w); 77 Add_edge(i+1,u,w); 78 Add_edge(u,i+1,w); 79 } 80 dfs1(1,0); 81 dfs2(1,0); 82 for(int i = 1;i <= n;i++) printf("%I64d ",ans[i]); 83 printf("\n"); 84 return 0; 85 }
12.3
大家一起准备新生赛0.0
12.4
顺利><
12.5
上次 青蛙说那题,果然是考虑每个数的贡献诶...还没太瞅明白题解
12.6
给出 一个无向图,每条边有一个[l,r] ,如果 x >= l && x <= r ,那么能够通过这条边,问能够从 1 到 n 的合法的 x 最多有多少个
早上起床想了一想..想去二分 x 但是 发现好像没有什么单调性?
正解应该是枚举 一个左端点,二分右端点,维护一个最大值。
12.7
复习
12.8
考到两道大题都是完全没看过的东西....sighhhhhh
求均值?这是什么?
求均方值?这又是什么?
求方差?什么?
GG....
12.9 - 12.11
划水摸鱼
12.12
断断续续终于补完啦,好菜好菜
A. Arpa’s hard exam and Mehrdad’s naive cheat
求 1378^n 的个位数
第一眼就想去找循环节,然后忘记n 可以等于 0 ,被 hack 掉
其实可以快速幂
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long LL; 8 const int maxn = 1e5+5; 9 int n,m,a[maxn]; 10 11 int main(){ 12 while(scanf("%d",&n) != EOF){ 13 if(n % 4 == 1) puts("8"); 14 else if(n%4 == 2) puts("4"); 15 else if(n%4 == 3) puts("2"); 16 else puts("6"); 17 } 18 return 0; 19 }
B.Arpa’s obvious problem and Mehrdad’s terrible solution
给出 n 个数 ,求 a[i] xor a[j] = m 的 (i,j) 的对数
看到异或就想到字典树!!! 然后,半天不会..
用 一个 map ,扫一遍,每扫到 一个 x 的时候,看前面 map 里面存的 y 有多少 个 ,这个 y 是 x xor y = m 的
好像,这样的可以改成,a[i] * a[j] = k 的 (i,j) 对数 ,a[i] * a[j] > k 的(i,j) 的对数(用下树状数组求和?)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <map> 6 using namespace std; 7 8 typedef long long LL; 9 const int maxn = 1e5+5; 10 int n,m,a[maxn]; 11 int x; 12 13 map<int,int> h; 14 15 int main(){ 16 while(scanf("%d %d",&n,&x) != EOF){ 17 for(int i = 1;i <= n;i++) scanf("%d",&a[i]); 18 h.clear(); 19 h[a[1]]++; 20 LL ans = 0LL; 21 for(int i = 2;i <= n;i++){ 22 int y = a[i]^x; 23 //printf("a[%d] = %d y = %d\n",i,a[i],y); 24 ans += 1LL*h[y]; 25 h[a[i]]++; 26 } 27 printf("%I64d\n",ans); 28 } 29 return 0; 30 }
C .Arpa's loud Owf and Mehrdad's evil plan
题意 感觉有点晦涩,做法就是 找出所有的环,奇环的长度不变,偶环的长度除以 2 (x 走 一半,y 走一半),如果碰到有不能成环的就不行
求所有的 lcm 就是 最小 的 t
写跪在于 每个 点 只有 一个出度,还用 dfs 去找环,而且存边还存成无向的了,所以就是 长度为 2 的偶环 就老找不对
然后就用 一个 while 找下就好
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 using namespace std; 7 8 typedef long long LL; 9 const int maxn = 1e5+5; 10 int n,m,a[maxn],vis[maxn]; 11 vector<int> g[maxn]; 12 int cc,len; 13 14 LL gcd(LL a,LL b){ 15 return(!b) ? a : gcd(b,a%b); 16 } 17 18 LL lcm(LL a,LL b){ 19 return a / gcd(a,b) * b; 20 } 21 22 void solve(){ 23 memset(vis,0,sizeof(vis)); 24 LL ans = 1LL; 25 for(int i = 1;i <= n;i++){ 26 if(!vis[i]){ 27 int st = i,len = 0,now = i; 28 while(!vis[now]){ 29 vis[now] = 1; 30 now = a[now]; 31 len++; 32 if(now == st) break; 33 } 34 if(now != st){ 35 puts("-1"); 36 return; 37 } 38 if(len%2 == 0) len =len/2; 39 ans = lcm(ans,len); 40 } 41 } 42 printf("%I64d\n",ans); 43 } 44 45 int main(){ 46 while(scanf("%d",&n) != EOF){ 47 for(int i = 1;i <= n;i++) g[i].clear(); 48 for(int i = 1;i <= n;i++) scanf("%d",&a[i]); 49 solve(); 50 } 51 return 0; 52 }
D.Arpa's weak amphitheater and Mehrdad's valuable Hoses
感觉这个题意比 c 善良好多...哭泣
把连通块处理出来,每个连通块 的看做 有 cc +1 个物品,只能够每组物品选一个
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 using namespace std; 7 8 const int maxn = 2e3+5; 9 int a[maxn],b[maxn],fa[maxn]; 10 int n,m,k; 11 int v[maxn][maxn],w[maxn][maxn],c[maxn]; 12 int dp[10*maxn]; 13 vector<int> g[maxn]; 14 15 int Find(int x){return x == fa[x] ? x : fa[x] = Find(fa[x]);} 16 17 void solve(){ 18 //for(int i = 1;i <= n;i++) printf("fa[%d] = %d\n",i,fa[i]); 19 for(int i = 1;i <= n;i++){ 20 int x = Find(i); 21 g[x].push_back(i); 22 } 23 memset(v,0,sizeof(v)); 24 memset(c,0,sizeof(c)); 25 int tot = 0; 26 for(int i = 1;i <= n;i++){ 27 if(g[i].size() == 0) continue; 28 int sx = 0,sw = 0; 29 int mx = 0,mw = 0; 30 tot++; 31 int cnt = 0; 32 for(int j = 0;j < g[i].size();j++){ 33 int x = g[i][j]; 34 sw += a[x]; 35 sx += b[x]; 36 cnt++; 37 w[tot][cnt] = a[x]; 38 v[tot][cnt] = b[x]; 39 } 40 cnt++; 41 w[tot][cnt] = sw; 42 v[tot][cnt] = sx; 43 c[tot] = cnt; 44 } 45 46 /*for(int i = 1;i <= tot;i++){ 47 printf("c[%d] = %d\n",i,c[i]); 48 for(int j = 1;j <= c[i];j++) printf("%d %d ",w[i][j],v[i][j]); 49 printf("\n"); 50 }*/ 51 52 memset(dp,0,sizeof(dp)); 53 for(int i = 1;i <= tot;i++){ 54 for(int j = m;j >= 0;j--){ 55 for(int p = 0;p <= c[i];p++){ 56 if(j >= w[i][p]) dp[j] = max(dp[j],dp[j-w[i][p]] + v[i][p]); 57 } 58 } 59 } 60 printf("%d\n",dp[m]); 61 } 62 63 int main(){ 64 while(scanf("%d %d %d",&n,&k,&m) != EOF){ 65 memset(v,0,sizeof(v)); 66 for(int i = 1;i <= n;i++) fa[i] = i; 67 for(int i = 1;i <= n;i++) g[i].clear(); 68 for(int i = 1;i <= n;i++) scanf("%d",&a[i]); 69 for(int i = 1;i <= n;i++) scanf("%d",&b[i]); 70 int u,v; 71 for(int i = 1;i <= k;i++){ 72 scanf("%d %d",&u,&v); 73 int x = Find(u); 74 int y = Find(v); 75 if(x != y) fa[x]= y; 76 } 77 solve(); 78 } 79 return 0; 80 }
E.Arpa’s overnight party and Mehrdad’s silent entering
n 对情侣,不能吃相同食物
1 2 3 4 ... 2n 这样的位置挨着坐,相邻的 3 个人 不能都吃 一样的食物
二分图染色
第二个条件 建图没有建对,自己想的是 挨着 的人都连边 1 2 2 1 像这样其实是可以的就被搞成不可以了
但是 只需要 1 2 ;3 4; 5 6;这样的不一样
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 using namespace std; 7 8 const int maxn = 2e5+5; 9 int n,m,a[maxn],b[maxn],color[maxn]; 10 vector<int> g[maxn]; 11 12 bool dfs(int u){ 13 for(int i = 0;i < g[u].size();i++){ 14 int v = g[u][i]; 15 if(color[v] == color[u]) { 16 //printf("u = %d v = %d\n",u,v); 17 return false; 18 } 19 if(!color[v]){ 20 color[v] = 3 - color[u]; 21 if(!dfs(v)) { 22 // printf("v = %d\n",v); 23 return false; 24 } 25 } 26 } 27 return true; 28 } 29 30 void solve(){ 31 memset(color,0,sizeof(color)); 32 for(int i = 1;i <= 2*n;i++){ 33 if(!color[i]){ 34 color[i] = 1; 35 if(!dfs(i)) { 36 puts("-1"); 37 return; 38 } 39 } 40 } 41 for(int i = 1;i <= n;i++){ 42 printf("%d %d\n",color[a[i]],color[b[i]]); 43 } 44 } 45 46 int main(){ 47 while(scanf("%d",&n) != EOF){ 48 for(int i = 1;i <= 2*n;i++) g[i].clear(); 49 memset(a,0,sizeof(a)); 50 memset(b,0,sizeof(b)); 51 for(int i = 1;i <= n;i++){ 52 scanf("%d %d",&a[i],&b[i]); 53 g[a[i]].push_back(b[i]); 54 g[b[i]].push_back(a[i]); 55 } 56 for(int i = 1;i <= n;i++){ 57 int u = 2*i; 58 int v = 2*i-1; 59 g[u].push_back(v); 60 g[v].push_back(u); 61 } 62 solve(); 63 } 64 return 0; 65 }
12.13
划水摸鱼
12.14
我的 ctf 第一题 !>w<
被改错的密码
其实我是不会的...然后提示说是 md5
md5 是十六进制的,去掉字符串里面的 “l” 到 http://www.cmd5.com/ 这里解密一下 是 "idf"
图片下载下来之后,在 ubuntu 下面 cat 一下图片,就出来答案了
题目给的是 unicode 编码,转化成 ASCILL码 http://tool.chinaz.com/tools/unicode.aspx
摩斯密码
摩斯电码,答案提交是小写
12.15 - 12.29
杂七杂八的半个月>_<
学了一点点日语,补了个番,做了点题,学了下sai,看了点点书 ..
12.30
cf 509e Pretty Song
定义一个字符串 的 优美度为这个字符串中元音字母所占的比例,给出一个字符串,求所有子串的优美度之和
IITWPC4F - Gopu and the Grid Problem
给出 一个二维平面,坐标范围 是 100000 * 100000 ,每个点最开始 都是 0
有三种操作
x l r 将 所有 x 坐标 在[l,r] 范围的翻转
y l r 将 所有 y 坐标 在[l,r] 范围的翻转
q x y X Y 求 坐标范围在 这个矩形的 1 的个数