正睿多校联盟训练Week5

T1

Problem A. 阿瓦的海报
输入文件: poster.in
输出文件: poster.out
时间限制: 1 second
空间限制: 512 megabytes
阿瓦为了宣传她的影展,准备画一张海报张贴在幻想镇的各个角落。她为了让海报引人注目,已经在图案、背
景和排版上费了很大的工夫。
但这时她接到一个来自印刷厂的通知:印刷厂的纸不够了,本来答应给阿瓦定做的海报不能达到预期的尺寸。
印刷厂表示,剩下的纸最多能够承担每张海报的面积为 S。而阿瓦认为,海报的面积应当是越大越好,所以阿
瓦决定,就将每张海报的面积改成 S
阿瓦认为,海报的面积越大,能表达的内容越多。海报的周长越小,视觉上的体验就越好。并且阿瓦还坚持,
海报的长和宽一定得是整数。请你告诉她,在面积确定的前提下,海报的周长最小是多少。
Input
第一行一个数 T,表示数据组数。
接下来 T 行,每行一个数 S,意义如题面中所述。
Output
输出共 T 行,对于每组数据输出一行表示最小周长。
Example

poster.in poster.out
5 5 6 7 1 1 12
10
16
4 4

Constraints
对于 30% 的数据, S ≤ 100。
对于 50% 的数据, S ≤ 105 。
对于 100% 的数据, S ≤ 109, T ≤ 5。

极水,我们搞一下模拟,找根号S,如果不是整数,就找离他最近的因数。

code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int T;
 5 ll task(ll t)
 6 {
 7     ll ans=0,tmp=0;
 8     stack<int>s;
 9     for(int i=1;i*i<=t;i++)
10         if(t%i==0) tmp=i;
11     if(tmp*tmp==t) ans=4*tmp;
12     else ans=2*(tmp+t/tmp);
13     return ans;
14 }
15 int main()
16 {
17     scanf("%d",&T);
18     for(int i=1;i<=T;i++)
19     {
20         ll ask=0;
21         scanf("%lld",&ask);
22         printf("%lld\n",task(ask));
23     }
24     return 0;
25  } 

T2

Problem B. 大战幻想珠
输入文件: bead.in
输出文件: bead.out
时间限制: 1 second
空间限制: 512 megabytes
烤乐滋又生日了!虽然过去了整整一年,可他还是对去年发生的炸弹事件充满阴影。于是决定不让来访的好友
们自带礼物。
但生日怎么能没有礼物呢?烤乐滋决定拿出他的幻想珠串来。幻想珠是一颗上面写着小写英文字母的珠子。有
些珠子自带神奇的魔力,上面写着一个"?",就表示这颗珠子可以表示任意一个小写英文字母。幻想珠串是长长的
一个个幻想珠首尾相连组成的串。烤乐滋决定,让每个朋友从这个珠串中挑选一段连续的串送给自己。
烤乐滋很喜欢回文(从前往后和从后往前读一样),于是他希望朋友挑选出的串都是回文的。比如"ababa"
和"acd?a" 都是回文的,而"a?d?c" 就不是回文的。
烤乐滋想要知道,整个幻想珠串中一共能挑选出多少个回文的子串。两个位置不同内容相同的子串我们也视
作是不同的子串。
Input
第一行一个数 n,表示幻想珠串的长度。
第二行一个有 n 个字符。只可能是小写字母或"?"。字符之间没有多余空格。
Output
一行一个数表示答案。
Example

bead.in bead.out
5
b?aba
10

Constraints
对于 30% 的数据, n ≤ 10。
对于 50% 的数据, n ≤ 50。
对于 70% 的数据, n ≤ 300。
对于 100% 的数据, n ≤ 3000。

一道字符串题目。首先我们一定要注意,ans的初值设为n本身,因为一个字母本身也可构成一个回文串。

然后从n=3000的数据范围我们大概可以估计出用O(n方)的算法。

回文串的长度要么是奇数,要么是偶数。那么我们可以从每一个字母出发,找奇数长度的串和偶数长度的串是否为回文串。

细节:读入字符串的高端操作,“a+1",这样可以防止出现把末尾的空格读进。

code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,l,r,ans;
 4 char a[5000];
 5 int main()
 6 {
 7     scanf("%d",&n);
 8     scanf("%s",a+1);
 9     ans=n;//对于自己开始也是回文的
10     for(int i=1;i<=n;i++)
11     {
12         l=i-1;r=i+1;
13         //奇数长度的串
14         while(l>=1&&r<=n)
15         {
16             if(a[l]==a[r]||a[l]==‘?‘||a[r]==‘?‘)
17              {ans++;l--;r++;}
18             else break;
19         }
20         l=i;r=i+1;
21         //偶数长度的串
22         while(l>=1&&r<=n)
23         {
24             if(a[l]==a[r]||a[l]==‘?‘||a[r]==‘?‘)
25              {ans++;l--;r++;}
26             else break;
27         }
28     }
29     printf("%d",ans);
30     return 0;
31 }

T3

Problem C. 烤乐滋野餐
输入文件: picnic.in
输出文件: picnic.out
时间限制: 1 second
空间限制: 512 megabytes
烤乐滋今天没有犯错误,他心情就很好,于是他决定去幻想山野餐犒劳一下自己。但烤乐滋很懒,他不准备从
家里带任何食物,而是到幻想山上边买边吃。
幻想山上一共有 n 个便利店,每两个便利店都能够通过山路互相到达。整座山上一共有 n - 1 条山路,每条
山路连接着两个便利店,它们的长度可能不同。第 i 个便利店里能够供应 Pi 单位的食物。
烤乐滋是个大胃王,他希望吃到的东西越多越好,所以他很关心一路上经过的所有便利店的 P 值加和。但同
时他也很懒,不想走太多的路,所以他也同样很关心要走的长度。
烤乐滋定义一条简单路径(不经过重复点的路径)的愉悦值为:经过的所有便利店的食物供应和 ÷ 这条路径
经过的所有山路的长度和。
烤乐滋对于这天的计划有多种路径的选择,他每次都挑出一条路径,然后你需要回答烤乐滋,这条路径的愉悦
值为多少。
Input
第一行一个数 n,表示便利店个数。
第二行 n 个数,第 i 个数 Pi 表示第 i 家便利店的食物供应量。
接下来 n - 1 行,第 i 行三个数 ui, vi, wi。表示第 i 条山路连接 uivi 两家便利店,并且这条山路的长度为
wi
接下来一行一个 m, 表示询问个数。
接下来 m 行,每行两个数 xi,yi。表示询问从便利店 xi 出发到便利店 yi 结束的这条路径的愉悦值。
Output
输出 m 行,对于每个询问输出对应的路径的愉悦值。
愉悦值以分数形式输出。分子与分母之间用"/" 隔开,并且要求是既约分数。比如你不能输出"2/4" 而要输
出"1/2"。注意当分母为 0 时,可直接输出" 路径上 P 的和/0"。

Example

picnic.in picnic.out
4
3 4 2 2
1 2 4
2 3 4
2 4 5
5
2 3
4 4
1 3
4 3
3 4
3/2
1/0
9/8
8/9
8/9

Constraints
对于 30% 的数据, n; m ≤ 10。
对于 50% 的数据, n; m ≤ 103。
对于 100% 的数据, n; m ≤ 105, 1 ≤ ui; vi; xi; yi ≤ n, 0 < wi; pi ≤ 103 。

一看起来就知道是图论。 还是一棵树 我们可以预处理出来每个点到遍历到根节点走的“wd""wb"(其实就是点权、边权辣...这个命名方法被L__A佬奶。。。)

然后求LCA。

gcd函数写错了有点难受。

code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,tot,t,head[100005],supply[100005];
 4 int d[100005],f[100005][20];
 5 int wd[100005],wb[100005];
 6 struct node{
 7     int to,val,next;
 8 }edge[200005];
 9 inline int read(){
10     int a=0,t=1; char ch=getchar();
11     while (ch<‘0‘ || ch>‘9‘){
12         if (ch==‘-‘) t=-1; ch=getchar();
13     }
14     while (ch>=‘0‘ && ch<=‘9‘){
15         a=a*10+(ch-‘0‘); ch=getchar();
16     }
17     return a*t;
18 }
19 void add(int x,int y,int z)
20 {
21     edge[++tot].to=y;
22     edge[tot].val=z;
23     edge[tot].next=head[x];
24     head[x]=tot;
25 }
26 void pre_bfs()
27 {
28     wd[1]=supply[1];d[1]=1;
29     queue<int>q;
30     q.push(1);
31     while(q.size())
32     {
33         int x=q.front();q.pop();
34         for(int i=head[x];i;i=edge[i].next)
35         {
36             int y=edge[i].to;
37             if(d[y]) continue;
38             d[y]=d[x]+1;
39             f[y][0]=x;
40             wd[y]=wd[x]+supply[y];
41             wb[y]=wb[x]+edge[i].val;
42             for(int j=1;j<=t;j++)
43              f[y][j]=f[f[y][j-1]][j-1];
44             q.push(y);
45         }
46     }
47 }
48 int lca(int x,int y)
49 {
50     if(d[x]>d[y]) swap(x,y);
51     for(int i=t;i>=0;i--)
52      if(d[f[y][i]]>=d[x]) y=f[y][i];
53     if(x==y) return x;
54     for(int i=t;i>=0;i--)
55      if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
56     return f[x][0];
57 }
58 int gcd(int a,int b)
59 {
60     return b ? gcd(b , a % b) : a;
61 }
62 int main()
63 {
64     n=read();
65     t=log2(n)+1;
66     for(int i=1;i<=n;i++) supply[i]=read();
67     for(int i=1;i<=n-1;i++)
68     {
69         int x=0,y=0,z=0;
70         x=read(),y=read(),z=read();
71         add(x,y,z);
72         add(y,x,z);
73     }
74     m=read();
75     pre_bfs();
76     //for(int i=1;i<=n;i++) printf("%d ",wd[i]);
77     //for(int i=1;i<=n;i++) printf("%d ",wb[i]);
78     for(int i=1;i<=m;i++)
79     {
80         int x=0,y=0;
81         x=read(),y=read();
82         int tmp=lca(x,y);
83         //cout<<"lca="<<tmp;
84         int ans2=wb[x]+wb[y]-2*wb[tmp];
85         int ans1=wd[x]+wd[y]-2*wd[tmp]+supply[tmp];
86         //printf("%d %d\n",ans1,ans2);
87         if(ans2==0)
88         {
89             printf("1/0\n");
90             continue;
91         }
92         int cnt=gcd(ans1,ans2);
93         printf("%d/%d\n",ans1/cnt,ans2/cnt);
94     }
95     return 0;
96 }

原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9180363.html

时间: 2024-08-11 11:52:25

正睿多校联盟训练Week5的相关文章

正睿多校联盟训练Week6

并没有参加 Problem A.阿瓦分蛋糕输入文件: cake.in输出文件: cake.out时间限制: 1 second空间限制: 512 megabytes阿瓦为了庆祝自己自己成长为了一只可爱的小猫,决定提前过生日!她觉得,在这一年当中帮助过他最多的就是阿卡和烤乐滋了,于是决定这次只请阿卡和烤乐滋两个人吃蛋糕.阿瓦买了一个 n × m 的蛋糕,她打算分给三个人吃,同时她切蛋糕的时候为了美观,只会在整块的蛋糕上一划到底.也就是说,她如果在蛋糕上切了一刀,那么这一刀的起点和终点一定在蛋糕的边界

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

2014多校联合训练第一场(组队训练)

这是我.potaty.lmz第二次训练,毕竟经验不足,加上水平不够,导致我们各种被碾压. A - Couple doubi: 这道题是道比较水的数论.但我们都没想出来要怎么做.后来是potaty提议打个表看看,然后lmz打出表后发现了规律.我还没细看,待研究后再补全. D - Task: 这道题一看就知道是个贪心(现在只要是有deadline的题我都觉得是贪心了).虽然想出来了,但还是不会严格证明为什么只要取满足task的且y最小(y相等时x最小)的machine就行了. 我的做法是把所有mac

9.22 正睿提高4

目录 2018.9.22 正睿提高5 A 数组计数(DP) B 旅行(思路) C 进化(思路 二进制拆分) 考试代码 B C 2018.9.22 正睿提高5 时间:3.5h 期望得分:100+80+30 实际得分:100+80+30 比赛链接 T2一直以为类似某道虚树题(SDOI2015)..到最后只想写暴力(写了暴力也该想到了啊 但是已经在划水了). A 数组计数(DP) 题目链接 DP.前缀和优化一下就行了. 刚开始滚动数组又少清空了mmp.. #include <cstdio> #inc

正睿OI国庆DAY2:图论专题

正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力说做法是dfs 首先两个点一定在点双联通分量里 点双是简单环,只有两条,不存在 猜测其他情况存在三条 双联通分量分解 输出情况可以用dfs树判,讨论非树边覆盖情况 内包含 下面分叉连到上面 相交 输出点即可 BFS/例题 BFS树没有跳跃边 计数/动态规划有用吧 树上bfs序好像可以判断距离? 边权

正睿OI DAY3 杂题选讲

正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n\leq k^2\) 暴力 \(n\geq k^2\),找点x,求直线l经过x,且点数最多,点数\(\geq k+1\),递归,否则再找一个 One Point Nine Nine 现在平面上有\(n\)个点,已知有一个常数\(D\). 任意两点的距离要么\(\leq D\),要么\(\geq 1.

2015年多校联合训练第四场(Problem Killer)hdu5328

题意: 求最大等差或等比数列的长度 思路: 开始用二分,WA暴了,后来发现我用的等差数列公式有问题 (a[i]+a[j])*(j-i+1)/2,等差数列一定满足这个公式,但满足这个公式的不一定是等差数列,我sb了..... 还有就算等比数列a[i+1]/a[i] == a[i]/a[i-1],也是sb了,这个会引起精度丢失,应该a[i]^2 = a[i-1]*a[i+1]; --. 正解应该是不管等差还是等比数列,如果a,b,c是等差,b,c,d是等差,那么a,b,c,d肯定是等差 然后扫一遍就

校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=4497 二.思路 将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解.然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn.满足上面条件的x,y,z一定为这样的形式.x' = p1^i1 * p2^i2 *```* pn^in.y' =