T1谜题(nazo)

Problem Here

Solution

  1. 先把所有点的开关状态压成一个二进制数
  2. 按一个按钮就相当于异或上一个二进制数
  3. 显然不会按同一个按钮两次
  4. 枚举\(\left\lfloor\frac{n}{2}\right\rfloor\)个按钮每个按不按,计算只按前\(\left\lfloor\frac{n}{2}\right\rfloor\)个按钮得到每种状态的最少次数保存在map里
  5. 接着枚举后$ \left\lceil \frac{n}{2} \right \rceil $个按钮每个按不按,根据按的按钮的异或和到map里找到对应状态并更新答案

用hash表优化map,时间复杂度可优化到\(O( 2^{\frac{n}{2}})\)。

#include<bits/stdc++.h>
using namespace std;
inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 45
#define M 6233333
int n,m,ans=40;
long long t,res,opt[MN];
struct Map{struct edge{int nex,w;long long val;}e[M];int hr[M],cnt;inline int&operator[](long long x){register int i;for(i=hr[x%M];i;i=e[i].nex)if(e[i].val==x) return e[i].w;e[++cnt]=(edge){hr[x%M],0,x};hr[x%M]=cnt;return e[cnt].w;}
}mp;
int main(){
//  freopen("nazo.in","r",stdin);
//  freopen("nazo.out","w",stdout);n=read();m=read();register int i,j,x,y,step;for(i=0;i<n;i++) res^=((read()==0)*1ll)<<i,opt[i]|=1ll<<i;for(i=1;i<=m;i++) x=read()-1,y=read()-1,opt[x]|=1ll<<y,opt[y]|=1ll<<x;for(i=0;i<1<<n/2;i++){for(t=res,j=step=0;j<n/2;j++) if((i>>j)&1) t^=opt[j],step++;mp[t]=std::min(mp[t]?mp[t]:MN,step+1); }for(i=0;i<1<<n-n/2;i++){for(t=j=step=0;j<n-n/2;j++) if((i>>j)&1) t^=opt[n-j-1],step++;mp[t]?ans=std::min(ans,mp[t]+step-1):0; }return 0*printf("%d",ans);
}

T2染色(iro)

Problem Here

Solution

假设最后用了\(m\)种颜色,我们把这些颜色编号为\(1\)~\(m\)。

\(m\)显然存在一个下界,即每两个相邻节点的颜色数之和的最大值。

  1. 当\(n\)为偶数时,答案就是这个最大值。如果您直接输出它,您会获得40分
  2. 当n为奇数时,假设1号点的颜色为\(1\)~\(a_i\),那么我要使偶数点所取得颜色尽可能小,奇数点所取得颜色尽可能大,显然可以通过贪心来完成。

所以,二分答案加+贪心check,时间复杂度\(O(n\log n)\)

#include<bits/stdc++.h>
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 100005
#define mid (l+r>>1)
int n,a[MN],MIN;
inline bool check(int md){int x=a[2];for(int i=3;i<=n;i++){if(i&1){x=std::max(0,a[i]-md+a[1]+x);}else{x=std::max(0,a[i]-a[1]+x);}if(x==0) return 1;}return 0;
}
int main(){n=read();register int i;for(i=1;i<=n;i++) a[i]=read(),MIN=std::max(MIN,a[i]+a[i-1]);MIN=std::max(MIN,a[1]+a[n]);if(~n&1) return 0*printf("%d\n",MIN);int l=MIN,r=MIN<<1,ans;while(l<=r){if(check(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);return 0;
}

T201串(kushi)

Problem Here

Solution

首先有一个很好想得n方dp。——70分

注意到我们只关心后缀,所以可以用后缀来表示状态

\(dp_{i,j}\)表示前i个01串,其中一个子序列的末尾存在一个后缀等于j的最小答案。

\(dp_{i,j}\to dp_{i+1,j}\)有两种转移:

  1. 只要加上\(g(a_i,a_{i+1})\),可以直接加上这个值,若不执行该转移,将该值减去

  2. 枚举\(a_{i+1}\)的一个前缀p,求出\(min\{dp_{i,p}\}\),再枚举\(a_i\)的后缀\(u\),用\(min\{dp_{i,p}\}\)来更新\(dp_{i+1,u}\)

复杂度是\(O(nm)\).

//70分dp
#include<bits/stdc++.h>
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
inline int read01(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 1005
int ans,n,m,a[MN];
int cr[MN][MN],f[MN][MN];
inline void rw(int &i,int j){if(i<j) i=j;
}
int main(){freopen("kushi.in","r",stdin);freopen("kushi.out","w",stdout);n=read(),m=read();register int k,i,j;if(n>1000) return 0*puts("orz");for(i=1;i<=n;i++) a[i]=read01();for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)for(k=m;k>=0;k--)if((a[j]>>(m-k))==(a[i]%(1<<k))){cr[i][j]=k;break;}for(i=0;i<=n;i++)for(j=0;j<=n;j++)if(i!=j){if(i<j) rw(f[i][j+1],f[i][j]+cr[j][j+1]),rw(f[j+1][j],f[i][j]+cr[i][j+1]);else    rw(f[i+1][j],f[i][j]+cr[i][i+1]),rw(f[i][i+1],f[i][j]+cr[j][i+1]);}ans=0;for(i=0;i<n;i++) rw(ans,f[i][n]),rw(ans,f[n][i]);printf("%d\n",m*n-ans);return 0;
}
#include<bits/stdc++.h>
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 200005
#define inf (1e9)
char s[25];
int a[MN],f[25][1<<20],cr,res;
int main(){
//  freopen("kushi.in","r",stdin);
//  freopen("kushi.out","w",stdout);int n,m,i,j,k;n=read();m=read();for(i=1;i<=n;i++){scanf("%s",s+1);for(j=1;j<=m;j++) a[i]+=(s[j]=='0')<<j-1;}memset(f,67,sizeof f);f[0][0]=m;for(i=2;i<=n;i++){for(k=0;k<m;k++)if((a[i-1]>>k)==(a[i]&((1<<m-k)-1))) break;cr+=k;res=inf;for(j=0;j<=m;j++) res=std::min(res,f[m-j][a[i]&((1<<m-j)-1)]+j-k);for(j=0;j<=m;j++) f[m-j][a[i-1]>>j]=std::min(f[m-j][a[i-1]>>j],res);}res=inf;for(i=0;i<=m;i++)for(j=0;j<1<<i;j++) res=std::min(res,f[i][j]);printf("%d",res+cr);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/9538423.html

[20180826]四校联考相关推荐

  1. NOIP模拟赛 四校联考 递推 + 分类讨论 + 树上期望

    NOIP 模拟题 题目名称兔子被子蚊子 源程序文件名rabbit.cpp quilt.cpp mosquito.cpp 输入文件名rabbit.in quilt.in mosquito.in 输出文件 ...

  2. [四校联考P3] 区间颜色众数 (主席树)

    主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...

  3. [20190113]四校联考

    T1 数位DP,太菜了打挂只有10分-- Code //2019.1.14 12:25~12:47 PaperCloud #include<bits/stdc++.h> #define l ...

  4. [4.9福建四校联考]

    来自FallDream的博客,未经允许,请勿转载 奇怪的O(n)大赛,三道题数据都是几百万,真吓人. ------------------------------------------------- ...

  5. 2017-3-19四校联考

    T1输出0有20分结果我输出1爆0(题目说精度差为整数有40%的分数,结果告诉我只能差0.5--),T2打了20分暴力,T3交了个感觉能拿50分的结果是正解--被卡常了一个点,总分110/300 T1 ...

  6. 2/19 福建四校联考

    1.设计图案 给你一个n*m的矩阵,每个格子必须填或者不能填,要用环和1*2的小方块填满它,求方案数. 比如3*2,每个格子都必须填 有6种填法. n*m<=300 当时一看就觉得不可做然后就放 ...

  7. [20180812]四校联考

    T1 消失的无向图(missing) 题目描述 从前有一张n个点的无向图,边权都是正整数.但现在所有的边都消失了,只留下任意两点之间的最短路. 你现在想知道,所有边的边权和至少是多少. ​ 输入格式 ...

  8. [20180819]四校联考

    不要问我8.19的题为什么今天才写完,因为我弱啊 T1 扫雷(mine) Problem戳这里 Solution: 显然,\(ans = min_{i=1}^n \frac{bi}{ai}\),令cn ...

  9. 4246. 【五校联考6day2】san (Standard IO)

    4246. [五校联考6day2]san (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits D ...

最新文章

  1. 在iOS 8中使用UIAlertController
  2. 服务端高并发分布式架构演进之路【转】
  3. Tensorflow实例3: 验证码图片的识别训练,每张图片有4个字母
  4. oracle insert if语句怎么写,oracle存储过程的调用(insert 语句的存储过程)
  5. Android--OkHttp理解系列(一)
  6. Flex 常见问题解答(from MM)
  7. 总结get和post区别
  8. python不同曲线设置标签_【图像分类】基于Pascal VOC2012增强数据的多标签图像分类实战...
  9. LeetCode 665 非递减数列
  10. 如何使用Postman和Newman在CI环境中自动化REST API端到端测试
  11. 家族关系查询系统程序设计算法思路_七大查找算法(附C语言代码实现)
  12. Enfocus PitStop Pro 2021 for Mac(pdf增强插件)
  13. Office 2003如何打开后缀名为docx的Microsoft Word 文档
  14. windows设置cmd命令行背景为半透明
  15. 内存Available 是怎么计算的
  16. 读写三维数据.stl文件
  17. [UML]建模是什么?为什么要建模?
  18. 什么叫少儿机器人编程
  19. np.savetxt()和np.loadtxt()
  20. GIS--矢量数据,栅格数据,切片,瓦片,金字塔的概念

热门文章

  1. 小程序view设置背景图片_小程序商城分销功能设置技巧 设计方法
  2. YShout一款PHP+TXT+Ajax嵌入式在线聊天室源码
  3. html实现页面弹球,使用html+css+js实现弹球游戏
  4. java统计文件字符数量_Java统计文件注释个数和注释字符数
  5. 2020恩智浦智能车大赛规则_2020年世界人工智能围棋大赛落幕,各路围棋AI共同论道...
  6. js 判断移动端还是pc端,ios或者android
  7. 云开发无需服务期无需域名壁纸小程序源码
  8. 苹果cmsV10高仿草民电影网在线影视网站模板 带手机版
  9. PHP文字转语音合成网源码 百度API开发
  10. js底部广告飘窗代码