码蹄集 第十八周 周赛

跑图

#include<bits/stdc++.h> 

using namespace std;

const int M = 1e5+1;

struct point{
	int x = 0;
	int y = 0;
	int z = 0;
    // int max;
    // int end;
}p[M];

bool com(point p1, point p2){
    return p1.x < p2.x;
}

struct res{
    int end = 0;
    int len = 0;
}s[M];


int main(){
	int n,m;
	cin >> n >> m;
	int t, x, y ,z;
	for(int i=0;i<m;i++){
		cin >> t;
        p[t].x = t;
        cin >> y >> z;
        if(p[t].z < z){
            p[t].z = z;
            p[t].y = y;
         } 
	}
	
    for(int i=1;i<=n;i++){
        if(p[i].x != 0){
//            cout <<p[i].x << " " << p[i].y << " " << p[i].z << endl;
            cout  << p[i].y << " " << p[i].z << endl;
        }
        else{
            cout << 0 << endl;
        }
    }
	return 0;
}

还是跑图

#include<bits/stdc++.h> 

// 内部转换与空间顺序
using namespace std;

const int M = 1e5+1;

struct point{
	int x;
    int y;
    int z;
    int sum=0;
}p[M]; 

struct res{
	int start;
	int end;
}r[M];

bool com2(point p1, point p2){
    return p1.x < p2.x;
}

bool com3(res r1, res r2) {
	return r1.start < r2.start;
}

int main()
{
    int n, m;
    cin >> n >> m;
    int index;
    for(int i=0;i<m;i++){
        cin >> p[i].x >> p[i].y >>p[i].z;
        index = p[i].x;
        p[index].sum++;
    }

	int max = 0;
	int ans = 0;
	
	for(int i=0;i<m;i++){
		if(p[i].sum > max){
			max = p[i].sum;
			ans = i;
		}
	}
	
	sort(p,p+m, com2);
	int j=0;
	for(int i=0;i<m;i++){
		if(p[i].x == ans){
			r[j].start = p[i].y;
			r[j].end = p[i].z;
			j++;
		}
	}
	
	sort(r, r+j,com3);
	
	for(int i=1;i<j;i++){
		if(r[i-1].start==r[i].start && r[i-1].end > r[i].end) {
			int temp = r[i].end;
			r[i].end = r[i-1].end;
			r[i-1].end = temp;
		}
	}
	
	//	出边最多的节点 
	cout << ans << endl;
	
	for(int i=0;i<j;i++){
		cout << r[i].start << " " << r[i].end << endl;
	}
	
    return 0;
}

双端队列

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    deque<int> v;
    int m = 0;
    cin >> m;
    for(int i=0;i<m;i++){
        int n =0;
        cin >> n;
        int x = 0;
        if(n==1){
            cin >> x;
            v.push_front(x);
        }
        if(n==2){
            cin >> x;
            v.push_back(x);
        }
        if(n==3){
            cout << v.front() << endl;
        }
        if(n==4){
            cout << v.back() << endl;
        }
        if(n==5){
            v.pop_front();
        }
        if(n==6){
            v.pop_back();
        }
    }
    return 0;
}

找数字2

// 我坦白 这题copy的 才疏学浅 2006年 山东省选 洛谷2454 [SDOI2006]数字串位置

#include<iostream>
#include<fstream>
#include<sstream>
#include<stdlib.h>
#include<string.h>
#include<string>
using namespace std;
const int MAXL=200+50;
const int base=10;
class Bignum{
    public:
    int size,len; //len limits tostr()'s length
    int data[MAXL];
    friend ostream& operator<<(ostream& out,Bignum& a); 
    
    int& operator[](int x)
    {
        return data[x];
    }
    
    void add(Bignum b)
    {
        int maxsize=max(size,b.size);
        for(int i=0;i<maxsize;i++) data[i]+=b.data[i];
        for(int i=0;i<maxsize;i++){
            data[i+1]+=data[i]/base;
            data[i]%=base;
        }
        if (data[maxsize])  maxsize++;
        size=maxsize;
    }
    
    //assume this>b
    void minus(Bignum b)
    {
        for(int i=0;i<size;i++)
        {
            if(data[i]>=b[i]) data[i]-=b[i];
            else
            {
                data[i]=data[i]+base-b[i];
                data[i+1]--;    
            }
        }
        while(data[size-1]==0&&size) size--;
    }
    
    Bignum operator*(Bignum b)
    {
        Bignum c("0");
        int maxsize=size+b.size-1;
        for(int i=0;i<size;i++) for(int j=0;j<b.size;j++) c[i+j]=data[i]*b[j];
        for(int i=0;i<maxsize;i++){
            c[i+1]+=c[i]/base;
            c[i]%=base;
        }
        while(c[maxsize]){
            c[maxsize]+=c[maxsize-1]/base;
            c[maxsize-1]%=base;
            if(c[maxsize])  maxsize++;
            else    break;
        }
        c.size=maxsize;
        return c;
    }
    
    bool operator==(Bignum& b)
    {
        if(size!=b.size) return false;
        for(int i=0;i<size;i++) if(data[i]!=b[i]) return false;
        return true;
    }
    
    bool operator<(Bignum& b)
    {
        if(size!=b.size) return size<b.size;
        for(int i=size-1;i>=0;i--) if(data[i]!=b[i]) return data[i]<b[i];
        return false;
    }
    
    void operator=(Bignum b)
    {
        size=b.size;
        len=b.len;
        memset(data,0,sizeof(data));
        for(int i=0;i<size;i++) data[i]=b[i];
    }
    
    Bignum(string str)
    {
        size=len=str.size();
        memset(data,0,sizeof(data));
        for(int i=0;i<size;i++) data[size-i-1]=str[i]-'0';
    }
    
    Bignum()
    {
        size=len=0;
        memset(data,0,sizeof(data));
    }
    
    string tostr()
    {
        string s="";
        for(int i=len-1;i>=0;i--) s+=(data[i]+'0');
        return s;
    }
    
};
ostream& operator<<(ostream& out,Bignum& a)
{
    for (int i=a.size-1;i>=0;i--)   out<<a.data[i];
    return out;
}

int N,firsta=0;
string data;
Bignum ans,final;

string itoa(int a);
bool all9(Bignum& a);

int main()
{
    
    //cin>>data;
    cin>>data;
    N=data.size();
    
    if (data==string(N,'0')){
        data="1"+data;
        N++;
        firsta=1;
    }
    final=Bignum(data);
    
    /*2*/
    /*i=0?*/
    for (int i=1;i<(N+1)/2;i++)
    {
        if (data[i]=='0')   continue;
        for (int j=i;j+i<N;j++)
        {
            Bignum fir=Bignum(data.substr(0,i)),sec=Bignum(data.substr(i,j));
            
            Bignum seclast=Bignum(data.substr(j,i));
            fir.add(Bignum("1"));
            if (!(fir.tostr()==seclast.tostr()))    continue;
            
            Bignum tmpfi=sec;
            tmpfi.minus(Bignum("1"));
            if (final<tmpfi)    continue;
            
            fir=sec;
            bool ok=true;
            fir.add(Bignum("1"));
            int k,nxtwid=fir.size;
            /**/
            for (k=j+i;k+nxtwid<N;k+=nxtwid)
            {
                nxtwid=fir.size;
                sec=Bignum(data.substr(k,nxtwid));
                //cout<<"now ought to be:"<<fir<<" sec is:"<<sec<<endl;
                if (!(fir==sec)){
                    ok=false;break;
                }
                fir.add(Bignum("1"));
            }
            if (!ok)    continue;
            
            //fir.add(Bignum("1"));
            for (int p=fir.size-1;k!=N;k++,p--)
            {
                if (fir.data[p]!=(data[k]-'0')){
                    ok=false;break;
                }
            }
            if (!ok)    continue;
            final=tmpfi;firsta=j-i;
        }
    }
    /*2 over*/
    /*3*/
    for (int i=1;i<=N-1;i++)
    {
        if (data[i]=='0')   continue;
        Bignum tt(data.substr(0,i));
        tt.add(Bignum("1"));
        string strfir=tt.tostr(),strsec=data.substr(i);
        int l;
        /*l: pre and suf 's public string*/
        for (l=min(i,N-i);l>0;l--)
        {
            string pre=strfir.substr(0,l),suf=strsec.substr(N-i-l);
            if (pre==suf)   break;
        }
        Bignum tmp=Bignum(strsec+strfir.substr(l));
        tmp.minus(Bignum("1"));
        
        
        if (tmp<final){
            final=tmp;firsta=strsec.size()-l;
        }
    }
    /*3 over*/
    if (all9(final))    firsta--;
    if (final.size==1){
        //cout<<final<<endl;
        cout<<final<<endl;
        return 0;
    }
    
    /*calculate answer*/
    int wid=final.size;
    ans=Bignum(string(wid-1,'1'));
    
    Bignum pow("1");
    for (int i=0;i<wid-1;i++)   pow=pow*Bignum("10");
    
    pow=pow*Bignum(itoa(wid-1));
    pow.minus(ans);
    ans=pow;
    Bignum tmp=final;
    
    tmp.minus(Bignum("1"+string(wid-1,'0')));
    tmp=tmp*Bignum(itoa(wid));
    tmp.add(Bignum(itoa(firsta)));
    tmp.add(Bignum("1"));
    ans.add(tmp);
    //cout<<ans;
    cout<<ans<<endl;
return 0;
}

string itoa(int a)
{
    stringstream ss;
    ss<<a;
    string ret;
    ss>>ret;
    return ret;
}


bool all9(Bignum& a)
{
    for (int i=0;i<a.size;i++)
        if (a[i]!=9)    return false;
    return true;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值