NOIP模拟测试38「金·斯诺·赤」
金
辗转相减见祖宗
高精
#include<bits/stdc++.h>
using namespace std;
#define A 2000
#define P 1
#define N 10
#define ll long long
ll n,T;
char sjdfj[A];
struct bignum
{
ll n[A],l;
bignum(){l=1,memset(n,0,sizeof(n));}
void clear(){while(l>1&&!n[l-1]) l--;}
void print(){
printf("%lld",n[l-1]);
for(ll i=l-2;i>=0;i--){
printf("%0*lld",P,n[i]);
}
printf("\n");
}
void read(){
l=0;
scanf("%s",sjdfj+1);
l=strlen(sjdfj+1);
reverse(sjdfj+1,sjdfj+l+1);
for(ll i=0;i<l;i++){
n[i]=sjdfj[i+1]-'0';
}
}
ll ok(){
//若为0 return1
//若%2==0 return2
//若%2!=0 return3
if(n[0]==0&&l==1) return 1;
// if(n[0]==1&&l==1) return 1;
if(n[0]%2==0) return 2;
if(n[0]%2!=0) return 3;
}
bool operator <(bignum x) const
{
bignum t=*this,tep;
if(t.l!=x.l) return t.l<x.l;
for(ll i=t.l-1;i>=0;i--)
{
if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
}
return 0;
}
bool operator >(bignum x) const
{
bignum t=*this;
if(t.l!=x.l) return t.l>x.l;
for(ll i=t.l-1;i>=0;i--)
{
if(t.n[i]!=x.n[i]) return t.n[i]>x.n[i];
}
return 0;
}
bignum operator -(bignum x) const
{
bignum t=*this;
if(t<x) swap(t,x);
ll jie=0;
// t.print();x.print();
for(ll i=0;i<t.l;i++)
{
t.n[i]-=x.n[i];
while(t.n[i]<0)
{
t.n[i]+=N;
jie++;
}
t.n[i+1]-=jie;
jie=0; }
while(!t.n[t.l-1]&&t.l>1) t.l--;
return t;
}
bignum operator *(bignum x) const{
bignum t=*this,tep;
tep.l=t.l+x.l+1;
for(ll i=0;i<t.l;i++)
for(ll j=0;j<x.l;i++){
tep.n[i+j]+=t.n[i]*x.n[j];
}
for(ll i=0;i<tep.l;i++){
if(tep.n[i]>=N)
{
tep.n[i+1]+=tep.n[i]/N;
tep.n[i]%=N;
}
}
tep.clear();
return tep;
}
bignum operator +(bignum x)const{
bignum t=*this;
if(t.l<x.l) t.l=x.l;
t.l++;
for(ll i=0;i<t.l;i++){
t.n[i]+=x.n[i];
if(t.n[i]>=N){
t.n[i+1]+=t.n[i]/N;
t.n[i]%=N;
}
}
t.clear();
return t;
}
bignum operator =(ll x){
l=0;
while(x){
n[l++]=x%N;
x/=N;
}
return *this;
}
bignum operator *(const ll &b){
bignum t=*this,r;
r.l=0;
ll g=0;
for(ll i=0;i<t.l||g;i++){
ll x;
if(i<t.l)
x=t.n[i]*b+g;
else x=g;
r.n[r.l++]=x%N;
g=x/N;
}
return r;
}
bignum operator /(const ll &x){
bignum t=*this,r;
ll tmp=0;
r.l=t.l;
for(ll i=t.l-1;i>=0;i--){
tmp+=t.n[i];
if(tmp>=x){
r.n[i]=tmp/x;
tmp%=x;
}
tmp*=N;
}
r.clear();
return r;
}
}a,b,c;
ll gcd(){
//若为0 return1
//若%2==0 return2
//若%2!=0 return3
while((a.ok()!=1&&b.ok()!=1)){
// printf("a=%lld ",a.ok());
// a.print();
// printf("b=%lld ",b.ok());
// b.print();
ll ok1=a.ok(),ok2=b.ok();
if(ok1==2&&ok2==2){
return 0;
a=a/2,b=b/2;
}
else if(ok1==3&&ok2==3){
if(a<b) swap(a,b);
a=a-b;
}
else if(ok1==2&&ok2==3){
a=a/2;
}
else if(ok1==3&&ok2==2){
b=b/2;
}
}
}
int main()
{/*1 1023 3072*/
// freopen("bf.txt","w",stdout);
scanf("%lld",&T);
for(ll i=1;i<=T;i++){
a.read(),b.read();
// a=a-b;
gcd();
// a.print(),b.print();
if(a.n[0]==0&&b.n[0]==1&&b.l==1&&a.l==1){
printf("Yes\n");
}
else if(a.n[0]==1&&b.n[0]==0&&b.l==1&&a.l==1){
printf("Yes\n");
}
else printf("No\n");
}
}
斯诺
考试代码改了改,数组开小见祖宗
考试时候$re$了


大概就是这样
考试时也维护的前缀和
$60\%$算法
只含$0,1$
我们可以将$0$看作减$1$,$1$看作加一
那么合法方案数就是$sum[r]-sum[l-1]==0$的个数
我们开一个桶存$sum[l]$,那么当前符合就是桶里$sum[i]$个数
查完个数再把$sum[r]$压进桶就行了
注意初始化,当你$sum==0$时也是合法方案,方案数为桶里$sum==0$个数$+1$,你可以先在桶里$0$压一个再进行操作
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 5000000
ll tong[mod+mod+mod+mod],sum[mod+mod][3],sumtp[21111111],sum2[111111111];
ll n,ans=0,all;
char a[mod+mod];
void solve(ll ql,ll qr){
if(ql==qr) return ;
ll mid=(ql+qr)>>1;
solve(ql,mid);solve(mid+1,qr);
ans=rand();
}
ll check(ll l,ll r){
ll len=(r-l+1)/2;
// printf("l=%lld r=%lld len=%lld\n",l,r,len);
// printf("sum0=%lld 1=%lld 2=%lld\n",sum[r][0]-sum[l-1][0],sum[r][1]-sum[l-1][1],sum[r][2]-sum[l-1][2]);
if(sum[r][0]-sum[l-1][0]>len) return 0;
if(sum[r][1]-sum[l-1][1]>len) return 0;
if(sum[r][2]-sum[l-1][2]>len) return 0;
return 1;
}
int main(){
scanf("%lld",&n);
scanf("%s",a+1);
all=1;
for(ll i=1;i<=n;i++){
sum[i][0]=sum[i-1][0];
sum[i][1]=sum[i-1][1];
sum[i][2]=sum[i-1][2];
if(a[i]=='0') sum[i][0]++;
if(a[i]=='1') sum[i][1]++;
if(a[i]=='2') sum[i][2]++,all=0;
}
if(all&&n>1000){
tong[mod]=1;
for(ll i=1;i<=n;i++){
sumtp[i]=sumtp[i-1];
if(a[i]=='0') {
// if(a[i-1]=='1') sumtp[i]=0;
// if(sumtp[i]<0) ans++;
sumtp[i]++;
}
else {
// if(a[i-1]=='0') sumtp[i]=0;
// if(sumtp[i]>0) ans++;
sumtp[i]--;
}
}
for(ll i=1;i<=n;i++){
ans+=tong[mod+sumtp[i]];
tong[mod+sumtp[i]]++;
// printf("sumtp=%lld\n",sumtp[i]); }
printf("%lld\n",ans);
return 0;
}
if(n<=1000)
for(ll i=1;i<=n;i++){
for(ll j=i+1;j<=n;j++){
if(check(i,j)){
ans++;
}
}
}
else solve(1,n);
printf("%lld\n",ans);
}
从$40\%$算法寻找思路
$60\%$算法$2$
维护三个$sum$,当为$0$,$sum[0]-- sum[1]++ sum[2]++$这样就又和上面类似了
然而合法方案数不止$sum[r]-sum[l-1]==0$
合法很难维护找非法的,最后答案就是合法减非法
发现非法$sum$相减肯定$<0$
那么就转化为逆序对问题
树状数组求逆序对
(其实你常数优秀可以$AC$
$100\%$算法
发现前后差异不大,假设你当前答案$1$为QAQ,若这一位仍为$1$,答案就要对应$-$,另外$2$,$0$答案就要$+$
NOIP模拟测试38「金·斯诺·赤」的更多相关文章
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- NOIP模拟测试30「return·one·magic」
magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...
- NOIP模拟测试9「随·单·题」
liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...
- NOIP模拟测试28「阴阳·虎·山洞」
写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...
- NOIP模拟测试20「周·任·飞」
liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...
- NOIP模拟测试23「mine·water·gcd」
mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...
- NOIP模拟测试16「Drink·blue·weed」
话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...
- NOIP模拟测试4「礼物·通讯·奇袭」
礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考 颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...
- [NOIP模拟测试38]题解
来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...
随机推荐
- Hive企业级性能优化
Hive作为大数据平台举足轻重的框架,以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一. 但是如果我们只局限于会使用Hive,而不考虑性能问题,就难搭建出一个完美的数仓,所以Hi ...
- 【Azure Redis 缓存】Azure Cache for Redis服务中,除开放端口6379,6380外,对13000,13001,15000,15001 为什么也是开放的呢?
问题描述 在使用安全检测工具对Azure Redis服务端口进行扫描时,发现Redis对外开放了13001, 13000,15000,15001端口.非常不理解的是,在门户上只开放了6379,6380 ...
- 通俗易懂的JS之Proxy
与掘金文章同步,地址:https://juejin.cn/post/6964398933229436935 什么是代理模式 引入一个现实生活中的案例 我们作为用户需要去如何评估一个房子的好坏.如何办理 ...
- istio部署问题Q&A
端口绑定无权限 创建Gateway,提示绑定端口无权限. 2020-12-27T12:25:30.974288Z warning envoy config gRPC config for type.g ...
- [bug] Maven:No valid Maven installation found.maven
原因 从别处复制来的项目,maven路径没有改过来 参考 https://blog.csdn.net/qq_40846086/article/details/81252736
- Docker——Tomcat JVM 内存配置
前言 安装再docker中的tomcat,在下载大文件或者某些情况下,会出现tomcat的内存溢出等情况,所以需要配置tomcat的内存大小,docker中的tomcat内存大小配置有四种方式. 一. ...
- Docker Swarm(九)资源限制
资源限制 docker run 針對限制容器資源有許多設置選項,但Swarm中的 docker service 是另一回事,目前只有cpu和memory的選項可以操作. 如果 docker 找不到足夠 ...
- Kubernetes 部署微服务电商平台(16)
一.概念 微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事.这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整 ...
- Docker镜像的仓库及底层依赖的核心技术(3)
一.docker镜像的仓库 仓库分为公共仓库和私有仓库 DockerHub的官方仓库:https://hub.docker.com DockerPool社区仓库:https://dl.dockerpo ...
- CSS 四种引入样式表优缺点分析
CSS 四种引入样式表 CSS 有四种方式引入样式表,如下: 外部样式表 内部样式表 行内样式表 导入样式表 外部样式表优缺点 优点 实现了结构与表现的代码完全分离 方便复用及维护 因为分离到各自独立 ...