Codforces1181B 大数加法 Cdeque D树状数组

长为n数字 2-1e5
分成两部分不能有先导0 求和最小

 #include 
 #include 
 #include 
 using namespace std;
 int n;//接收数字位数
 string s;//接收数字
 vector vec;//来存值不为零的元素的索引
 string rm0(string a)//删除前导零
 {
     int i;
     for(i = 0;i=0;i--) //从低位到高位加
     {
         int sum = c+(int)a[i]-'0'+(int)b[i]-'0';
         if(sum>=10)
         {
             a[i] = (char)sum-10+'0';
             c = 1;
         }
         else
         {
             a[i] = (char)sum+'0';
             c = 0;
         }
     }
     a = rm0(a);
     return a;
 }
 int larger(string a,string b)//判断a是不是大于等于b
 {
     if(a.size()!=b.size())
     {
         return a.size()>b.size();
     }
     else
     {
         for(int i = 0;ib[i];
             }
         }
     }
     return 1;
 }
 int main()
 {
     cin >> n >> s;
     string a = "";
     string b = "";
     for(int i = 0;i

C数据结构 双端队列

#include
using namespace std;
typedef pair P;
const int maxn=1003,INF=1050000000;
char s[maxn];
int n,m;
long long ans;
deque

a[maxn]; bool valid(const deque

&q){ return q.size()==3&&q[0].second>=q[1].second&&q[1].second==q[2].second; } bool equal(const deque

&q1,const deque

&q2){ if(q2.size()!=3)return 0; for(int i=0;i<=2;i++)if(q1[i].first!=q2[i].first)return 0; return q1[1].second==q2[1].second&&q1[2].second==q2[2].second; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=m;j++){ if(a[j].size()>=1&&a[j].back().first==s[j])a[j].back().second++; else a[j].push_back(P(s[j],1)); while(a[j].size()>=2&&a[j].back().second>a[j][a[j].size()-2].second)a[j].pop_front(); if(a[j].size()>=4)a[j].pop_front(); } for(int l=1,r=1;r<=m;l=r){ for(;l<=m&&!valid(a[l]);l++); for(r=l;r<=m&&valid(a[r])&&equal(a[l],a[r]);r++); ans+=(long long)(r-l)*(r-l+1)/2; } } printf("%lld\n",ans); return 0; }

你可能感兴趣的:(大数)