[34](CSP 集训)CSP-S 联训模拟 1

A 几何
重复若干次 -> 不能重叠,因此考虑直接暴力 DP
设 \(f_{i,j,k}\) 表示主串匹配到第 \(i\) 位(将前 \(i\) 位分别归为两类),其中 \(x\) 在重复了若干次后,又匹配到了第 \(j\) 位,\(y\) 在重复了若干次后,又匹配到了第 \(k\) 位
转移非常好写,枚举 \(i\),尝试把 \(s_{i}\) 分别与 \(x_{j},y_{k}\) 匹配,匹配上了就直接转移到 \(f_{i+1,j+1,k}(f_{i+1,j,k+1})\),或者在 \(j\operatorname{or}k=n\) 的时候直接赋成 \(0\)
复杂度是 \(O(nxy)\) 的,一算 \(10^{9}\),注意到这个东西完全不挂常数,考虑稍微优化一下
endl 改 \n,代码生下来常数就小的直接过了
否则的话考虑直接 bitset(能 bitset 是因为这题的 dp 数组全是 bool,转移也全是或运算),预处理出 \(x,y\) 中能参与 \(s_{i}\) 的转移的位置,然后直接 bitset 做就能砍到差不多 \(2\times 10^{8}\)
还过不了就是孩子代码一生下来常数就大
解决方案:手写一个用 ull 压
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3)
#define endl '\n'
int cases;
string s,x,y;
bool f[2][51][51];
// 0:x 1:y
int main(){
ios::sync_with_stdio(false);
freopen("geometry.in","r",stdin);
freopen("geometry.out","w",stdout);
cin>>cases;
while(cases--){
cin>>s>>x>>y;
f[0][0][0]=1;
for(int i=1;i<=(int)s.length();++i){
for(int j=0;j<=(int)x.length();++j){
for(int k=0;k<=(int)y.length();++k){
f[i&1][j][k]&=0;
}
}
for(int j=0;j<=(int)x.length();++j){
for(int k=0;k<=(int)y.length();++k){
if(j!=0 and s[i-1]==x[j-1]){
f[i&1][j!=(int)x.length()?j:0][k!=(int)y.length()?k:0]|=f[(i-1)&1][j-1][k!=(int)y.length()?k:0];
}
if(k!=0 and s[i-1]==y[k-1]){
f[i&1][j!=(int)x.length()?j:0][k!=(int)y.length()?k:0]|=f[(i-1)&1][j!=(int)x.length()?j:0][k-1];
}
}
}
}
if(f[((int)s.length())&1][0][0]==true){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
/*
abaaabbaab
1112112122
[1 0]
[2 0]
[3 0]
bbaabaabaaabaabaab
221111111121111111
[2,0]
bba
aab
*/
B
我说我的爆搜为什么不对,拉下来对拍拍出一组十字架图

因为我一开始觉得删边等于删点,所以我就每次路过把点删了,但是事实上不是这样,所以这题 \(n^{2}\) 的搜完全不可做
因为题目里这么走,相当于走了一个欧拉路,然而欧拉路是要求最多两个节点是奇点,因此考虑转移问题为使原图变为欧拉路
设 \(f_{i,0/1,0/1}\) 表示考虑到 \(i\) 和它的子树,\(i\) 自己是不是奇点,\(i\) 和 \(i\) 的子树里有没有奇点的最小花费,然后做树形 DP
首先,操作 \(A\) 相当于加重边,作用为可以使两边的节点中奇边变成偶边,偶边变成奇边,并且可以对两颗子树进行合并
假如我们把 \(j\) 合并到 \(i\) 上,合并后 \(j\) 就是 \(i\) 的子树,,设由 \(f_{i,k,l},f_{j,m,n}\) 转移,那么新的转移方程中的第三项就应该是 \(l\operatorname{or}m\operatorname{or}n\),即 \(i\) 和 \(j\) 只要有一个的子树存在奇点,那么合并后 \(i\) 的子树就存在奇点
接下来看 \(B\) 操作,考虑 \(B\) 的贡献变化量,有一结论使得 \(B\) 操作变化量与奇点数量变化量正相关,即 \(\lfloor\) 奇点数量除二 \(\rfloor\) 减一 \(=B\) 操作数量,不会证不放了
如果我们执行 \(B\) 操作的两个点都是奇点,那么直接瞬移,这两个点之间就不需要连边了,可以看成两个奇点都变成了偶点,所以 \(B\) 操作总数减一
如果两个点全是偶点,本来能自己过去,非要瞬移到另一边,现在过不去了,还要再瞬移回来,所以会让 \(B\) 操作加一
否则,实际上瞬移一下没啥变化,\(B\) 不变
统计答案的时候,原图可以是欧拉回路,或者可以存在两个奇点(此时需要一次瞬移),注意这个奇点不一定非要有一个在根节点上
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b;
vector<int>e[500001];
const int inf=LLONG_MAX/10;
int f[500001][2][2],g[2][2];
void dfs(int now,int last){
f[now][0][0]=0;
f[now][0][1]=inf;
f[now][1][0]=inf;
f[now][1][1]=inf;
for(int i:e[now]){
if(i!=last){
dfs(i,now);
for(int j=0;j<=1;++j){
for(int k=0;k<=1;++k){
g[j][k]=f[now][j][k];
f[now][j][k]=inf;
}
}
for(int j=0;j<=1;++j){
for(int k=0;k<=1;++k){
for(int l=0;l<=1;++l){
for(int m=0;m<=1;++m){
f[now][j][k|l|m]=min(f[now][j][k|l|m],g[j][k]+f[i][l][m]+a);
int cost=0;
if(!j and !l) cost=b;
else if(j and l) cost=-b;
f[now][1-j][k|(1-l)|m]=min(f[now][1-j][k|(1-l)|m],g[j][k]+f[i][l][m]+cost);
}
}
}
}
}
}
}
signed main(){
freopen("analyse.in","r",stdin);
freopen("analyse.out","w",stdout);
cin>>n>>a>>b;
for(int i=1;i<=n-1;++i){
int x,y;cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
cout<<min({f[1][0][0],f[1][1][1]-b,f[1][0][1]-b});
}
D 组合
神秘题,但是我觉得这个思路还是很好的
首先因为不会对你的询问返回答案,也就意味着没办法用类似二分的方法求解,否则会被卡成完全二叉树
题目让我们构造 \(m\) 个 \(N\) 位二进制数,考虑转化成 \(N\) 个 \(m\) 位二进制数,每次询问相当于询问一竖列
只考虑其中的三组二进制数,发现这三组有贡献的条件是两两位或结果不同,证明:设 \(a\operatorname{or}b=a\operatorname{or}c\),对于竖列的询问,若 \(a_i\operatorname{or}b_i=a_i\operatorname{or}c_i=1\),则对于任何一组询问都返回 \(1\),若 \(a_i\operatorname{or}b_i=a_i\operatorname{or}c_i=0\),则对于任何一组询问都返回 \(0\),没有区分的意义,所以要求全部二进制数两两位或运算不同
然后就到了神秘的地方,怎么构造这 \(N\) 个二进制数
STD 的做法是枚举 \(8\) 位和 \(9\) 位的二进制数(这里指的是二进制数中 \(1\) 的个数),暴力判断能不能放进去,能放就放
这个 \(8\) 和 \(9\) 太神秘了,不知道他咋出的,在 \(N=1000\) 的时候正好能卡到 \(m=26\),我改了参之后再跑,发现从 \(4\) 位开始跑贼慢,跑了三个小时才七百多个,从 \(15\) 位开始跑就莫名其妙寄了,好像是跑不出来答案卡死循环了
好在结论题比较好改
ADD: 其实这个 STD 挺好写的,__buildin_popcount() 是用来数二进制数里 \(1\) 的个数的,然后你开两个 vector 去存,每次都尝试从里面拿出一个塞到已有的数后面,不合法就扔掉,合法的判断直接扫一遍就行
STD
#include<bits/stdc++.h>
using namespace std;
int N = 20;
int a[1015];
bitset<1073741824> bk;
int main() {
int cur = 0;
vector<int> vec;
for (int i = 0; i < (1 << N); i++) {
if (__builtin_popcount(i) == 8)
vec.push_back(i);
}
for (int i = 0; i < (1 << N); i++) {
if (__builtin_popcount(i) == 9)
vec.push_back(i);
}
for (int i = 1; i <= 1010; i++) {
bool fl2 = 0;
for (auto t : vec) {
a[i] = t;
bool fl = 0;
for (int j = 1; j <= i; j++) {
if (bk[a[i] | a[j]] || (i != j && i <= 996 && __builtin_popcount(a[i] | a[j]) < 11)) {
fl = 1;
for (int k = 1; k < j; k++)
bk[a[i] | a[k]] = 0;
break;
}
bk[a[i] | a[j]] = 1;
}
if (fl)
continue;
fl2 = 1;
break;
}
if (!fl2) {
N++;
vec.clear();
for (int j = 0; j < (1 << N); j++) {
if (__builtin_popcount(j) == 8)
vec.push_back(j);
}
if (N >= 24) {
for (int j = 0; j < (1 << N); j++) {
if (__builtin_popcount(j) == 9)
vec.push_back(j);
}
}
if (N == 26) {
for (int j = 0; j < (1 << N); j++) {
if (__builtin_popcount(j) != 8 && __builtin_popcount(j) != 9)
vec.push_back(j);
}
}
i--;
continue;
}
cout << i << ' ' << N << endl;
if (N > 26) {
cur = i - 1;
break;
}
}
freopen("output.txt", "w", stdout);
for (int i = 1; i <= 1000; i++)
cout << a[i] << ',';
cout << endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[]; //自己去跑 STD
string to_binary(int x){
string ans;
while(x){
if(x&1) ans.push_back('1');
else ans.push_back('0');
x>>=1;
}
// cout<<"::"<<ans<<endl;
while(ans.size()<26) ans.push_back('0');
reverse(ans.begin(),ans.end());
return ans;
}
vector<string>ans(27);
int main(){
ofstream cth("combination.out");
for(int i=0;i<=999;++i){
string as=to_binary(a[i]);
// cout<<as<<endl;
for(int j=0;j<=25;++j){
ans[j].push_back(as[j]);
}
}
cth<<26<<endl;
for(int i=0;i<=25;++i){
cth<<ans[i]<<endl;
}
}
冬日绘版

[34](CSP 集训)CSP-S 联训模拟 1的更多相关文章
- CSP 201612-3 权限查询 【模拟+STL】
201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...
- 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场
第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...
- CSP -- 运营商内容劫持(广告)的终结者
缘由 我们公司最近手机端H5 经常受到商户和用户的投诉,说有广告并且导致不能正常进行操作,我们商户自己当然不会加广告了,但是商户和用户可不管这些了,就认为是我们的问题 探索发现根本 目前我们用的很多浏 ...
- Easyswoole的WaitGroup和Csp组件的分析和使用
Easyswoole的WaitGroup和Csp组件的分析和使用 easyswoole可真是个好名字,只是提供了恰到好处的封装,即使是源码也保持了这样的风格.这种风格不论好坏可能都需要各位适应下,哈哈 ...
- 2020 CSP&NOIP 游记
CSP初赛 CSP初赛 Day -1 早上打了模拟赛,T2寒假正好做过,然而还是还是被踩Orz,郑外NB!.中午出校吃了大盘鸡和拉面,还带回来了三瓶可乐. 初赛知识点看了两页不(看)想(不)看(懂)了 ...
- 前端安全配置之Content-Security-Policy(csp)
什么是CSP CSP全称Content Security Policy ,可以直接翻译为内容安全策略,说白了,就是为了页面内容安全而制定的一系列防护策略. 通过CSP所约束的的规责指定可信的内容来源( ...
- DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass
看到标题,是否有点疑惑 CPS 是什么东东.简单介绍一下就是浏览器的安全策略,如果 标签,或者是服务器中返回 HTTP 头中有 Content-Security-Policy 标签 ,浏览器会根据标签 ...
- CSP应用开发-CryptAPI函数库介绍
基本加密函数为开发加密应用程序提供了足够灵活的空间.所有CSP的通讯都是通过这些函数.一个CSP是实现所有加密操作的独立模块.在每一个应用程序中至少需要提供一个CSP来完成所需的加密操作.如果使用多于 ...
- xss小结-从xss平台搭建到csp规则
0x00前言 xss是跨站脚本攻击,利用嵌入js代码达到‘控制’对方浏览器的作用,测试的时候我们是用alert(1)弹窗,而做CTF也好,实际中的漏洞利用也好一般是用xss获取管理员的cookie 0 ...
- 前端内容安全策略(csp)
什么是CSP CSP全称Content Security Policy ,可以直接翻译为内容安全策略,说白了,就是为了页面内容安全而制定的一系列防护策略. 通过CSP所约束的的规责指定可信的内容来源( ...
随机推荐
- Arch Linux install i3-wm
Arch Linux install i3-wm 简介 i3-wm 是一种动态的平铺式窗口管理器,它的设计目标是提供一个快速.简洁.可定制的桌面环境,适合开发者和高级用户使用.它有以下几个特点: 它使 ...
- 15、SpringMVC之常用组件及执行流程
15.1.常用组件 15.1.1. DispatcherServlet DispatcherServlet 是前端控制器,由框架提供,不需要工程师开发: 作用:统一处理请求和响应,整个流程控制的中心, ...
- 【H5】12 表单 其一 第一个表单
本系列的第一篇文章提供了您第一次创建HTML表单的经验, 包括设计一个简单表单,使用正确的HTML元素实现它, 通过CSS添加一些非常简单的样式,以及如何将数据发送到服务器. HTML表单是什么? H ...
- Implementation of Reinforcement Learning with Meta-Critic Networks and GAE in a Human-Centered Framework
论文<Future of AI and Empowering Reinforcement Learning with Meta-Critic Networks and GAE in a Huma ...
- 大语言模型(LLM)运行报错:module ‘streamlit‘ has no attribute ‘chat_message‘
参考: https://blog.csdn.net/weixin_45748921/article/details/134645308 问题在于版本不匹配,深究一下为什么各个版本软件不匹配,发现原因是 ...
- 使用Typora编写后的md文件优雅的上传到博客(插件dotnet-cnblog的使用)
一.Typora的设置 如下图,设置图片上传位置 之后文章上的图片都会临时存放到文件同级目录下的xxx.Asster文件夹下面. 二.下载插件dotnet-cnblog 1.安装.Net Core S ...
- 10-canva绘制数据点
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- JavaScript 的优雅编程技巧:Singleton Pattern
JavaScript 的优雅编程技巧:Singleton Pattern 定义 单例模式:保证一个类仅有一个实例,并提供一个访问的全局访问点. 特点 仅有一个实例对象 全局都可访问该实例 主动实例化 ...
- ARM汇编:MRS和MSR指令
1.MSR和MRS指令介绍 MRS 指令: 对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...
- 2024-08-21:用go语言,给定一个从 0 开始索引的整数数组 nums 和一个整数 k,请设计一个算法来使得数组中的所有元素都大于或等于 k,返回所需的最少操作次数。 每次操作可以执行以下步骤
2024-08-21:用go语言,给定一个从 0 开始索引的整数数组 nums 和一个整数 k,请设计一个算法来使得数组中的所有元素都大于或等于 k,返回所需的最少操作次数. 每次操作可以执行以下步骤 ...