uoj#750-[UNR #6]小火车【二分,折半,鸽笼原理】

正题

题目链接:https://uoj.ac/problem/750


题目大意

给出nnn个数字和一个ppp,保证2n>p2^n> p2n>p。现在要求一个序列www满足wi∈[−1,1]w_i\in[-1,1]wi[1,1],使得∑i=1nwiai≡0(modp)\sum_{i=1}^nw_ia_i\equiv 0\pmod pi=1nwiai0(modp)

1≤p<2n,1≤n≤40,0≤ai<p1\leq p<2^n,1\leq n\leq 40,0\leq a_i<p1p<2n,1n40,0ai<p


解题思路

我们考虑从数字集合SSS中找两个数字和相同的集合T1,T2T_1,T_2T1,T2,那么T1−T1∩T2T_1-T_1\cap T_2T1T1T2T2−T1∩T2T_2-T_1\cap T_2T2T1T2的和也相等,此时我们一边选111一边选−1-11即可,如果有一边是空的也行,这样另一边直接合法。

然后在SSS中选出集合的方案有2n2^{n}2n种,然后因为[0,p)[0,p)[0,p)有不超过这么多个数,所以肯定有重复的一个位置,所以肯定有解。

然后考虑怎么求这个解,看到这个范围我们考虑一下折半,我们搜出左右两边数字和的集合Sl,SrS_l,S_rSl,Sr

如果左边或者右边有重复的就直接结束先,这样我们就能保证左右没有重复了,此时我们需要找到a,b∈Sl,c,d∈Sra,b\in S_l,c,d\in S_ra,bSl,c,dSr,使得a+c=b+da+c=b+da+c=b+d,因为两个集合的都很大,这个看起来很不可做。

但是我们知道一定有解,这个条件肯定是有用的,我们考虑二分一下这个和。每次分割成左右两个区间[l,mid],[mid+1,r][l,mid],[mid+1,r][l,mid],[mid+1,r],我们求出有多少对x∈Sl,y∈Srx\in S_l,y\in S_rxSl,ySr满足x+y∈[l,mid]x+y\in[l,mid]x+y[l,mid],如果超过mid−l+1mid-l+1midl+1那么答案肯定在左区间,否则在右区间。

时间复杂度:O(2n2n)O(2^{\frac{n}{2}}n)O(22nn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const ll N=45,M=1<<20;
ll n,p,L1,L2,a[N];
map<ll,ll> mp;pair<ll,ll> f[M],g[M];
bool check(ll l,ll r){int L=0,R=0;ll ans=0;for(int i=L1-1;i>=0;i--){while(R<L2&&f[i].first+g[R].first<=r)R++;while(L<L2&&f[i].first+g[L].first<l)L++;ans+=R-L;}L=0;R=0;for(int i=L1-1;i>=0;i--){while(R<L2&&f[i].first+g[R].first-p<=r)R++;while(L<L2&&f[i].first+g[L].first-p<l)L++;ans+=R-L;}return ans>(r-l+1);
}
void solve(ll ansL,ll ansR){ll k=ansL&ansR;ansL-=k;ansR-=k;for(int i=0;i<n;i++){if((ansL>>i)&1)printf("1 ");else if((ansR>>i)&1)printf("-1 ");else printf("0 ");}return;
}
signed main()
{scanf("%lld%lld",&n,&p);for(ll i=0;i<n;i++)scanf("%lld",&a[i]);L1=(1<<n/2);for(int s=1;s<L1;s++){for(int i=0;i<n/2;i++)if((s>>i)&1)(f[s].first+=a[i])%=p;f[s].second=s;}L2=(1<<n-n/2);for(int s=1;s<L2;s++){for(int i=0;i<(n-n/2);i++)if((s>>i)&1)(g[s].first+=a[i+n/2])%=p;g[s].second=s;}sort(f+1,f+L1);sort(g+1,g+L2);for(int i=1;i<L1-1;i++)if(f[i].first==f[i+1].first){solve(f[i].second,f[i+1].second);return 0;}for(int i=1;i<L2-1;i++)if(g[i].first==g[i+1].first){solve(g[i].second<<(n/2),g[i+1].second<<(n/2));return 0;}ll l=0,r=p-1;while(l<r){ll mid=(l+r)>>1;if(check(l,mid))r=mid;else l=mid+1;}ll z=0,ansL=0,flag=0;for(int i=L1-1;i>=0;i--){while(z<L2&&f[i].first+g[z].first<r)z++;if(f[i].first+g[z].first==r){if(!flag)ansL=f[i].second+(g[z].second<<n/2),flag=1;else{solve(ansL,f[i].second+(g[z].second<<n/2));return 0;}}}z=0;for(int i=L1-1;i>=0;i--){while(z<L2&&f[i].first+g[z].first-p<r)z++;if(f[i].first+g[z].first-p==r){if(!flag)ansL=f[i].second+(g[z].second<<n/2),flag=1;else{solve(ansL,f[i].second+(g[z].second<<n/2));return 0;}}}//	for(ll i=0;i<L2;i++)mp[g[i]]=i+1;
//	for(ll i=0;i<L1;i++){
//		ll x=(l+p-f[i])%p;
//		if(mp[x]){
//			mp[x]--;
//			if(!mp[x]&&!i)continue;
//		}
//	}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sequence Pair Weight

Sequence Pair Weight 题意&#xff1a; 一个数组a&#xff0c;其中两个一样的数的贡献为1&#xff0c;问这个数组的所有子串的贡献和是多少? 题解&#xff1a; 举例&#xff1a; 对于[1&#xff0c;2&#xff0c;1&#xff0c;2&#xff0c;1&#xff0c;1&#xff0c;4]…

什么是量子计算机?用一个简单例子来解释

译者&#xff1a;王亮 作者&#xff1a;YK Sugi 原文&#xff1a;http://t.cn/EZAElk0Hi&#xff0c;大家好&#xff01;不久前&#xff0c;我参观了加拿大温哥华的D-Wave Systems公司&#xff0c;这是一家制造前沿量子计算机的公司。我在那里学到了很多关于量子计算机的知识&a…

CodeForces616:Educational Round 5

文章目录前言A Comparing Two Long Integers\text{A Comparing Two Long Integers}A Comparing Two Long IntegersDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeB Dinner with Emma\text{B Dinner with Emma}B Dinner with Emm…

CF1534F2-Falling Sand (Hard Version)

正题 题目链接:https://www.luogu.com.cn/problem/CF1534F2 题目大意 有一个n∗mn*mn∗m个网格&#xff0c;有的网格上有沙子&#xff0c;一个沙子被刷新后会下落到底并且刷新沿途中四周四连通的沙子&#xff0c;你可以选择一些沙子手动刷新。 现在要求第iii列至少有aia_iai…

数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

值域线段树势能线段树扫描线KiKis K-NumberballThe Child and Sequence「雅礼集训 2017 Day1」市场AtlantisKiKi’s K-Number HDU-2852 权值线段树维护插入删除很简单 对于查询大于xxx的第kkk个&#xff0c;可以不用二分&#xff0c;转化一下 先查小于等于xxx的个数cntcntc…

Codeforces Round #721 (Div. 2)

Codeforces Round #721 (Div. 2) 题号题目难度知识点AAnd Then There Were KBPalindrome Game (easy version)CPalindrome Game (hard version)DSequence Pair WeightEMEX TreeFPartition Game

解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

点击上方蓝字关注“汪宇杰博客”最近我遭遇了一个奇怪的问题。使用Azure DevOps配置CI/CD管线&#xff0c;自动部署到Azure App Service以后&#xff0c;.NET Core的网站竟然会启动失败。我们来看看如何解决这个问题。查找问题首先&#xff0c;幸好&#xff0c;这是个staging环…

CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/CF1286E 题目大意 定义一个字符串sss的权值为对于每个sL∼Rs1∼R−L1s_{L\sim R}s_{1\sim R-L1}sL∼R​s1∼R−L1​的区间&#xff0c;会产生min⁡iLRwi\min_{iL}^Rw_iminiLR​wi​的贡献。 现在开始时sss为空串&#xff0c…

模板:二维凸包(计算几何)

所谓凸包&#xff0c;就是一个凸出来的包 &#xff08;逃&#xff09; 前言 计算集合的第一课。 关键特征&#xff1a;周长最小。此时一定是凸包。 解析 定义 凸包&#xff1a;在平面上能包含所有给定点的最小凸多边形叫做凸包。 性质&#xff1a;凸包的周长是所有能包含给…

[AtCoder Beginner Contest 215] A-G题解

文章目录A - Your First JudgeB - log2(N)C - One More aab aba baaD - Coprime 2E - Chain ContestantF - Dist Max 2G - Colorful Candies 2atcoder题目链接 A - Your First Judge 签到题 #include <cstdio> #include <iostream> using namespace std; string…

Acwing 135 最大子序和

Acwing 135 最大子序和 题目&#xff1a; 输入一个长度为 n 的整数序列&#xff0c;从中找出一段长度不超过 m 的连续子序列&#xff0c;使得子序列中所有数的和最大。 题解&#xff1a; 我们把这个问题的集合分成n份&#xff0c;第k份表示以A[k]结尾的最大连续子序列是多少…

.net core自定义高性能的Web API服务网关

网关对于服务起到一个统一控制处理的作用&#xff0c;也便于客户端更好的调用&#xff1b;通过网关可以灵活地控制服务应用接口负载&#xff0c;故障迁移&#xff0c;安全控制&#xff0c;监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格&#xff0c;所以针对业…

微软宣布 Visual Studio 2019 将于4月2日正式发布

微软于去年发布了 Visual Studio 2019 预览版。今天&#xff0c;该公司宣布 Visual Studio 2019 正式版将于4月2日发布。微软在公告中表示&#xff1a;“欢迎加入我们在4月2号当天举办的 VS 2019 线上发布活动&#xff0c;这是一款更加现代化、创新且实用的生产力工具”。据悉&…

CF1427F-Boring Card Game【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1427F 题目大意 有一个1∼6n1\sim 6n1∼6n的序列&#xff0c;两个人轮流操作&#xff0c;每次取走连续的三个数字。 现在给出先手取走的数字集合&#xff0c;要求构造方案。 保证有解 1≤n≤2001\leq n\leq 2001≤n≤200…

模板:旋转卡壳(计算几何)

所谓旋转卡壳&#xff0c;就是旋转起来的卡壳 &#xff08;逃&#xff09; 前言 前置知识&#xff1a;凸包 个人感觉很像 two-pointers 算法。 能够在优秀的线性时间复杂度内完成总多求最值&#xff08;周长、面积…&#xff09;的神奇操作。 解析 给出情境&#xff1a; 给…

Acwing 1088.旅行问题

Acwing 1088.旅行问题 题目&#xff1a; 一个环形公路&#xff0c;由n个车站&#xff0c;每个站有若干升汽油&#xff08;有的站可能油量为零&#xff09;&#xff0c;每升油可以让汽车行驶一千米。 从某个车站出发&#xff0c;一直按顺时针&#xff08;或逆时针&#xff09;…

[AtCoder Regular Contest 125] A-F全题解

文章目录A - Dial UpB - SquaresC - LIS to Original SequenceD - Unique SubsequenceE - SnackF - Tree Degree Subset Sum网址链接A - Dial Up 签到题 特判一下有没有0/1在目标串中出现而没在原串出现 除了第一次0/1数字互换时&#xff0c;需要从a1a_1a1​左右找距离最近的…

DotNetty 实现 Modbus TCP 系列 (三) Codecs Handler

DotNetty 实现 Modbus TCP 系列 (一) 报文类DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例DotNetty 作为一个半成品&#xff0c;我们不需要关注细节的实现&#xff0c;只需要关注自己的业务即可&#xff0c;所以最主要的就是处理 Codecs 和 Handler。所有…

loj#2788-「CEOI2015 Day1」管道【树上差分】

正题 题目链接:https://loj.ac/p/2788 题目大意 给出nnn个点mmm条边的一张图&#xff0c;求它的所有割边。 1≤n≤105,1≤m≤61061\leq n\leq 10^5,1\leq m\leq 6\times 10^61≤n≤105,1≤m≤6106&#xff0c;内存限制16MB 解题思路 我们存不下所有的边&#xff0c;但是nnn很…

Acwing -- 单调队列优化的DP问题

文章目录引入acwing154 滑动窗口应用135 最大子序和1088.旅行问题AcWing 1087. 修剪草坪28AcWing 1089. 烽火传递AcWing 1090. 绿色通道AcWing 1091. 理想的正方形引入 acwing154 滑动窗口 题目链接 题解 应用 闫氏最优化问题分析法 135 最大子序和 题目&#xff1a; 输入…