题解

1330 条题解

  • 0
    @ 2017-07-07 20:15:45
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    const int mx = 500000 + 100;
    struct node{
        int l,r;
        long long lazy,sum;
    }tree[mx * 4];
    int a[mx];
    /*
        Segment-Tree Gerneral Tools
        **--Using Marco--**
        Marco l(seq)
            Get left Sequence Number
        Marco r(seq)
            Get Right Sequence Number
        Marco lt(seq)
            Get Left Tree
        Marco pt(seq)
            Get Present Tree
        Marco trlen(seq)
            Get Tree Length
        Marco trmid(seq)
            Get Middle Sequence Number
    */
    #define l(seq)  seq * 2
    #define r(seq)  l(seq) + 1
    #define lt(seq) tree[l(seq)]
    #define rt(seq) tree[r(seq)]
    #define pt(seq) tree[seq]
    #define trlen(seq)  (pt(seq).r - pt(seq).l + 1)
    #define trmid(seq)  (pt(seq).r + pt(seq).l)/2
    
    void PushUp(int seq){
        pt(seq).sum = lt(seq).sum + rt(seq).sum;
    }
    void PushDown(int seq){
        if (pt(seq).lazy){
            int lz = pt(seq).lazy;
            rt(seq).lazy += lz;
            lt(seq).lazy += lz;
            rt(seq).sum += lz * trlen(r(seq));
            lt(seq).sum += lz * trlen(l(seq));
            pt(seq).lazy = 0;
        }
    }
    void Build(int l,int r,int seq){
        pt(seq).l = l;
        pt(seq).r = r;
        if (l == r){
            pt(seq).sum = a[l];
            return;
        }
        int mid = (l + r)/2;
        Build(l,mid,l(seq));
        Build(mid + 1,r,r(seq));
        PushUp(seq);
    }
    void Update(int a,int b,int alt,int seq){
        int l = pt(seq).l,
            r = pt(seq).r;
        if (l == a && b == r){
            pt(seq).lazy += alt;
            pt(seq).sum += alt * trlen(seq);
            return;
        }
        PushDown(seq);
        int mid = trmid(seq);
        if (b <= mid)
            Update(a,b,alt,l(seq));
        else if (a > mid)
            Update(a,b,alt,r(seq));
        else{
            Update(a,mid,alt,l(seq));
            Update(mid + 1,b,alt,r(seq));
        }
        PushUp(seq);
    }
    long long Query(int a,int b,int seq){
        int l = pt(seq).l,
            r = pt(seq).r;  
        if (l == a && b == r){
            return pt(seq).sum;
        }
        PushDown(seq);
        int mid = trmid(seq);
        if (b <= mid){
            return Query(a,b,l(seq));
        }
        if (a > mid)
            return Query(a,b,r(seq));
        return Query(a,mid,l(seq)) + Query(mid + 1,b,r(seq));
    }
    int main(){
        for (int i = 1;i <= 2;i++)
            scanf("%d",&a[i]);
        Build(1,2,1);
        printf("%d\n",Query(1,2,1));
        return 0;
    }
    
  • 0
    @ 2017-07-06 17:44:12
    #include <bits/stdc++.h>
    using namespace std;
    
    int a, b;
    
    int main (int argc, char* argv[]) {
          cin >> a >> b;
            cout << a+b << endl;
            return 0;'
        }
    
  • 0
    @ 2017-07-06 10:53:59

    //读入优化
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int read()
    {
    int x=0;char c;int f=1;
    for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
    for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+c-'0';
    return x*f;
    }
    int a,b;

    int main()
    {
    a=read();
    b=read();
    cout<<a+b<<endl;
    }

  • 0
    @ 2017-07-01 18:48:19

    #include <stdio.h>
    int main()
    {
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);
    }

  • 0
    @ 2017-06-29 09:06:36

    一道最基本的入门题,是基础,很简单
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int main()
    {
    int n,m,k;
    cin>>n>>m;
    k=n+m;
    cout<<k;
    return 0;
    }

  • 0
    @ 2017-06-22 20:26:39

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b;
    return 0;
    }

  • 0
    @ 2017-06-22 20:25:44

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b;
    return 0;
    }

  • 0
    @ 2017-06-22 20:25:12

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b;
    return 0;
    }

  • 0
    @ 2017-05-29 19:06:27
    #include<iostream>
    using namespace std;
    
    int main()
    {
        int a,b;
            cin>>a>>b;
            cout<<a+b;
            return 0;
    }
    
  • 0
    @ 2016-12-14 13:14:54

    好长时间才做出来
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    char a1[10000],b1[10000];int a[10000],b[10000],c[10000],x=0,lena,lenb,lenc=1,i;
    int main()
    {
    scanf("%s",a1);scanf("%s",b1);lena=strlen(a1);lenb=strlen(b1);
    for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-'0';
    for(i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-'0';
    while(lenc<=lena||lenc<=lenb)
    {
    c[lenc]=a[lenc]+b[lenc]+x;
    x=c[lenc]/10;
    c[lenc]%=10;
    lenc++;
    }
    if(0==(c[lenc]=x)) lenc--;
    for(i=lenc;i>=1;i--) cout<<c[i];return 0;
    }

  • 0
    @ 2016-12-14 11:58:17

    高精度的代码,其实是比较暴力的高精,但是因为它小于等于2^15-1,所以没什么关系。
    我是通用性的高精度代码,所以数组开了10000.接下来就是——代码!

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    char a1[10000],b1[10000];int a[10000],b[10000],c[10000],x=0,lena,lenb,lenc=1,i;
    int main()
    {
    scanf("%s",a1);scanf("%s",b1);lena=strlen(a1);lenb=strlen(b1);
    for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-'0';
    for(i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-'0';
    while(lenc<=lena||lenc<=lenb)
    {
    c[lenc]=a[lenc]+b[lenc]+x;
    x=c[lenc]/10;
    c[lenc]%=10;
    lenc++;
    }
    if(0==(c[lenc]=x)) lenc--;
    for(i=lenc;i>=1;i--) cout<<c[i];return 0;
    }

    祝大家刷题快乐,从这里开始。

  • 0
    @ 2016-12-11 18:55:20

    以下题解不必去理解,为搜集到的大牛解法,当然,也有自己写的

  • 0
    @ 2016-12-11 18:53:55

    你们怎么能水过这题呢?

    这么好的一道网络流的题,应当用高标预流推进

    [/color][codec ]#include<bits/stdc++.h>
    using namespace std;
    #define set(x) Set(x)
    #define REP(i,j,k) for (int i=(j),_end_=(k);i<=_end_;++i)
    #define DREP(i,j,k) for (int i=(j),_start_=(k);i>=_start_;--i)
    #define debug(...) fprintf(stderr,__VA_ARGS__)
    #define mp make_pair
    #define x first
    #define y second
    #define pb push_back
    #define SZ(x) (int((x).size()-1))
    #define ALL(x) ((x).begin()+1),(x).end()
    template<typename T> inline bool chkmin(T &a,const T &b){ return a > b ? a = b, 1 : 0; }
    template<typename T> inline bool chkmax(T &a,const T &b){ return a < b ? a = b, 1 : 0; }
    typedef long long LL;
    typedef pair<int,int> node;
    const int dmax=1010,oo=0x3f3f3f3f;
    int n,m;
    int a[dmax][dmax] , ans;
    int d[dmax],e[dmax];
    priority_queue <node> q;
    inline bool operator >(node a,node b){ return a.y>b.y; }
    bool p[dmax];
    void Set(int x){ p[x]=1; }
    void unset(int x){ p[x]=0; }
    bool check(int x){ return x!=1 && x!=n && !p[x] && e[x]>0; }
    void preflow(){
    e[1]=oo;
    d[1]=n-1;
    q.push(mp(1,n-1));
    set(1);
    while (!q.empty()){
    bool flag=1;
    int k=q.top().x;
    q.pop(),unset(k);
    DREP(i,n,1)
    if ((d[k]==d[i]+1 || k==1) && a[k][i]>0){
    flag=0;
    int t=min(a[k][i],e[k]);
    e[k]-=t;
    a[k][i]-=t;
    e[i]+=t;
    a[i][k]+=t;
    if (check(i)){
    q.push(mp(i,d[i]));
    set(i);
    }
    if (e[k]==0) break;
    }
    if (flag){
    d[k]=oo;
    REP(i,1,n)
    if (a[k][i]>0)
    chkmin(d[k],d[i]+1);
    }
    if (check(k)){
    q.push(mp(k,d[k]));
    set(k);
    }
    }
    ans=e[n];
    }
    int main(){
    n = 2, m = 2;
    int x, y;
    scanf("%d%d", &x, &y);
    a[1][2] += x + y;
    preflow();
    printf("%d\n",ans);
    return 0;
    }
    [/codec ]

  • 0
    @ 2016-12-11 18:53:19

    program problem;
    var
    en,et,ec,eu,ep,ex:Array[0..250000] of longint;
    dis:array[0..1000] of longint;
    v:array[0..1000] of boolean;
    i,j,k,n,m,w,cost,l:longint;
    a,b,ans,left,right:longint;
    function min(a,b:longint):longint;
    begin
    if a<b then min:=a else min:=b
    end;
    procedure addedge(s,t,c,u,k:longint);
    begin
       inc(l);
       en[l]:=en[s];
       en[s]:=l;
       et[l]:=t;
       ec[l]:=c;
       eu[l]:=u;
       ep[l]:=l+k;
    end;
    procedure build(s,t,u,c:longint);
    begin
       addedge(s,t,c,u,1);
       addedge(t,s,-c,0,-1);
    end;
    function aug(no,m:longint):longint;
    var
    i,d:longint;
    begin
       if no=n then
         begin
         inc(cost,m*dis[1]);
         exit;
         end;
       v[no]:=true;
       i:=ex[no];
       while i<>0 do
         begin
         if (eu[i]>0)and not v[et[i]] and(dis[et[i]]+ec[i]=dis[no]) then
           begin
           d:=aug(et[i],min(m,eu[i]));
           if d>0 then
              begin
              dec(eu[i],d);
              inc(eu[ep[i]],d);
              ex[no]:=i;
              exit(d);
              end;
           end;
         i:=en[i];
         end;
       ex[no]:=i;
       exit(0);
    end;
    function modlabel:boolean;
    var
    d,i,j:longint;
    begin
       d:=maxlongint;
       for i:=1 to n do
         if v[i] then
           begin
           j:=en[i];
           while j<>0 do
              begin
              if (eu[j]>0)and not v[et[j]] and(ec[j]-dis[i]+dis[et[j]]<d) then
                 d:=ec[j]-dis[i]+dis[et[j]];
              j:=en[j]
              end;
           end;
       if d=maxlongint then exit(true);
       for i:=1 to n do
         if v[i] then
           begin
           v[i]:=false;
           inc(dis[i],d);
           end;
       exit(false);
    end;
    function work:longint;
    var i:longint;
    begin
    cost:=0;
    repeat
       for i:=1 to n do ex[i]:=en[i];
       while aug(1,maxlongint)>0 do
         fillchar(v,sizeof(v),0);
    until modlabel;
    work:=cost;
    end;
    function solve(x,d:longint):longint;
    var i,k,t,p,last,cost,lk:longint;
    begin
    fillchar(en,sizeof(en),0);
    fillchar(dis,sizeof(dis),0);
    k:=0; n:=2; t:=x; p:=0;
    while x<>0 do
       begin
       k:=k+x mod 10;
       x:=x div 10;
       inc(p);
       end;
    n:=1; x:=t; l:=k+p+1; last:=1; cost:=1; lk:=0;
    while x<>0 do
       begin
       k:=x mod 10;
       for i:=1 to k do
         begin
         inc(n);
         build(last,n,1,-cost);
         build(n,last+k+1,1,0);
         end;
       cost:=cost*10;
       inc(n);
       if last<>1 then
         begin
         if lk<k then
           build(1,last,k-lk,0);
         if k<lk then
           build(last,n,lk-k,0);
         end;
       last:=n; x:=x div 10;
       if lk<k then lk:=k;
       end;
    build(1,n,1,d);
    solve:=-work;
    end;
    begin
    readln(a,b);
    left:=1; right:=1000000000;
    while right-left>15000 do
       begin
       ans:=(left+right)shr 1;
       if solve(ans,b)>a then
         right:=ans
       else left:=ans;
       end;
    for i:=left to right do
       if solve(i,b)=a then
         begin
         writeln(i);
         halt;
         end;
    end.

  • 0
    @ 2016-12-11 18:52:46

    (此代码包括高精度运算,仅供参考)

    (变量在下面!!!)

    [hr ]

    (
    begin
    repeat
    inc(l1);
    read(ch[l1]);
    until eoln;
    for i:=1 to l1 do a[i]:=ord(ch[l1-i+1])-48;
    readln;
    repeat
    inc(l2);
    read(ch[l2]);
    until eoln;
    for i:=1 to l2 do b[i]:=ord(ch[l2-i+1])-48;
    if l1<l2 then l1:=l2;//加法运算要进行max(l1,l2)次,这里用l1保存运算次数
    for i:=1 to l1 do
    begin
    inc(c[i],a[i]+b[i]);//还要加上可能有的从低位进上来的值
    if c[i]>=10 then//进位
    begin
    dec(c[i],10);
    inc(c[i+1]);
    end;
    end;
    if c[l1+1]>0 then inc(l1);//检测最高位是否进位
    for i:=l1 downto 1 do write(c[i]);
    end.
    var i,l1,l2:longint;
    a,b,c:array [1..502] of longint;
    ch:array [1..502] of char;)

  • 0
    @ 2016-12-11 18:50:55

    最小生成树最好了

    #include <cstdio>
    #include <algorithm>
    #define INF 2140000000
    using namespace std;
    struct tree{int x,y,t;}a[10];
    bool cmp(const tree&a,const tree&b){return a.t<b.t;}
    int f[11],i,j,k,n,m,x,y,t,ans;
    int root(int x){if (f[x]==x) return x;f[x]=root(f[x]);return f[x];}
    int main(){
    for (i=1;i<=10;i++) f[i]=i;
    for (i=1;i<=2;i++){
    scanf("%d",&a[i].t);
    a[i].x=i+1;a[i].y=1;k++;
    }
    a[++k].x=1;a[k].y=3,a[k].t=INF;
    sort(a+1,a+1+k,cmp);
    for (i=1;i<=k;i++){
    // printf("%d %d %d %d\n",k,a[i].x,a[i].y,a[i].t);
    x=root(a[i].x);y=root(a[i].y);
    if (x!=y) f[x]=y,ans+=a[i].t;
    }
    printf("%d\n",ans);
    }

  • 0
    @ 2016-12-11 18:50:33

    Dijkstra+STL的优先队列优化。48ms.

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cctype>
    #include <climits>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <vector>
    #include <ctime>
    #include <string>
    #include <cstring>
    using namespace std;
    const int N=405;
    struct Edge {
    int v,w;
    };
    vector<Edge> edge[N*N];
    int n;
    int dis[N*N];
    bool vis[N*N];
    struct cmp {
    bool operator()(int a,int b) {
    return dis[a]>dis[b];
    }
    };
    int Dijkstra(int start,int end)
    {
    priority_queue<int,vector<int>,cmp> dijQue;
    memset(dis,-1,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dijQue.push(start);
    dis[start]=0;
    while(!dijQue.empty()) {
    int u=dijQue.top();
    dijQue.pop();
    vis[u]=0;
    if(u==end)
    break;
    for(int i=0; i<edge[u].size(); i++) {
    int v=edge[u][i].v;
    if(dis[v]==-1 || dis[v]>dis[u]+edge[u][i].w) {
    dis[v]=dis[u]+edge[u][i].w;
    if(!vis[v]) {
    vis[v]=true;
    dijQue.push(v);
    }
    }
    }
    }
    return dis[end];
    }
    int main()
    {
    int a,b;
    scanf("%d%d",&a,&b);
    Edge Qpush;

    Qpush.v=1;
    Qpush.w=a;
    edge[0].push_back(Qpush);

    Qpush.v=2;
    Qpush.w=b;
    edge[1].push_back(Qpush);

    printf("%d",Dijkstra(0,2));
    return 0;
    }

  • 0
    @ 2016-12-11 18:50:14

    5ms , 1371kb

    线段树走起

    附上在下65行线段树代码

    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    using namespace std;
    struct node{
    int val,l,r;
    };
    node t[5];
    int a[5],f[5];
    int n,m;
    void init(){
    for(int i=1;i<=2;i++){
    scanf("%d",&a[i]);
    }
    }
    void build(int l,int r,int node){//这是棵树
    t[node].l=l;t[node].r=r;t[node].val=0;
    if(l==r){
    f[l]=node;
    t[node].val=a[l];
    return;
    }
    int mid=(l+r)>>1;
    build(l,mid,node*2);
    build(mid+1,r,node*2+1);
    t[node].val=t[node*2].val+t[node*2+1].val;
    }
    void update(int node){
    if(node==1)return;
    int fa=node>>1;
    t[fa].val=t[fa*2].val+t[fa*2+1].val;
    update(fa);
    }
    int find(int l,int r,int node){
    if(t[node].l==l&&t[node].r==r){
    return t[node].val;
    }
    int sum=0;
    int lc=node*2;int rc=lc+1;
    if(t[lc].r>=l){
    if(t[lc].r>=r){
    sum+=find(l,r,lc);
    }
    else{
    sum+=find(l,t[lc].r,lc);
    }
    }
    if(t[rc].l<=r){
    if(t[rc].l<=l){
    sum+=find(l,r,rc);
    }
    else{
    sum+=find(t[rc].l,r,rc);
    }
    }
    return sum;
    }
    int main(){
    init();
    build(1,2,1);
    printf("%d",find(1,2,1));
    }

  • 0
    @ 2016-12-11 18:49:50

    见各位大神纷纷以流与树解题,本人不才,在此附上伪深搜算法;

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int d[3];
    int ans;
    void dfs(int x)
    {

    ans+=d[x];
    if(x==2)
    {
    printf("%d",ans);
    return ;
    }
    dfs(x+1);
    }
    int main()
    {
    for(int i=1;i<=2;i++)
    {
    scanf("%d",&d[i]);
    }
    dfs(1);
    return 0;
    }

  • 0
    @ 2016-12-11 18:48:51

    表示我稍微加上了一个读入和输出优化。。。。

    为什么要占坑呢,主要是发一下读入输出优化的代码

    顺便给新生们传授一下c++超快的读入输出方法。。。

    一般来说,c++有三种读入方式 scanf cin 以及读入优化。。。

    cin 在加上ios优化之前是很慢的 scanf其次 读入优化(read)最快

    以下是我做的测试数据

    当读入从1开始到10^7的数列数据时:

    cin耗时6.02s,scanf耗时2.23s,read只耗时0.58s

    同理 cont>scanf>输出优化

    对付大数据的题目这是可以用的(前提是数据输入输出都是纯数据,没有符号【包括英文字母】)

    新生可以先不用弄懂实现原理,直接背就行了。这些优化NOIP是可以用的。

    下面是代码
    */

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    int read(){
    int out=0,fh=1;
    char cc=getchar();
    if (cc=='-') fh=-1;
    while (cc>'9'||cc<'0') cc=getchar();
    while (cc>='0'&&cc<='9') {out=out*10+cc-'0';cc=getchar();}
    return out*fh;
    }
    void write(int x)

    {

    if (x==0){
    putchar('0');
    return;
    }
    int num = 0; char c[15];
    while(x) c[++num] = (x%10)+48, x /= 10;
    while(num) putchar(c[num--]);
    putchar(' ');
    }
    int main(){
    write(read()+read());
    return 0;
    }

信息

ID
1000
难度
9
分类
(无)
标签
(无)
递交数
75247
已通过
28778
通过率
38%
被复制
265