CTSC2017密钥、吉夫特
自己是有多么sb。
密钥
大家都说这是一道普及-的题,一年前我做不起,我可以说我太弱啦,我就普及组水平,今年我还是做不起……
看大佬题解都是:开个桶就好啦!
我:你在说什么……
首先把环拉成链,倍长。
如果确定$i$这个位置是起始位置,那么特征值就是$\sum\limits_{j=1}^{n-1} (p_j!=0 , sum(A_{i+1}...A_{i+j})>0) $。
那么我们先记录一个前缀和,后面所提到的$A$都是前缀和。$\sum\limits_{j=1}^{n-1} (p_j!=0 , A_{i+j} > A_{i})$。
我们可以这样来考虑,我们把$A$看作高度,从左到右连起来看成折线,我每次在$A_{i}$高度处拉根线,比线高的,并且向上走的(就是p!=0),的折线的个数就是特征值
因为$A_i-A_{i-1}$要么是1要么是-1,所以我们每次减掉或者加上某一个取值的个数就可以了,所以这就是开个桶的意义。
然后如果$p!=0$是B的位置的时候,如果图不变,相当于比线低的,往下走的,的折线的个数,就是特征值,
然后因为折线起始点和终止点的高度都是拉的这根线的高度,
所以比线低的,往下走的,和比线低或者相等的,往上走的,是可以一一对应的,数目是相等的,
而比线低或者相等的,往上走的个数,就是k-比线高的,并且向上走的个数
我在说啥……
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=4e7+7;
int n,k,seed,now,S,p[maxn],cnt[maxn],A[maxn],ans1,ans2,ans3; char cc; ll ff;
template<typename T>void read(T& aa) {
aa=0;cc=getchar();ff=1;
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} int getrand(){
seed = ((seed * 12321) ^ 9999) % 32768;
return seed;
} void generateData(){
scanf("%d%d%d",&k,&seed,&S);
int t = 0;
n = k * 2 + 1;
memset(p, 0, sizeof(p));
for (int i = 1; i <= n; i++)
{
p[i] = (getrand() / 128) % 2;
t += p[i];
}
int i = 1;
while (t > k)
{
while (p[i] == 0)
i++;
p[i] = 0;
t--;
}
while (t < k)
{
while (p[i] == 1)
i++;
p[i] = 1;
t++;
}
} int main() {
generateData();
For(i,1,n) p[i+n]=p[i];
A[0]=n+1; For(i,1,n<<1) A[i]=A[i-1]+(p[i]? 1:-1);
For(i,1,n) if(p[i]) ++cnt[A[i]],now+=A[i]>A[0];
For(i,1,n) {
if(p[i]) {
now-=cnt[A[i]];//from A[i]-1 to A[i]
--cnt[A[i]];
++cnt[A[i+n]];
now+=A[i+n]>A[i];
}
else {
now+=cnt[A[i]+1];//from A[i]+1 to A[i]
if(now==0) ans1=i;
if(now==S) ans2=i;
if(now==k-S) ans3=i;
}
}
printf("%d\n%d\n%d\n",ans1,ans2,ans3);
return 0;
}
吉夫特
想了很久,还是只会n^2暴力,翻开洛谷题解:
what? 众所周知,只有我不知道?
知道这玩意就可以直接每次枚举子集啦,洛谷上是可以过的,但是bz上就要T掉啦。
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=3e5+7;
ll mod=1e9+7;
ll n,a[maxn],p[maxn],dp[maxn]; char cc; ll ff;
template<typename T>void read(T& aa) {
aa=0;cc=getchar();ff=1;
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} int main() {
read(n);
For(i,1,n) read(a[i]),p[a[i]]=i;
For(i,1,n) {
dp[0]+=dp[i]%=mod;
for(int j=a[i];j;j=(j-1)&a[i])
if(p[j]>i) dp[p[j]]+=dp[i]+1;
}
printf("%lld\n",dp[0]%mod);
return 0;
}
所以应该怎么办呢
我们如果枚举子集复杂度大约是3^18的,但是如果我们把18位分成两半,各9位,然后一个是求答案时枚举补集,一个是更新dp数组,枚举子集,就优秀多了
具体意思见代码
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=3e5+7,maxt=(1<<9)+7,U=(1<<9)-1;
ll mod=1e9+7;
ll n,o,x,y,dp[maxt][maxt],ans,now; char cc; ll ff;
template<typename T>void read(T& aa) {
aa=0;cc=getchar();ff=1;
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} void mo(ll& x) {if(x>=mod) x-=mod;} int main() {
read(n);
For(i,1,n) {
read(o); x=o>>9; y=o&U; now=0;
for(int j=x;j<=U;j=(j+1)|x) now+=dp[j][y];
now%=mod; ans+=now; now++; mo(now);
for(int j=y;;j=(j-1)&y) {
dp[x][j]+=now,mo(dp[x][j]);
if(j==0) break;
}
}
printf("%lld\n",ans%mod);
return 0;
}
CTSC2017密钥、吉夫特的更多相关文章
- bzoj 4900 [CTSC2017]密钥 模拟+乱搞
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4900 #include<cstring> #include<cmath&g ...
- 【BZOJ4903】【CTSC2017】吉夫特 [DP]
吉夫特 Time Limit: 15 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行一个整数n. 接下 ...
- 【LOJ】#2264. 「CTSC2017」吉夫特
题解 根据一番认真严肃的猜结论和打表证明之后 我们可以得到 \(f[i] = (\sum_{a[i] \& a[j] == a[j]} f[j]) + 1\) 统计所有的\(f[i] - 1\ ...
- 【BZOJ4903/UOJ300】【CTSC2017】吉夫特
Description 传送门 简述题意:给一个序列,询问有多少子序列满足其中不会出现\(a\choose b\)是偶数的情况,其中\(a\)在\(b\)前面. Solution 首先探究组合数的 ...
- bzoj4900 [CTSC2017]密钥
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4900 [题解] 恭喜bzoj达到40页 考场由于傻逼基数排序写挂了而gg. 竟然忘了考试前一 ...
- [CTSC2017]密钥
传送门:http://uoj.ac/problem/297 “无论哪场比赛,都要相信题目是水的” 这不仅是HNOI2018D2T3的教训,也是这题的教训,思维定势真的很可怕. 普及组水题,真是愧对CT ...
- [CTSC2017][bzoj4903] 吉夫特 [状压dp+Lucas定理]
题面 传送门 思路 一句话题意: 给出一个长度为 n 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 a和 b (b 在 a 前面),$C_a^b mod 2=1$,答案 ...
- uoj#300.【CTSC2017】吉夫特
题面:http://uoj.ac/problem/300 一道大水题,然而我并不知道$lucas$定理的推论.. $\binom{n}{m}$为奇数的充要条件是$n&m=n$.那么我们对于每个 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- Neo4j-Cypher语言语法
Neo4j-Cypher语言语法 梦飞扬 2018-03-15 264 阅读 Neo4j 本文是记录Neo4j图数据库中实用的Cypher语言语法. Cypher是什么 "Cypher&qu ...
- Ubuntu 卸载nvidia驱动
1.切换为集成显卡 如果没有,那么先切换到字符界面 2.卸载驱动 sudo apt-get --purge remove nvidia* sudo apt autoremove To remove C ...
- Store工作原理
- /etc/vimrc配置
[root@guolicheng ~]# cat /etc/vimrc if v:lang =~ "utf8$" || v:lang =~ "UTF-8$" s ...
- pickle序列化一个函数,将fun()存入文件
- Python-流程控制 if判断
目录 if 判断 语法 单分支结构 双分支结构 多分支结构 for循环 语法 for + break for + continue for + else range函数 for + if 练习 if ...
- ROS 日志消息(C++)
1.日志级别 日志消息分为五个不同的严重级别宏,与Android的Log定义的严重级别类似,如下基础宏: ROS_DEBUG_STREAM.ROS_INFO_STREAM.ROS_WARN_STREA ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--10--06CMDB测试Linux系统采集硬件数据的命令05
cd /py/AutoClient/bin python3 auto-client.py /usr/local/python3/bin/pip install requests python3 aut ...
- 强制以32位ie运行程序
最近被一个问题给郁闷住了.给电脑重装系统后,发现发布好的程序.或者VS2012总是以64位ie运行程序,这样的话skyline的三维控件无法显示.到现在我是确定ie64无法识别skyline的控件. ...
- 转:IO模型-- 同步和阻塞,异步和非阻塞的区别
源地址 http://hi.baidu.com/deep_pro/item/db0c581af1c1f17e7b5f2534 这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, ...