R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块
我好菜啊100+60+30
滚犊子吧,两天加起来才410搞个屁我一年前都可以考400
不说了,题毕竟比较难
T1还是水题但是比昨天难
这是一个开绝对值不等式的题。
根据对奇数和偶数的最优根的归纳一定有一个解是在原址上
于是上界OnLogn
水过
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef int INT;
#define int long long
const int N=2e5+100;
inline void read(int &x){x=0;char ch=getchar();int f=1;while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
int sum[N]={};
int a[N]={};
int n;
int ans=1e17+7;
INT main(){freopen("snake.in","r",stdin);freopen("snake.out","w",stdout);read(n);sum[0]=0;for(int i=1;i<=n;i++){read(a[i]);a[i]=a[i]-i;
// sum[i]=sum[i-1]+a[i];}sort(a+1,a+1+n);
// for(int i=1;i<=n;i++){
// cout<<a[i]<<" ";
// }for(int i=1;i<=n;i++){sum[i]=sum[i-1]+a[i];}
// ans=sum[n];for(int i=1;i<=n;i++){int tmp=(sum[n]-sum[i]-a[i]*(n-i))+(a[i]*i-sum[i]);
// cout<<i<<" "<<tmp<<'\n';ans=min(ans,tmp);}cout<<ans;return 0;
}
T2对我这种弱鸡来说就有点难度了
这是一个结论题
但是虽然我推出了重要结论但是还是没有满分
30分:枚举三个断点
重要结论:
枚举中间部分断点
左右两端寻找尽可能差小的答案值
显然sum的前缀和是单谷函数
你可以三分值或者二分一阶导函数
考试60分代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef int INT;
#define int long long
const int N=2e5+10;
inline void read(int &x){x=0;char ch=getchar();int f=1;while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
int a[N]={};
int sum[N]={};
int n;
int ans=1e17+9;
struct Node{int minsum,maxsum;
};
Node getsum(int L,int R){int l=L;int r=R;int ans=1e16+7;Node ret;ret.maxsum=-1;ret.minsum=1e17;for(int i=l;i<r;i++){if(ans>(abs((sum[i]-sum[L-1])-(sum[R]-sum[i])))){ans=abs((sum[i]-sum[L-1])-(sum[R]-sum[i]));
// cout<<i<<" "<<(sum[i]-sum[L-1])<<" "<<(sum[R]-sum[i])<<'\n';ret.maxsum=max((sum[i]-sum[L-1]),(sum[R]-sum[i]));ret.minsum=min((sum[i]-sum[L-1]),(sum[R]-sum[i]));}}return ret;
}
INT main(){freopen("scream.in","r",stdin);freopen("scream.out","w",stdout);read(n);for(int i=1;i<=n;i++){read(a[i]);sum[i]=sum[i-1]+a[i];}if(n<=300){for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){for(int k=j+1;k<n;k++){int maxsum=max(sum[i],max(sum[j]-sum[i],max(sum[k]-sum[j],sum[n]-sum[k])));int minsum=min(sum[i],min(sum[j]-sum[i],min(sum[k]-sum[j],sum[n]-sum[k])));ans=min(ans,maxsum-minsum);}}}cout<<ans;return 0; }else{if(n<=5000){for(int i=3;i<n;i++){Node tmpleft;tmpleft=getsum(1,i-1);Node tmpright;tmpright=getsum(i,n);int maxsum=max(tmpleft.maxsum,tmpright.maxsum);int minsum=min(tmpleft.minsum,tmpright.minsum);
// cout<<i<<" "<<maxsum<<" "<<minsum<<'\n';ans=min(ans,maxsum-minsum);}cout<<ans;return 0;}}
// cout<<a[n]return 0;
}
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef int INT;
#define int long long
const int N=2e5+10;
inline void read(int &x){x=0;char ch=getchar();int f=1;while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
int a[N]={};
int sum[N]={};
int n;
int ans=1e17+9;
struct Node{int minsum,maxsum;
};
Node getsuml(int L,int R){int l=L;int r=R-1;int ans=1e16+7;int s=sum[R]-sum[L-1];Node ret;while(l^r){int mid=(l+r)/2;if(abs(sum[mid]*2-s)<abs(ans*2-s))ans=sum[mid];if(sum[mid]*2<=s)l=mid+1;else r=mid;}if(abs(sum[l]*2-s)<abs(ans*2-s))ans=sum[l];ret.maxsum=max(s-ans,ans);ret.minsum=min(s-ans,ans);return ret;
}
Node getsumr(int L,int R){int l=L;int r=R-1;int ans=1e16+7;int s=sum[R]-sum[L-1];Node ret;while(l^r){int mid=(l+r)/2;if(abs((sum[n]-sum[mid])*2-s)<abs(ans*2-s))ans=sum[n]-sum[mid];if((sum[n]-sum[mid])*2<=s)r=mid;else l=mid+1;}if(abs((sum[n]-sum[l])*2-s)<abs(ans*2-s))ans=(sum[n]-sum[l]);ret.maxsum=max(s-ans,ans);ret.minsum=min(s-ans,ans);return ret;
}
INT main(){freopen("scream.in","r",stdin);freopen("scream.out","w",stdout);read(n);for(int i=1;i<=n;i++){read(a[i]);sum[i]=sum[i-1]+a[i];}for(int i=3;i<n;i++){Node tmpleft;tmpleft=getsuml(1,i-1);Node tmpright;tmpright=getsumr(i,n);int maxsum=max(tmpleft.maxsum,tmpright.maxsum);int minsum=min(tmpleft.minsum,tmpright.minsum);
// cout<<i<<" "<<maxsum<<" "<<minsum<<'\n';ans=min(ans,maxsum-minsum);}cout<<ans;return 0;
}
注意此处的二分写法新颖
实际乘二是指的右边除二
原理是我判断其离平均值有多近。
这等价于俩边之差更接近
T3
HDU5713 K个联通块
省选难度状压DP
你不能枚举边
但是枚举点的复杂度是可行的
于是思考一:状压DP
定义状态:
dp(i,j)i:当前有i个联通块 j:点集状态为j即一个状压状态0100101010之类的
f(i)i:一个状压状态表示该点集时可以断掉的边的种类使这个点集依旧连通
G(i)i:一个状压状态表示一个点集,目的是选择后断开(容斥原理)
用全集减补集求出F
考试30分代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int mod=1e9+9;
inline void read(int &x){x=0;char ch=getchar();int f=1;while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
const int N=20;
struct Front_star{int u,v,nxt,del;
}e[N*N];
int cnt=0;
int first[N]={};
void add(int u,int v){cnt++;e[cnt].u=u;e[cnt].v=v;e[cnt].nxt=first[u];e[cnt].del=0;first[u]=cnt;
}
int n,m,k;
int ans=0;
int fa[15]={};
inline int getfa(int x){if(fa[x]==x)return x;else return fa[x]=getfa(fa[x]);
}
inline void Union(int x,int y){int dx=getfa(x);int dy=getfa(y);fa[dy]=dx;
}
int check(){ for(int i=1;i<=n;i++){fa[i]=i;}for(int i=1;i<=cnt;i++){if(!e[i].del)Union(e[i].u,e[i].v);}for(int i=1;i<=n;i++){getfa(i);}sort(fa+1,fa+1+n);int len=unique(fa+1,fa+1+n)-fa-1;if(len==k){
// for(int i=1;i<=cnt;i++){
// cout<<e[i].u<<" "<<e[i].v<<" "<<e[i].del<<'\n';
// }
// cout<<"---------"<<'\n';return 1;}
// return 1;return 0;
}
void dfs(int tim){if(tim==cnt+1){ans+=check();ans=ans%mod;return; }
// if(tim>cnt)return;e[tim].del=1;dfs(tim+1);e[tim].del=0;dfs(tim+1);
}
int main(){freopen("sarsae.in","r",stdin);freopen("sarsae.out","w",stdout);read(n);read(m);read(k);for(int i=1;i<=m;i++){int u,v;read(u);read(v);add(u,v);}dfs(1);cout<<ans;return 0;
}
修改后代码
dp更新是一个背包原理
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef int INT;
#define int long long
inline void read(int &x){x=0;char ch=getchar();int f=1;while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
int f2[1000+20]={};
const int mod=1e9+9;
void Pre(){f2[0]=1;for(int i=1;i<=1000;i++){f2[i]=f2[i-1]*2%mod;}
}
const int N=15;
int n,m,k;
int maxn;
int dp[N][1<<N]={};
int f[1<<N]={};
int g[1<<N]={};
int vis[1<<N]={};
int fa[N]={};
inline int lowbit(int x){return x&(-x);
}
int getfa(int x){if(fa[x]==x)return fa[x];else return fa[x]=getfa(fa[x]);
}
void Union(int x,int y){int dx=getfa(x);int dy=getfa(y);fa[dx]=dy;
}
INT main(){
// freopen("sarsae.in","r",stdin);Pre();read(n);read(m);read(k);maxn=(1<<n)-1;for(int i=1;i<=m;i++){int u,v;read(u);read(v);u--;v--;for(int j=0;j<=maxn;j++){if((j&(1<<u))&&(j&(1<<v))){
// cout<<"working";f[j]++;}}Union(u,v);} for(int st=1;st<=maxn;st++){int minP=lowbit(st);int To=-1;int Fail=0;for(int j=0;j<n;j++){if((1<<j)&st){if(To==-1){To=getfa(j); }else{if(To!=getfa(j)){Fail=1;break;}}}}if(Fail)continue;else vis[st]=1;f[st]=f2[f[st]];g[st]=f[st];for(int j=st;j;j=(j-1)&st){if(j==st)continue;if(!vis[j])continue;if(j&minP){f[st]-=f[j]*g[j^st]%mod;f[st]%=mod;}}}
// for(int i=1;i<=maxn;i++){
// cout<<f[i]<<" ";
// }dp[0][0]=1;for(int i=1;i<=k;i++){for(int st=1;st<=maxn;st++){int p=lowbit(st);for(int sub=st;sub;sub=(sub-1)&st){if(!vis[sub])continue;if(p&sub){dp[i][st]+=dp[i-1][st^sub]*f[sub]%mod;dp[i][st]%=mod; } }}} cout<<(dp[k][maxn]+mod)%mod;
}
转载于:https://www.cnblogs.com/Leo-JAM/p/10079218.html
R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块相关推荐
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 【noip模拟赛4】Matrix67的派对 暴力dfs
[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- jyzy noip模拟赛5.22-2
不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...
- NOIP模拟赛csy2021/10/30
NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...
- 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告
[WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...
- NOIP 模拟赛 长寿花 题解
NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...
- 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)
[题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...
- 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】
蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料) 提取码:6666 2013年 ...
最新文章
- 教育部公布:清华北大等12校首批开设“未来技术学院”,它们都设置了哪些专业?...
- 【maven插件】versions-maven-plugin : 管理版本号
- pandas基础操作
- linux lvm 磁盘管理
- neo4j安装_怎样安装Neo4j APOC扩展包?
- python数组切片赋值_基于numpy中数组元素的切片复制方法
- Chrome浏览器的自动保存密码提示功能禁用方法
- 虚拟化服务器安装方法,Citrix Xenserver:7.0虚拟化服务器安装详细图文教程
- led数字字体_led电视质量排行榜
- 优思学院|精益生产的前世今生
- 上传图片保存到mysql数据库并在网页上显示
- 【机器学习】详解 TF-IDF 与 TF-IWF
- MATLAB | 绘图复刻(二) | 折线图+误差棒+柱状图+散点抖动+灰色背景+图片叠加
- JUC Striped64
- 一代王者回归?滴滴暂停563天,恢复新用户下载,江湖格局又生变
- SparkStreaming实时数仓——日活
- 世界杯“引爆”东南亚电商狂潮,电商人如何选品和营销?
- 入职腾讯第九年,我辞职了!
- 我的 2016 年总结
- springDataJpa入门教程(5)-单表动态条件查询+分页