csp-s模拟测试b组加餐antipalindome,randomwalking,string题解
题面:https://www.cnblogs.com/Juve/articles/11599318.html
antipalindome:
打表找规律?
对于一个回文串,我们只要保证3位以内不回文即可,即只要不出现三位以内回文就合法
对于前三位:m*(m-1)*(m-2),剩下的n-3个位置用m-2来填
所以$ans=m*(m-1)*(m-2)^(n-2)$,注意边界的判断
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int mod=1e9+7;
const int phi=1e9+6;
int t,n,m,ans=0;
int q_pow(int a,int b,int p){
a%=p;
(b+=(p-1))%=(p-1);
int res=1;
while(b){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res%p;
}
signed main(){
scanf("%lld",&t);
while(t--){
ans=0;
scanf("%lld%lld",&n,&m);
if(n==1){
printf("%lld\n",m%mod);
continue;
}else if(m==1){
puts("0");
continue;
}else if(m==2&&n==2){
puts("2");
continue;
}else{
ans=q_pow(m-2,n-2,mod)%mod;
for(int i=m;i>=m-1;--i){
(ans*=(i%mod))%=mod;
}
printf("%lld\n",ans);
}
}
return 0;
}
randomwalking:
树形dp,感觉它贼麻烦,博主也是不会了
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int MAXN=1e6+4;
const double inf=110000000000000000.0;
int n,a[MAXN],du[MAXN],ans;
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
void add(int u,int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
double f[MAXN],g[MAXN],minn=inf;
void dfs(int x,int fa){
f[x]=(double)a[x];
if(du[x]==1&&fa!=0){
return ;
}
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa) continue;
dfs(y,x);
if(fa!=0&&du[x]!=1) f[x]+=(double)f[y]/(double)((double)du[x]-1.0);
else f[x]+=(double)f[y]/du[x];
}
}
void DFS(int x,int fa){
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa) continue;
g[y]=(double)a[y];
double tmp1=(double)(g[x]-(double)a[x])*(double)du[x];
double tmp2=tmp1-f[y];
double tmp3=(double)(f[y]-(double)a[y])*(double)(du[y]-1.0);
if(du[x]>1) g[y]+=(double)(tmp2/(double)(du[x]-1.0)+(double)a[x]+tmp3)/(double)(du[y]);
else g[y]+=(double)((double)a[x]+tmp3)/(double)(du[y]);
DFS(y,x);
}
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
for(int i=1,u,v;i<n;++i){
scanf("%lld%lld",&u,&v);
add(u,v),add(v,u);
++du[u],++du[v];
}
dfs(1,0);
g[1]=f[1];
DFS(1,0);
minn=g[1],ans=1;
for(int i=1;i<=n;++i){
if(g[i]<minn){
ans=i;
minn=g[i];
}
}
printf("%lld\n",ans);
return 0;
}
string:
先翻转,然后用并差集维护相同颜色的位置
然后把k化成26进制数,对于不能确定的点用k的26进制数去确定
区间反转用平衡树
我们给 ′ a ′ 到 ′ z ′ 编号为 [1, 26] ,再给每个 ′ ? ′ 一个大于 26 的不同的标号,输入的串变成了一个这样的数字串,计
为 S .
我们直接对这个数字串去做操作,得到一个新的数字串,记为 T .
这件事就是这个经典的问题bzoj3223:Tyvj1729文艺平衡树.
直接把 S 和 T 的每一位用并查集并起来,表示这些标号所代表的字符一定是相同的.
如果一个联通块内包含至少一个字母,那么这个联通块的字符都确定了.
否则有 26 种可能,扫一遍直接分配即可.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int MAXN=5e5+5;
int n,m,k,l[MAXN],r[MAXN],b[MAXN];
char ch[MAXN];
bool pd[MAXN];
struct node1{
int val,pos;
}a[MAXN];
int fa[MAXN];
int find(int x){
return fa[x]=(fa[x]==x?x:find(fa[x]));
}
void merge(int x,int y){
x=find(x),y=find(y);
fa[max(x,y)]=min(x,y);
}
vector<int>v[MAXN];
int col[MAXN],tot=-1;
struct Node{
bool rev;
int s,h,v;
Node *l,*r;
}*root=0;
struct tbw{
Node *l,*r;
tbw(){}
tbw(Node *a,Node *b){l=a,r=b;}
};
int gets(Node *x){return x?x->s:0;}
void update(Node *x){x->s=gets(x->l)+1+gets(x->r);}
void rev(Node *x){
if(!x) return;
x->rev ^=1;
swap(x->l,x->r);
}
void down(Node *x){
if(x->rev) rev(x->l),rev(x->r),x->rev=0;
}
Node *merge(Node *a,Node *b){
if(!a) return b;
if(!b) return a;
if (a->h<b->h){
down(a);
a->r=merge(a->r,b);
update(a);
return a;
}
down(b);
b->l=merge(a,b->l);
update(b);
return b;
}
tbw split(Node *x,int k){
if(!x) return tbw(0,0);
down(x);
int tot=gets(x->l)+1;
if(k<tot){
tbw a=split(x->l,k);
x->l=a.r;
update(x);
return tbw(a.l,x);
}
tbw a=split(x->r,k-tot);
x->r=a.l;
update(x);
return tbw(x,a.r);
}
void insert(int v){
Node *x=new Node;
x->h=rand(),x->l=x->r=0;
x->v=v,x->s=1;
root=merge(root,x);
}
void rev(int l,int r){
tbw a=split(root,l-1);
tbw b=split(a.r,r-l+1);
rev(b.l);
root=merge(merge(a.l,b.l),b.r);
}
int num=0;
void print(Node *x){
if(!x) return;
down(x);
print(x->l);
b[++num]=x->v;
print(x->r);
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&k);
scanf("%s",ch+1);
for(int i=1;i<=n;++i){
fa[i]=a[i].pos=b[i]=i;
a[i].val=0;
if(ch[i]!='?'){
a[i].val=ch[i]-'a'+1;
pd[i]=1;
}
insert(i);
}
for(int i=1;i<=m;++i){
scanf("%lld%lld",&l[i],&r[i]);
rev(l[i],r[i]);
}
print(root);
for(int i=1;i<=n;++i){
merge(b[i],i);
}
for(int i=1;i<=n;++i){
int x=find(i);
v[x].push_back(i);
if(a[x].val!=0) col[x]=a[x].val;
else if(a[i].val!=0) col[x]=a[i].val;
}
for(int i=1;i<=n;++i){
int x=find(i);
if(col[x]==0) continue;
a[i].val=col[x];
}
for(int i=1;i<=n;++i){
if(col[i]==0&&v[i].size()!=0) ++tot;
}
for(int i=1;i<=n;++i){
int x=find(i);
if(a[i].val!=0) continue;
else if(x!=i) a[i].val=a[x].val;
else if(tot>13) a[i].val=1,--tot;
else{
int p=pow(26,tot--);
int x=k/p;
if(k%p) ++x;
a[i].val=x--;
k-=x*p;
}
}
for(int i=1;i<=n;++i){
putchar(a[i].val+'a'-1);
}
puts("");
return 0;
}
csp-s模拟测试b组加餐antipalindome,randomwalking,string题解的更多相关文章
- csps模拟测试74梦境,玩具,飘雪圣域题解
题面:https://www.cnblogs.com/Juve/articles/11679226.html 梦境: 其实还是挺水的,排序错了过不了样例,打了个二分图匹配就跑了 #include< ...
- Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)
目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...
- csp-s模拟测试95
csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 「CSP」第一届提高组考后总结
「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...
- 工厂模式模拟Spring的bean加载过程
一.前言 在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- 使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等,以及方法执行的坑或者模拟不成功解决
依赖:这个很重要,不同版本用法也有点区别: <dependency> <groupId>org.mockito</groupId> <artifactId&g ...
- Mac下Jmeter快速安装与入门-模拟测试Post请求及设置Http头
[1]去Apache官网下载 Binaries系列的最新Jmeter.gz包 [2]下载到本地之后解压缩,进入到解压之后的目录然后,找到apache-jmeter-4.0/bin/jmeter.sh ...
随机推荐
- XAMPP的安装及使用教程
https://blog.csdn.net/qq_36595013/article/details/80373597#3%E9%85%8D%E7%BD%AEapache
- (转)获取android手机内部存储空间和外部存储空间的参数 && 如何决定一个apk的安装位置
转:http://blog.csdn.net/zhandoushi1982/article/details/8560233 获取android文件系统的信息,需要Environment类和StatFs ...
- C语言结构体初始化方法
早上苏凯童鞋问我这个问题来着,写在这里. 我了解到的C中结构体初始化的方法大概有三种. 如这里我定义了一个结构体: typedef struct node { int x, y; }Node; 第一种 ...
- VS2008编译出现问题:error C2485: “__restrict”: 无法识别的扩展属性 解决办法
错误:Error3 error C2485: '__restrict' : unrecognized extended attribute f:\program files\microsoft vis ...
- CygWin、MinGw和Msys的区别
做了6年的Windows C++,觉得已经没什么挑战力:而且Windows C++已经没落,不得不转Linux C++: 习惯了Windows的界面,习惯了傻瓜式的VS IDE,现在遇到Linux命令 ...
- 创建自定义ssl证书用于https
这里,不探究证书原理.我们要完成的任务是,自己充当CA,然后签出证书供服务器使用. 本次教程是在windows实现,实验之前,确认自己的电脑中有openssl程序.如果没有,博主帮你准备了一个:htt ...
- Git 查看、删除、重命名远程分支
原文地址:http://blog.csdn.net/sunnyyoona/article/details/52065544 1. 查看远程分支 分支加上-a参数可以查看远程分支,远程分支会用红色表示出 ...
- iOS开发系列-NSURLSession
概述 NSURLSession是从iOS7开始出现的.NSURLSession比NSURLConnection简单很多并且避免了很多坑,因此目前公司项目大部分由NSURLConnection过度为NS ...
- Linux 下 Nand Flash 驱动主要数据结构说明
s3c2410 专有数据结构 s3c2410_nand_set struct s3c2410_nand_set { int nr_chips; /* 芯片 ...
- 那些使用VSCode写Python踩过的坑(Anaconda配置)
1. 如何在vscode上配置的配置方法请务必一定要直接参考官方文档Getting Started with Python in VS Code,不要去看什么杂七杂八的blog,要么过时要么不准确要么 ...