10分求助
查看原帖
10分求助
566190
我是歌者楼主2024/9/25 18:52
#include<bits/stdc++.h>
#define N 1e6+10
using namespace std;
namespace Octane {
    // non terrae plus ultra
    #define OCTANE
    #define BUFFER_SIZE 100000
    #define ll long long 
    #define db double
    #define ldb long double
    char ibuf[BUFFER_SIZE], obuf[BUFFER_SIZE];
    char *p1 = ibuf, *p2 = ibuf, *p3 = obuf;
    #ifdef ONLINE_JUDGE
        #define getchar() ((p1==p2)and(p2=(p1=ibuf)+fread(ibuf,1,BUFFER_SIZE,stdin),p1==p2)?(EOF):(*p1++))
        #define putchar(x) ((p3==obuf+BUFFER_SIZE)&&(fwrite(obuf,p3-obuf,1,stdout),p3=obuf),*p3++=x)
    #endif // fread in OJ, getchar in local

    #define isdigit(ch) (ch>47&&ch<58)
    #define isspace(ch) (ch<33&&ch!=EOF)
    
    const ll pow10[] = {
        (ll)1e0,  (ll)1e1,  (ll)1e2,  (ll)1e3,  (ll)1e4,  (ll)1e5, 
        (ll)1e6,  (ll)1e7,  (ll)1e8,  (ll)1e9,  (ll)1e10, (ll)1e11,
        (ll)1e12, (ll)1e13, (ll)1e14, (ll)1e15, (ll)1e16, (ll)1e17, (ll)1e18,
    };
    
    struct Octane_t {
        ~Octane_t() {
            fwrite(obuf, p3-obuf, 1, stdout);
        }
        bool flag = false;
        operator bool() {
            return flag;
        }
    }io;
    
    template<typename T> inline T read() {
        T s = 0; int w = 1; char ch;
        while(ch=getchar(), !isdigit(ch)&&(ch!=EOF))
            if(ch == '-') w = -1;
        if(ch == EOF) return 0;
        while(isdigit(ch))
            s = s*10+ch-48, ch=getchar();
        if(ch == '.') {
            ll flt = 0; int cnt = 0;
            while(ch=getchar(), isdigit(ch))
                if(cnt < 18) flt=flt*10+ch-48, cnt++;
            s += (db)flt/pow10[cnt];
        }
        return s *= w;
    }
    template<typename T> inline bool read(T &s) {
        s = 0; int w = 1; char ch;
        while(ch=getchar(), !isdigit(ch)&&(ch!=EOF))
            if(ch == '-') w = -1;
        if(ch == EOF) return false;
        while(isdigit(ch))
            s = s*10+ch-48, ch=getchar();
        if(ch == '.') {
            ll flt = 0; int cnt = 0;
            while(ch=getchar(), isdigit(ch))
                if(cnt < 18) flt=flt*10+ch-48, cnt++;
            s += (db)flt/pow10[cnt];
        }
        return s *= w, true;
    }
    inline bool read(char &s) {
        while(s = getchar(), isspace(s));
        return s != EOF;
    }
    inline bool read(char *s) {
        char ch;
        while(ch=getchar(), isspace(ch));
        if(ch == EOF) return false;
        while(!isspace(ch))
            *s++ = ch, ch=getchar();
        *s = '\000';
        return true;
    } 
    template<typename T> void print(T x) {
        static int t[20]; int top = 0;
        if(x < 0) putchar('-'), x = -x;
        do { t[++top] = x%10; x /= 10; } while(x);
        while(top) putchar(t[top--]+48);
    }
    struct empty_type{}; int pcs = 8;
    empty_type setpcs(int cnt) {
        return pcs = cnt, empty_type();
    }
    inline void print(empty_type x){}
    inline void print(double x) {
        if(x < 0) putchar('-'), x = -x;
        x += 5.0 / pow10[pcs+1];
        print((ll)(x)); x -= (ll)(x);
        if(pcs != 0) putchar('.');
        for(int i = 1; i <= pcs; i++)
        x *= 10, putchar((int)x+'0'), x -= (int)x;
    }
    inline void print(float x) {
        if(x < 0) putchar('-'), x = -x;
        x += 5.0 / pow10[pcs+1];
        print((ll)(x)); x -= (ll)(x);
        if(pcs != 0) putchar('.');
        for(int i = 1; i <= pcs; i++)
        x *= 10, putchar((int)x+'0'), x -= (int)x;
    }
    inline void print(char x) {
        putchar(x);
    }
    inline void print(char *x) {
        for(int i = 0; x[i]; i++)
            putchar(x[i]);
    }
    inline void print(const char *x) {
        for(int i = 0; x[i]; i++)
            putchar(x[i]);
    }
    
    // support for string
    #ifdef _GLIBCXX_STRING
    inline bool read(std::string& s) {
        s = ""; char ch;
        while(ch=getchar(), isspace(ch));
        if(ch == EOF) return false;
        while(!isspace(ch))
            s += ch, ch = getchar();
        return true;
    }
    inline void print(std::string x) {
        for(string::iterator i = x.begin(); i != x.end(); i++)
            putchar(*i);
    }
    inline bool getline(Octane_t &io, string s) {
            s = ""; char ch = getchar();
            if(ch == EOF) return false;
            while(ch != '\n' and ch != EOF)
                s += ch, ch = getchar();
            return true;
        }
    #endif 
    
    // support for initializer_list
    #if __cplusplus >= 201103L 
    template<typename T, typename... T1>
    inline int read(T& a, T1& ...other) {
        return read(a)+read(other...);
    }
    template<typename T, typename... T1>
    inline void print(T a, T1... other) {
        print(a); print(other...);
    }
    #endif 
    
    //  give up iostream
    template<typename T>
    Octane_t& operator >> (Octane_t &io, T &b) {
        return io.flag=read(b), io;
    }
    Octane_t& operator >> (Octane_t &io, char *b) {
        return io.flag=read(b), io;
    }
    template<typename T>
    Octane_t& operator << (Octane_t &io, T b) {
        return print(b), io;
    }

    #define cout io
    #define cin io
    #define endl '\n'
    #undef ll
    #undef db
    #undef ldb
    #undef BUFFER_SIZE
}
using namespace Octane;
struct node{
	int arrive;
	int leave;
}a1[100010],a2[100010],arr1[100010],arr2[100010];
bool cmp(node a,node b){
	return a.arrive<b.arrive;
}
int n,m1,m2,t,idex1=1,idex2=1,q1[100010],q2[100010];
int main(){
	cin>>n>>m1>>m2;
	for(int i=1;i<=m1;i++){
		cin>>a1[i].arrive;
		cin>>a1[i].leave;
	}
	for(int i=1;i<=m2;i++){
		cin>>a2[i].arrive;
		cin>>a2[i].leave;
	}
	sort(a1+1,a1+1+m1,cmp);
	sort(a2+1,a2+1+m2,cmp);	
	int max1=-1,max2=-1,flag1=-1,flag2=-1;
	for(int i=1;i<=m1;i++){
		arr1[i].leave=-1;
		arr1[i].arrive=0;
	}
	for(int i=1;i<=m2;i++){
			arr2[i].leave=0;
			arr2[i].arrive=0;
	}
/*	arr1[1].arrive=1;
	arr2[1].arrive=1;
	arr1[1].leave=a1[1].leave;
	arr2[1].leave=a2[1].leave;*/
	for(int i=1;i<=m1;i++){
		for(int j=1;j<=idex1;j++){
			if(arr1[j].leave<=a1[i].arrive){
				flag1=j;
				break;
			}
		}
		if(flag1!=-1){
			arr1[flag1].leave=a1[i].leave;
			arr1[flag1].arrive++;
			flag1=-1;
		}
		else if(flag1==-1){
			arr1[++idex1].leave=a1[i].leave;	
			arr1[idex1].arrive++;
		}
		flag1=-1;
	}
	
	for(int i=1;i<=m2;i++){
		for(int j=1;j<=idex2;j++){
			if(arr2[j].leave<=a2[i].arrive){
				flag2=j;
				break;
			}
		}
		if(flag2!=-1){
			arr2[flag2].leave=a2[i].leave;
			arr2[flag2].arrive++;
			flag2=-1;
		}
		if(flag2==-1){
			arr2[++idex2].leave=a2[i].leave;
			arr2[idex2].arrive++;	
		}
		flag2=-1;		
	}
	for(int i=1;i<=n;i++){
		q1[i]=q1[i-1]+arr1[i].arrive;
	}

	for(int i=1;i<=n;i++){
		q2[i]=q2[i-1]+arr2[i].arrive;
	}
	int maxans=-999999;
	for(int i=0;i<=n;i++){
		if(q1[i]+q2[n-i]>=maxans) maxans=q1[i]+q2[n-i];
	}
	cout<<maxans;
	return 0;
}

前面是抄的快读。 后面才是主要代码。

2024/9/25 18:52
加载中...