辗转相减见祖宗

高精

#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 return3if(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 return3while((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");}
}

View Code

斯诺

考试代码改了改,数组开小见祖宗

考试时候$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);
}

View Code

从$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$答案就要$+$

转载于:https://www.cnblogs.com/znsbc-13/p/11480024.html

NOIP模拟测试38「金·斯诺·赤」相关推荐

  1. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  2. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  3. NOIP模拟测试21「折纸·不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  4. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  5. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

  6. NOIP模拟测试20「周·任·飞」

    liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...

  7. NOIP模拟测试23「mine·water·gcd」

    mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...

  8. NOIP模拟测试17「入阵曲·将军令·星空」

    入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...

  9. NOIP模拟测试16「Drink·blue·weed」

    话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...

最新文章

  1. 【人尽其才】颠覆思维☞合理分配工作
  2. 在云中进行灾难恢复的五种有效方式
  3. 【邀请函】2021钉钉宜搭·线上沙龙,邀您云上相见!
  4. java上传文件到ftp_java实现文件上传下载至ftp服务器
  5. 前端学习(2452):封装数据接口
  6. Snap svg:路径变换和相交计算
  7. 3.3.4.7. 模式匹配
  8. 金山网盾3.5实战流氓软件
  9. 详解 C++ 的隐式类型转换与函数重载!
  10. 三角数数列与杨辉三角
  11. java定义一个二维数组
  12. 用 O(1) 时间检测整数 n 是否是 2 的幂次。
  13. vc red.msi matlab,vc_red.msi
  14. axure原型怎么让文字自动换行_蓝湖 for Mac(自动切图sketch插件)
  15. 【NiosII训练】第二篇、FPGA驱动AD9854高级篇
  16. 深度神经网络的训练过程,深度神经网络如何训练
  17. redis 加锁新方法 - jedisCluster.set(key,value,NX,EX,expireSeconds);
  18. oracle 折旧公式,oracle FA_资产折旧 1.1.doc
  19. 全国计算机等级考试python试题_全国计算机等级考试二级Python真题及解析(5)
  20. 软件技术功能开发思路

热门文章

  1. 比特(bit)_二进制数
  2. 终端界面如何改成彩色的
  3. Java 中的自举类,到底是什么?
  4. g30u盘启动 中科曙光1620_I620-G30
  5. java事件编程_java基础 ---Swing事件编程
  6. linux useradd 数字,详解linux useradd用户组合权限管理等
  7. LeetCode 1021 删除最外层的括号
  8. C语言通过printf()设置输出显示方式
  9. 认识计算机系统反思,《计算机系统组成》教学反思
  10. php gd png透明,调整PNG大小并将其放在PHP / GD中较大的透明背景上?