HDU校赛 | 2019 Multi-University Training Contest 3
2019 Multi-University Training Contest 3
http://acm.hdu.edu.cn/contests/contest_show.php?cid=850
1004. Distribution of books
考虑二分答案,设当前二分出来的是\(x\)。
设\(f_i\)表示前\(i\)个能分成最多的段数,使得每一段和都\(\leqslant x\)。
转移显然,枚举一个\(j\),若\(s_i-s_j\leqslant x\)则转移,\(s_i\)表示前缀和。
式子变一下就是\(s_i\leqslant x+s_j\),那么对于每个\(f_i\)把值扔到\(x+s_j\)这个位置,随便拿个什么维护一下,每次查询就好了,复杂度\(O(Tn\log ^2n)\)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
const int maxn = 4e5+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7;
int n,a[maxn],f[maxn],s[maxn],k;
#define ls p<<1
#define rs p<<1|1
struct Segment_Tree {
int t[maxn*8];
void modify(int p,int l,int r,int x,int v) {
t[p]=max(t[p],v);
if(l==r) return ;int mid=(l+r)>>1;
if(x<=mid) modify(ls,l,mid,x,v);
else modify(rs,mid+1,r,x,v);
}
int query(int p,int l,int r,int x,int y) {
if(x<=l&&r<=y) return t[p];
int mid=(l+r)>>1,ans=0;
if(x<=mid) ans=max(ans,query(ls,l,mid,x,y));
if(y>mid) ans=max(ans,query(rs,mid+1,r,x,y));
return ans;
}
void build(int p,int l,int r) {
t[p]=0;if(l==r) return ;int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
}
}T;
int r[maxn],tot;
int check(int x) {
tot=0;
FOR(i,1,n) f[i]=0,r[++tot]=s[i],r[++tot]=s[i]+x;
sort(r+1,r+tot+1);int m=unique(r+1,r+tot)-r-1;
T.build(1,1,m);
for(int i=1;i<=n;i++) {
int pps=lower_bound(r+1,r+m+1,s[i])-r;
int ppsw=lower_bound(r+1,r+m+1,s[i]+x)-r;
int a=T.query(1,1,m,pps,m);
if(!a) f[i]=s[i]<=x?1:0;
else f[i]=a+1;
if(f[i]>=k) return 1;
T.modify(1,1,m,ppsw,f[i]);
}return 0;
}
void solve() {
read(n),read(k);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
int l=-2e14,r=1e9,ans=r;
while(l<=r) {
int mid=(l+r)>>1;
if(check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}write(ans);
}
signed main() {
int t;read(t);while(t--) solve();
return 0;
}
1006. Fansblog
挺无聊的题。。。考你会不会素数密度和威尔逊定理(这个名字也是我看了题解才知道的)。。
反正就是说对于一个素数\(p\),必然满足\((p-2)!\equiv 1\pmod p\)。
那么直接暴力就好了,我随便蒯了个我以前的\(\rm Miller\_robon\)的板子。
#include<bits/stdc++.h>
using namespace std;
#define int long long
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
const int maxn = 1e6+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7;
const int pri[] = {0,2,3,5,7,11,13,23,31};
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
int mul(int x,int y,int p) {
int t=(long double)x*y/p;
int res=x*y-t*p;res%=p;if(res<0) res+=p;
return res;
}
int qpow(int a,int x,int p) {
int res=1;
for(;x;x>>=1,a=mul(a,a,p)) if(x&1) res=mul(res,a,p);
return res;
}
bool MR(int n) {
if(n<2) return 1;
int e=(n-1)>>__builtin_ctz(n-1);
for(int i=1;i<=8;i++) {
if(pri[i]>=n) break;
for(int d=e,lst=qpow(pri[i],d,n),now;d!=n-1;d<<=1,lst=now) {
now=mul(lst,lst,n);
if(lst!=1&&lst!=n-1&&now==1) return 0;
}if(qpow(pri[i],n-1,n)!=1) return 0;
}return 1;
}
int p,q;
void solve() {
read(p);int ans=p-1;
for(int i=p-1;;i--) {
if(MR(i)) {break;}
ans=mul(ans,qpow(i,p-2,p),p);
}
write(ans);
}
signed main() {
int t;read(t);while(t--) solve();
return 0;
}
1011. Squrirrel
显然可以发现根定在直径上比较优。
那么直接\(dp\),随便找一条直径出来,\(f_{i,0/1}\)表示\(i\)子树有没有用过魔法的最大值,树\(dp\)完在链上差不多的\(dp\)一遍就好了,代码还挺难写的。
复杂度\(O(n)\)。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++)
const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7;
int dep[maxn],head[maxn],tot,n,nxt[maxn],id[maxn],vis[maxn],f[maxn][2],g[maxn][2],h[maxn][2],val[maxn],rt;
struct edge{int to,nxt,w;}e[maxn<<1];
void add(int u,int v,int w) {e[++tot]=(edge){v,head[u],w},head[u]=tot;}
void ins(int u,int v,int w) {add(u,v,w),add(v,u,w);}
void dfs(int x,int fa) {
if(dep[x]>dep[rt]) rt=x;nxt[x]=fa;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa) dep[e[i].to]=dep[x]+e[i].w,dfs(e[i].to,x);
}
void dp(int x,int fa) {
int mx1=0,mx2=0,ww,p;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa&&!vis[e[i].to]) {
dp(e[i].to,x);int t=f[e[i].to][0]+e[i].w;
f[x][0]=max(f[e[i].to][0]+e[i].w,f[x][0]);
if(t>=mx1) mx2=mx1,mx1=t,ww=e[i].w,p=e[i].to;
else if(t>mx2) mx2=t;
}
if(mx1==mx2) f[x][1]=f[x][0];
else f[x][1]=min(max(mx2,mx1-ww),max(mx2,f[p][1]+ww));
}
void solve() {
read(n);
for(int i=1,x,y,z;i<n;i++) read(x),read(y),read(z),ins(x,y,z);
dep[1]=0;dfs(1,0);int sz=0;dep[rt]=0;dfs(rt,0);
for(int u=rt;u;u=nxt[u]) id[++sz]=u,vis[u]=1;
for(int i=1;i<=sz;i++) dp(id[i],0);
g[1][0]=f[id[1]][0],g[1][1]=f[id[1]][1];
for(int i=2;i<=sz;i++) {
int ww;
for(int j=head[id[i-1]];j;j=e[j].nxt) if(e[j].to==id[i]) ww=e[j].w;//,printf("ww :: %d %d %d\n",id[i-1],id[i],ww);
g[i][0]=max(g[i-1][0]+ww,f[id[i]][0]);
g[i][1]=min(max(g[i-1][0],f[id[i]][0]),max(g[i-1][1]+ww,f[id[i]][0]));
g[i][1]=min(g[i][1],max(g[i-1][0]+ww,f[id[i]][1]));
}
h[sz][0]=f[id[sz]][0],h[sz][1]=f[id[sz]][1];int ans=1e9,p;
for(int i=sz-1;i;i--) {
int ww;
for(int j=head[id[i+1]];j;j=e[j].nxt) if(e[j].to==id[i]) ww=e[j].w;
h[i][0]=max(h[i+1][0]+ww,f[id[i]][0]);
h[i][1]=min(max(h[i+1][0],f[id[i]][0]),max(h[i+1][1]+ww,f[id[i]][0]));
h[i][1]=min(h[i][1],max(h[i+1][0]+ww,f[id[i]][1]));
}
for(int i=1;i<=sz;i++) {
//printf("%d ",id[i]);
// printf("%d %d %d\n",id[i],h[i][0],h[i][1]);
int tmp=min(max(g[i][0],h[i][1]),max(g[i][1],h[i][0]));
if(tmp<ans) ans=tmp,p=id[i];
}//puts("");
printf("%d %d\n",p,ans);
// write(ans);
}
void clear() {
for(int i=0;i<=n;i++) head[i]=g[i][0]=g[i][1]=h[i][0]=h[i][1]=f[i][0]=f[i][1]=vis[i]=0;
rt=tot=0;
}
int main() {
int t;read(t);while(t--) solve(),clear();
return 0;
}
HDU校赛 | 2019 Multi-University Training Contest 3的更多相关文章
- HDU校赛 | 2019 Multi-University Training Contest 6
2019 Multi-University Training Contest 6 http://acm.hdu.edu.cn/contests/contest_show.php?cid=853 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 http://acm.hdu.edu.cn/contests/contest_show.php?cid=852 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 4
2019 Multi-University Training Contest 4 http://acm.hdu.edu.cn/contests/contest_show.php?cid=851 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 http://acm.hdu.edu.cn/contests/contest_show.php?cid=849 100 ...
- HDU校赛 | 2019 Multi-University Training Contest 1
2019 Multi-University Training Contest 1 http://acm.hdu.edu.cn/contests/contest_show.php?cid=848 100 ...
- hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...
- HDU 6143 - Killer Names | 2017 Multi-University Training Contest 8
/* HDU 6143 - Killer Names [ DP ] | 2017 Multi-University Training Contest 8 题意: m个字母组成两个长为n的序列,两序列中 ...
- HDU 6074 - Phone Call | 2017 Multi-University Training Contest 4
看标程的代码这么短,看我的.... 难道是静态LCA模板太长了? /* HDU 6074 - Phone Call [ LCA,并查集 ] | 2017 Multi-University Traini ...
- HDU 6068 - Classic Quotation | 2017 Multi-University Training Contest 4
/* HDU 6068 - Classic Quotation [ KMP,DP ] | 2017 Multi-University Training Contest 4 题意: 给出两个字符串 S[ ...
随机推荐
- QTableWidget表格属性
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑 ui->tableWidg ...
- 开源一些C#不常用知识(附上DEMO)
序:这其实是一个广告贴. 正文:开源一些不常用的C#DEMO,这个是专门写成DEMO的样子,来供大家查阅,当然可以提出意见啥的.或者一些需要加入的DEMO,作者可以添加上. git地址:https:/ ...
- 4 Linux文件与目录管理
Linux的目录文件结构为树状结构,最顶级目录为根目录 / 其他目录通过挂载可以将他们添加到树中,通过解除挂载可以移除他们 绝对路径: 根目录开始 eg: /usr/share/doc 相对路径: 不 ...
- Zabbix监控服务器磁盘I/O
一.场景说明: 需要使用Zabbix监控服务器上各个磁盘的I/O使用率,当zabbix自身带的item无法满足我们的时候,则需自定义item. 包括: 磁盘读的次数 磁盘读的毫秒数 磁盘写的次 ...
- zabbix配置邮箱报警功能
1.查看是否安装mailx rpm -qa |grep mailx,本人机器上面已经安装如果没有安装直接用yum安装即可 yum -y install mailx2.vim /etc/mail.rc ...
- elasticsearch 索引和mapping导入导出命令
导mapping:elasticdump \ --input=http://192.168.102.13:9200/search_v1 \ --output=http://192.168.102.69 ...
- c++ c的拓展
C++对c的拓展之, 引用和const关键字 bool类型关键字 C++中的布尔类型 C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和false 理论上bool ...
- tf.Variable()、tf.get_variable()和tf.placeholder()
1.tf.Variable() tf.Variable(initializer,name) 功能:tf.Variable()创建变量时,name属性值允许重复,检查到相同名字的变量时,由自动别名机制创 ...
- 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式
一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...
- DCI学习链接及文章
https://www.jianshu.com/u/c1b1137d5886 李永顺 https://www.jianshu.com/users/7386692d5489/timeline 袁英杰 小 ...