[51Nod]NOIP2018提高组省一冲奖班模测训练(二)
http://www.51nod.com/contest/problemList.html#!contestId=73&randomCode=4408520896354389006
还是原题大赛
A.LXL的雕像
设有 \(t\) 行, \(s\) 列,那么有 \((t+1)\times x +t\times l=n,(s+1)\times x+s\times l=m\)
把 \(x\) 消掉,再整理一下得到 \((m+l)\times t-(n+l)\times s=n-m\)
到这里直接上exgcd,然后算就行了
复杂度 \(O(logn)\)
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
ll l,m,n,x,y;
ll gcd(ll a,ll b,ll&x,ll&y){
if(!b){return x=1,y=0,a;}
ll g=gcd(b,a%b,y,x);y-=a/b*x;
return g;
}
int main(){
cin>>l>>m>>n;
if(l>m||l>n)return puts("-1"),0;
ll g=gcd(m+l,-n-l,x,y);
if((n-m)%g)return puts("-1"),0;
ll s=n/l,p=abs((-n-l)/g);
x=(x*(n-m)/g%p+p)%p;
x+=(s-x)/p*p;
if(n-x*l<0)puts("-1");else
printf("%.6f",(double)(n-x*l)/(x+1));
return 0;
}
B.ZYZ的游戏
先二分答案,问题转化为:把树分为几个联通块,使最长路不超过 \(m\) 最少需要切多少下
树形DP,设 \(f[x]\) 表示 \(x\) 所在联通块中以 \(x\) 为根的子树最大深度是多少
转移时,分两种情况
- \(f[y]>m/2\) 显然这样的 \(y\) 不能超过一个
- \(f[y]\le m/2\) 如果这里面最大的和第一种最小的加起来不超过 \(m\) 上面那一个就可以保留
复杂度 \(O(nlogn)\)
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int>pii;
inline int read(){char c,p=0;int w;
while(isspace(c=getchar()));if(c=='-')p=1,c=getchar();
for(w=c&15;isdigit(c=getchar());w=w*10+(c&15));return p?-w:w;
}
template<typename T,typename U>inline char smin(T&x,const U&y){return x>y?x=y,1:0;}
template<typename T,typename U>inline char smax(T&x,const U&y){return x<y?x=y,1:0;}
struct FastIO{
static const int S=1310720;
char buf[S],wbuf[S],*si=buf,*ti=buf,*so=wbuf,*to=wbuf+S;
~FastIO(){fwrite(wbuf,1,so-wbuf,stdout);}
#define gc (si==ti&&(ti=buf+fread(si=buf,1,S,stdin),si==ti)?EOF:*si++)
inline int read(){char c,p=0;int w;
while(isspace(c=gc));if(c=='-')p=1,c=gc;
for(w=c&15;isdigit(c=gc);w=w*10+(c&15));return p?-w:w;
}
#define pc(c) (so==to?fwrite(wbuf,1,S,stdout),so=wbuf,*so++=c:*so++=c)
template<typename T>inline void print(T w,char c='\n'){
static char s[25];int top=0;
if(w<0)pc('-'),w=-w;if(w==0)pc('0');
for(top=0;w;w/=10)s[++top]=w%10;
while(top)pc(s[top--]|'0');pc(c);
}
#undef gc
}io;
#define read io.read
const int N=4e5+5;
int n,m,k,f[N],cnt;
vector<int>g[N];
void dfs(int x,int fa){
f[x]=0;
int m1=n+1,m2=0;
for(int y:g[x])if(y!=fa){
dfs(y,x);
if(f[y]+1>(m>>1))++cnt,smin(m1,f[y]+1);
else smax(m2,f[y]+1);
}
if(m1+m2<=m)--cnt,f[x]=m1;else f[x]=m2;
}
int main(){
n=read(),k=read();
REP(i,2,n){
#define pb push_back
int x=read(),y=read();g[x].pb(y),g[y].pb(x);
}
int l=0,r=n;
while(l<r){
m=l+r>>1;cnt=0;dfs(1,0);
if(cnt<=k)r=m;else l=m+1;
}
cout<<l;
return 0;
}
C.XYK的音游
\(j\) 能转移到 \(i\) 的条件是 \(abs(x[i]-x[j])\le p\times(t[i]-t[j])\)
去掉绝对值,移项, \(x[i]-p\times t[i]\le x[j]- p\times t[j],x[j]+p\times t[j]\le x[i]+p\times t[i]\)
左边的排序搞定,右边的树状数组搞定
排序的时候要注意!!,相等的时候再加 \(j<i\) 这个条件
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int>pii;
inline int read(){char c,p=0;int w;
while(isspace(c=getchar()));if(c=='-')p=1,c=getchar();
for(w=c&15;isdigit(c=getchar());w=w*10+(c&15));return p?-w:w;
}
template<typename T,typename U>inline char smin(T&x,const U&y){return x>y?x=y,1:0;}
template<typename T,typename U>inline char smax(T&x,const U&y){return x<y?x=y,1:0;}
struct FastIO{
static const int S=1310720;
char buf[S],wbuf[S],*si=buf,*ti=buf,*so=wbuf,*to=wbuf+S;
~FastIO(){fwrite(wbuf,1,so-wbuf,stdout);}
#define gc (si==ti&&(ti=buf+fread(si=buf,1,S,stdin),si==ti)?EOF:*si++)
template<typename T>inline void read(T&w){register char c,p=0;
while(isspace(c=gc));if(c=='-')p=1,c=gc;
for(w=c&15;isdigit(c=gc);w=w*10+(c&15));if(p)w=-w;
}
inline int read(){register int x;return read(x),x;}
#define pc(c) (so==to?fwrite(wbuf,1,S,stdout),so=wbuf,*so++=c:*so++=c)
template<typename T>inline void print(T w,char c='\n'){
static char s[25];int top=0;
if(w<0)pc('-'),w=-w;if(w==0)pc('0');
for(top=0;w;w/=10)s[++top]=w%10;
while(top)pc(s[top--]|'0');pc(c);
}
#undef gc
}io;
#define read io.read
const int N=1e5+5;
struct data{int t,w,p;}a[N];
int n,m,d,f[N],c[5100005];
inline bool cmp(data x,data y){return x.p-d*x.t>y.p-d*y.t||x.p-d*x.t==y.p-d*y.t&&x.p<y.p;}
const int R=5e6;
inline void add(int p,int x){for(;p<=R+n;p+=p&-p)smax(c[p],x);}
inline int ask(int p){int r=0;for(;p;p-=p&-p)smax(r,c[p]);return r;}
int main(){
n=read();m=read(),d=read();
REP(i,1,m)a[i]=(data){read(),read(),read()};
sort(a+1,a+1+m,cmp);
int r=0;
REP(i,1,m){
f[i]=ask(a[i].p+d*a[i].t)+a[i].w;
add(a[i].p+d*a[i].t,f[i]);
smax(r,f[i]);
}
cout<<r;
return 0;
}
[51Nod]NOIP2018提高组省一冲奖班模测训练(二)的更多相关文章
- [51Nod]NOIP2018提高组省一冲奖班模测训练(一)题解
http://www.51nod.com/contest/problemList.html#!contestId=72&randomCode=147206 原题水题大赛.. A.珂朵莉的旅行 ...
- [51Nod]NOIP2018提高组省一冲奖班模测训练(三) 题解
链接 A.Anan的派对 题意:Anan想举办一个派对.Anan的朋友总共有 n 人.第i个人如果参加派对会得到 \(c_i\) 的快乐值,除他自己外每多一个人参加他会减少 \(d_i\) 的快乐值. ...
- [51Nod]NOIP2018提高组省一冲奖班模测训练(四)翻车记+题解
链接 下午5点的时候,突然想起来有这个比赛,看看还有一个小时,打算来AK一下,结果因为最近智商越来越低,翻车了,我还是太菜了.上来10分钟先切掉了C和A,结果卡在了B题,唉. A.砍树 一眼题,两遍树 ...
- NOIP2018提高组省一冲奖班模测训练(六)
NOIP2018提高组省一冲奖班模测训练(六) https://www.51nod.com/Contest/ContestDescription.html#!#contestId=80 20分钟AC掉 ...
- NOIP2018提高组省一冲奖班模测训练(五)
NOIP2018提高组省一冲奖班模测训练(五) http://www.51nod.com/Contest/ContestDescription.html#!#contestId=79 今天有点浪…… ...
- NOIP2018提高组省一冲奖班模测训练(四)
NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...
- NOIP2018提高组省一冲奖班模测训练(三)
NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...
- NOIP2018提高组省一冲奖班模测训练(二)
比赛链接 NOIP2018提高组省一冲奖班模测训练(二) 今天发挥正常,昨天不在状态…… 花了很久A了第一题 第二题打了30分暴力 第三题投机取巧输出test1答案(连暴力都不知道怎么打,太弱了) 2 ...
- NOIP2018提高组省一冲奖班模测训练(一)
比赛链接 https://www.51nod.com/contest/problemList.html#!contestId=72&randomCode=147206 这次考试的题非常有质量 ...
随机推荐
- 数据库中Select For update语句的解析
----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...
- 洛谷 P3902 递增
P3902 递增 题目描述 现有数列A_1,A_2,\cdots,A_NA1,A2,⋯,AN,修改最少的数字,使得数列严格单调递增. 输入输出格式 输入格式: 第1 行,1 个整数N 第2 行, ...
- HDFS文件系统上传时序图 PB级文件存储时序图
自己设计的时序图. 来自为知笔记(Wiz)
- quartz 添加监听器listener
全局注册,所有Job都会起作用 JobCountListener listener = new JobCountListener(); sched.getListenerManager().addJo ...
- BZOJ一句话
一句话题解集合. 1061: [Noi2008]志愿者招募 单纯形,运用对偶原理转化过来,变成标准形然后单纯性裸上即可. #include<cmath> #include<cstdi ...
- 重大漏洞:Bitlocker成摆设,多款固态硬盘硬件加密均可被绕过
荷兰拉德堡德大学的两名研究人员日前发表论文,描述了固态硬盘流行加密软件Bitlocker中的关键漏洞.固态硬盘需要口令来加密和解密其上存储的内容,但该口令可以被绕过. 荷兰拉德堡德大学的两名研究人员日 ...
- Python学习第一篇
好久没有来博客园了,今天开始写自己学习Python和Hadoop的学习笔记吧.今天写第一篇,Python学习,其他的环境部署都不说了,可以参考其他的博客. 今天根据MachineLearning里面的 ...
- 数据持久化-存取方式总结&应用沙盒&文件管理NSFileManager
iOS应用数据存储的常用方式: 1.XML属性列表 (plist归档) 2.NSUserDefaults (偏好设置) 3.NSKeyedArchiver 归档(加密形式) 4.SQLi ...
- 【Henu ACM Round#17 D】Hexagons!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目的图吓人. 找下规律就会发现从内到外是1,6,12,18 即1,16,26,36... 即1+6(1+2+3+...) 等差求和 ...
- CODEVS——T 4189 字典
http://codevs.cn/problem/4189/ 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Des ...