【寒假集训系列DAY3】
DAY2的坑之后会补上
DAY3
今天暴力分拿的还是不错的...60+30+25=115,但还是太弱了呀,每题都只会暴力(话说第3题直接输-1给了15分,本以为只会给5分,然后打了半个小时的爆搜...)
T1:Simple (图样图森破?)
【问题描述】
对于给定正整数 n,m,我们称正整数 c 为好的,当且仅当存在非
负整数 x,y,使得 n*x+m*y=c。
现在给出多组数据,对于每组数据,给定 n,m,q,求[1,q]内有
多少个正整数不是好的。
【输入格式】
第一行,一个整数 T 表示数据组数。
接下来每行三个数,分别表示 n,m,q,即一组询问。
【输出格式】
对于每组数据,输出一行表示答案。
考试的时候打了一个暴力,妥妥的60分...
交卷前问了一下Venus巨佬,然而他说是一道DP题,感觉瞬间明白了什么,其实就是一道简单的DP啊,但来不及改了...
思路:DP(当然数学方法也可以,但是好烦啊...)类似于背包?反正暴力填表就好了..把“好的数”求出来,然后减一下就好了
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define int long long
- using namespace std;
- inline int read(){
- char chr=getchar(); int f=,ans=;
- while(!isdigit(chr)) {if(chr=='-') f=-;chr=getchar();}
- while(isdigit(chr)) {ans=(ans<<)+(ans<<);ans+=chr-'';chr=getchar();}
- return ans*f;
- }
- void write(int x){
- if(x<) putchar('-'),x=-x;
- if(x>) write(x/);
- putchar(x%+'');
- }
- int n,m,h,f[];
- signed main(){
- freopen("simple.in","r",stdin);
- freopen("simple.out","w",stdout);
- int t=;
- t=read();
- for(int i=;i<=t;i++){
- n=read(),m=read(),h=read();
- memset(f,-,sizeof(f));
- f[]=; int last=;
- for(int j=;f[(last+m)%n]==-;j++) f[(last+m)%n]=f[last]+m,last=(last+m)%n;
- int ans=;
- for(int i=;i<n;i++)
- if(f[i]!=-&&f[i]<=h) ans+=(h-f[i])/n+;
- printf("%lld\n",h-ans+);
- }
- return ;
- }
T2:Walk
【问题描述】
给定一棵 n 个节点的树,每条边的长度为 1,同时有一个权值
w。定义一条路径的权值为路径上所有边的权值的最大公约数。现在
对于任意 i∈[1,n],求树上所有长度为 i 的简单路径中权值最大的
是多少。如果不存在长度为 i 的路径,则第 i 行输出 0。
【输入格式】
第一行,一个整数 n,表示树的大小。
接下来 n-1 行,每行三个整数 u,v,w,表示 u,v 间存在一条权值
为 w 的边。
【输出格式】
对于每种长度,输出一行,表示答案。
考试的时候先打了30分的暴力,然后看了几组大数据,发现当边长很大时全部都是0,然后又在保证30分的情况下,牺牲部分正确性换取时间,如果广搜时深度达大于1000层就不往下更新了,然而并没有什么用...最后还是30分...
30分做法:O(n)枚举起点 对于每一个起点跑一个BFS,搜索同时记录深度、当前路径深度(可以开3个队列),对于每一个深度更新答案(取最大值)
满分做法:“这种题目一看就是要枚举gcd的!”——By bztMinamoto
枚举边的gcd值(x),每次把是x的倍数的边加入新图,构成一个森林,然后把里面的树里面的最长链(直径)作为长度更新答案(题目里面的图的下标是边的权值,便于遍历边的时候最快找到)
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- inline int read(){
- char chr=getchar(); int f=,ans=;
- while(!isdigit(chr)) {if(chr=='-') f=-;chr=getchar();}
- while(isdigit(chr)) {ans=(ans<<)+(ans<<);ans+=chr-'';chr=getchar();}
- return ans*f;
- }
- void write(int x){
- if(x<) putchar('-'),x=-x;
- if(x>) write(x/);
- putchar(x%+'');
- }
- const int N=4e5+;
- struct node{int x,y,nxt;}e[N],edge[N<<];
- int st[N],sta[N<<],tt=,tot=;
- int p[N<<],num=;
- int ans[N],mxlen,mx,n,link[N<<];
- inline void Add(int u,int w,int z){e[++tt]={u,w,sta[z]};sta[z]=tt;}//建立原图
- inline void add(int u,int w){edge[++tot]={u,w,st[u]};st[u]=tot;link[tot]=u;edge[++tot]={w,u,st[w]};st[w]=tot;link[tot]=w;}//新图
- int dfs(int now){//求树的直径,不讲...
- p[now]=num;
- int son=;
- for(int i=st[now];i;i=edge[i].nxt){
- if(p[edge[i].y]==num) continue;
- int r=dfs(edge[i].y);
- mxlen=max(mxlen,r+son+);
- son=max(son,r+);
- }return son;
- }
- int main(){
- freopen("walk.in","r",stdin);
- freopen("walk.out","w",stdout);
- n=read();
- for(int i=;i<n;i++){
- int u=read(),w=read(),z=read();
- mx=max(mx,z);Add(u,w,z);
- }
- for(int i=;i<=mx;i++){//枚举gcd
- for(int j=i;j<=mx;j+=i)
- for(int k=sta[j];k;k=e[k].nxt)add(e[k].x,e[k].y);//建新图
- mxlen=,num++;
- for(int k=;k<=tot;k++)
- if(p[link[k]]!=num) dfs(link[k]);//求直径
- for(int k=;k<=tot;k++) st[link[k]]=;
- tot=;ans[mxlen]=i;//更新答案
- }
- for(int i=n-;i>;i--) ans[i]=max(ans[i],ans[i+]);
- for(int i=;i<=n;i++)printf("%d\n",ans[i]);
- return ;
- }
【寒假集训系列DAY3】的更多相关文章
- 【寒假集训系列DAY.1】
Problem A. String Master(master.c/cpp/pas) 题目描述 所谓最长公共子串,比如串 A:“abcde”,串 B:“jcdkl”,则它们的最长公共子串为串 “cd” ...
- 8.6 正睿暑期集训营 Day3
目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...
- CSU-ACM寒假集训选拔-入门题
CSU-ACM寒假集训选拔-入门题 仅选择部分有价值的题 J(2165): 时间旅行 Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中 ...
- 2022寒假集训day3
day3:四道检测题,花了大半天时间. T1 子集和问题 问题描述 子集和问题的一个实例为<S,c>.其中S={x1,x2,-,xn}是一个正整数的集合,c是一个正整数.子集和问题判定是否 ...
- 【集训Day3 单调队列】【2018寒假集训Day 5更新】最大子序列和
最大子序列和(maxsum) [问题描述] 输入一个长度为n的整数序列(A1,A2,……,An),从中找出一段连续的长度不超过M的子序列,使得这个序列的和最大. 例如: 序列 1, -3, 5, 1, ...
- HZNU-ACM寒假集训Day3小结 搜索
简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...
- 中南大学2019年ACM寒假集训前期训练题集(基础题)
先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...
- 2022寒假集训day2
day1:学习seach和回溯,初步了解. day2:深度优化搜索 T1 洛谷P157:https://www.luogu.com.cn/problem/P1157 题目描述 排列与组合是常用的数学方 ...
- ACM集训的Day3 B。。。盲目搜索之DFS。。。
milk 一.题目描述: gzp有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到 另一个桶中,直到被灌 ...
随机推荐
- 使用ScriptManager服务器控件前后台数据交互
前台页面信息: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFor ...
- centOS7卸载google-chrome
参考: https://www.jianshu.com/p/39d0b8f578d9
- sudo dpkg-reconfigure phpmyadmin命令,重新配置一遍phpmyadmin
sudo dpkg-reconfigure phpmyadmin命令,重新配置一遍phpmyadmin
- python常用三方库 - openpyxl
目录 python常用三方库 - openpyxl 读取Excel文件 写入Excel文件 python常用三方库 - openpyxl openpyxl是一个第三方库, 可以处理xlsx格式的Exc ...
- PAT 1093. Count PAT's
The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...
- 《你说对就队》第八次团队作业:Alpha冲刺 第五天
<你说对就队>第八次团队作业:Alpha冲刺 第五天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...
- 强悍的 ubuntu —— 命令行访问网页
所谓以命令行的方式访问网页,即是在终端下以文本的形式访问网站,这里推荐一个工具:w3m, $ sudo apt-get install w3m $ w3m www.baidu.com
- [Codeforces 872]比赛记录
强行打了$cf$上的第一场比赛,现在感觉自己的$rating$会炸飞= = A 这是练习输入输出吗QAQ,竟然$WA$了两遍QAQ,我$WA$的一声就哭了出来啊QAQ B 好像很水的乱扫就好了,m ...
- [UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]
后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 #include <iostream> #include <algorithm> ...
- 同余方程 2012年NOIP全国联赛提高组
时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Descriptio ...