十二月流水账

新的一个月呀><

12.1

考试...

12.2

cf 740d 740D - Alyona and a tree

给出 一颗 树,每个树的节点有一个权值 ai ,每条边有一个权值,如果 dis(u,v) <= a[v] ,求对于每一个 v 满足这个条件的 u 的个数

像Lca 那样向上跳,然后树上的前缀和

话说...dep 数值写成 int 写得太隐蔽..wa 了一二三四五天..哭泣

 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 }
View Code

 12.3

大家一起准备新生赛0.0

12.4

顺利><

12.5

上次 青蛙说那题,果然是考虑每个数的贡献诶...还没太瞅明白题解

 

12.6

lizishu的修炼1

给出 一个无向图,每条边有一个[l,r] ,如果 x >= l && x <= r ,那么能够通过这条边,问能够从 1 到 n 的合法的 x 最多有多少个

早上起床想了一想..想去二分  x 但是 发现好像没有什么单调性?

正解应该是枚举 一个左端点,二分右端点,维护一个最大值。

 

12.7

复习

12.8

考到两道大题都是完全没看过的东西....sighhhhhh

求均值?这是什么?

求均方值?这又是什么?

求方差?什么?

GG....

 

12.9 - 12.11

划水摸鱼

12.12

383 div2

断断续续终于补完啦,好菜好菜

A. Arpa’s hard exam and Mehrdad’s naive cheat

求 1378^n 的个位数

第一眼就想去找循环节,然后忘记n 可以等于 0 ,被 hack 掉

其实可以快速幂

 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 }
View Code

 

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) 的对数(用下树状数组求和?)

 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 }
View Code

 

C .Arpa's loud Owf and Mehrdad's evil plan

题意 感觉有点晦涩,做法就是 找出所有的环,奇环的长度不变,偶环的长度除以 2 (x 走 一半,y 走一半),如果碰到有不能成环的就不行

求所有的 lcm 就是 最小 的 t

写跪在于 每个  点 只有 一个出度,还用 dfs 去找环,而且存边还存成无向的了,所以就是 长度为 2 的偶环 就老找不对

然后就用 一个 while 找下就好

 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 }
View Code

 

D.Arpa's weak amphitheater and Mehrdad's valuable Hoses

感觉这个题意比 c 善良好多...哭泣

把连通块处理出来,每个连通块 的看做 有 cc +1 个物品,只能够每组物品选一个

 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 }
View Code

 

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;这样的不一样

 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 }
View Code

 

12.13

划水摸鱼

12.14

我的 ctf 第一题 !>w<

被改错的密码

其实我是不会的...然后提示说是 md5

md5 是十六进制的,去掉字符串里面的 “l” 到 http://www.cmd5.com/ 这里解密一下 是 "idf"

 

啥?

图片下载下来之后,在 ubuntu 下面 cat 一下图片,就出来答案了

 

ASCII码而已

题目给的是 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 的个数

 

转载于:https://www.cnblogs.com/wuyuewoniu/p/6123286.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值