求助卡常
  • 板块学术版
  • 楼主MYLHF
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/24 15:01
  • 上次更新2024/7/24 15:56:18
查看原帖
求助卡常
542505
MYLHF楼主2024/7/24 15:01

自已脑抽打了一个 动态开点二维树状数组。 题目P2487,求卡常。

//#pragma GCC optimize("unroll-loops,O2,O3,Ofast,inline")
#include<bits/stdc++.h>
#include<ext/pb_ds/hash_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
#define tpe double
typedef long long ll;namespace fastIO{bool IOerror=0;inline char nc(){static char buf[1000000],*p1=buf+1000000,*pend=buf+1000000;if(p1==pend){p1=buf;pend=buf+fread(buf,1,1000000,stdin);if(pend==p1){IOerror=1;return-1;}}return*p1++;}inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}inline void read(int&x){bool sign=0;char ch=nc();x=0;for(;blank(ch);ch=nc());if(IOerror)return;if(ch=='-')sign=1,ch=nc();for(;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0';if(sign)x=-x;}inline void read(ll&x){bool sign=0;char ch=nc();x=0;for(;blank(ch);ch=nc());if(IOerror)return;if(ch=='-')sign=1,ch=nc();for(;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0';if(sign)x=-x;}inline void read(double&x){bool sign=0;char ch=nc();x=0;for(;blank(ch);ch=nc());if(IOerror)return;if(ch=='-')sign=1,ch=nc();for(;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0';if(ch=='.'){double tmp=1;ch=nc();for(;ch>='0'&&ch<='9';ch=nc())tmp/=10.0,x+=tmp*(ch-'0');}if(sign)x=-x;}inline void read(char*s){char ch=nc();for(;blank(ch);ch=nc());if(IOerror)return;for(;!blank(ch)&&!IOerror;ch=nc())*s++=ch;*s=0;}inline void read(char&c){for(c=nc();blank(c);c=nc());if(IOerror){c=-1;return;}}struct Ostream_fwrite{char*buf,*p1,*pend;Ostream_fwrite(){buf=new char[1000000];p1=buf;pend=buf+1000000;}void out(char ch){if(p1==pend){fwrite(buf,1,1000000,stdout);p1=buf;}*p1++=ch;}void print(int x){static char s[15],*s1;s1=s;if(!x)*s1++='0';if(x<0)out('-'),x=-x;while(x)*s1++=x%10+'0',x/=10;while(s1--!=s)out(*s1);}void println(int x){static char s[15],*s1;s1=s;if(!x)*s1++='0';if(x<0)out('-'),x=-x;while(x)*s1++=x%10+'0',x/=10;while(s1--!=s)out(*s1);out('\n');}void print(ll x){static char s[25],*s1;s1=s;if(!x)*s1++='0';if(x<0)out('-'),x=-x;while(x)*s1++=x%10+'0',x/=10;while(s1--!=s)out(*s1);}void println(ll x){static char s[25],*s1;s1=s;if(!x)*s1++='0';if(x<0)out('-'),x=-x;while(x)*s1++=x%10+'0',x/=10;while(s1--!=s)out(*s1);out('\n');}void print(double x,int y){static ll mul[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000LL,100000000000LL,1000000000000LL,10000000000000LL,100000000000000LL,1000000000000000LL,10000000000000000LL,100000000000000000LL};if(x<-1e-12)out('-'),x=-x;x*=mul[y];ll x1=(ll)floor(x);if(x-floor(x)>=0.5)++x1;ll x2=x1/mul[y],x3=x1-x2*mul[y];print(x2);if(y>0){out('.');for(size_t i=1;i<y&&x3*mul[i]<mul[y];out('0'),++i);print(x3);}}void println(double x,int y){print(x,y);out('\n');}void print(char*s){while(*s)out(*s++);}void println(char*s){while(*s)out(*s++);out('\n');}void flush(){if(p1!=buf){fwrite(buf,1,p1-buf,stdout);p1=buf;}}~Ostream_fwrite(){flush();}}Ostream;inline void print(int x){Ostream.print(x);}inline void println(int x){Ostream.println(x);}inline void print(char x){Ostream.out(x);}inline void println(char x){Ostream.out(x);Ostream.out('\n');}inline void print(ll x){Ostream.print(x);}inline void println(ll x){Ostream.println(x);}inline void print(double x,int y){Ostream.print(x,y);}inline void println(double x,int y){Ostream.println(x,y);}inline void print(char*s){Ostream.print(s);}inline void println(char*s){Ostream.println(s);}inline void println(){Ostream.out('\n');}inline void flush(){Ostream.flush();}};using namespace fastIO;
#define rep(i,a,b) for(int i(a);i<=(b);++i)
#define REP(i,a,b) for(int i(a);i>=(b);--i)
using namespace std;
using namespace __gnu_pbds;

const int N=2e5 +7,M=1e9 +9,P=1.2e7;
int n,m,idx,h[N],v[N];
int f1[N],f2[N];
tpe g1[N],g2[N];
vector<int> pos,npm;
cc_hash_table<ll,ll> mp;

struct node{
    int h,v;
    bool operator < (const node &W) const { return h==W.h?v<W.v:h<W.h; }
}a[N];

    int tr[P];
	tpe cnt[P];
    inline int lowbit(int x) { return x&~x+1; }
    inline void add(int x,int y,int c,tpe cp)
    {
        for(int i(x);i<=n;i+=lowbit(i))
            for(int j(y);j<=n;j+=lowbit(j))
            {
            	int tp=mp[i*(n+1)+j];
                if(!mp[i*(n+1)+j]) mp[i*(n+1)+j]=(tp=++idx);

                if(tr[tp]<c) tr[tp]=c,cnt[tp]=cp;
                else if(tr[tp]==c) cnt[tp]+=cp;
            }
    }
    inline pair<int,tpe> ask(int x,int y)
    {
        int ret=0;
		tpe res=0;
        for(int i(x);i;i-=lowbit(i))
            for(int j(y);j;j-=lowbit(j))
            {
            	int tp=mp[i*(n+1)+j];
            	if(ret<tr[tp]) ret=tr[tp],res=cnt[tp];
            	else if(ret==tr[tp]) res+=cnt[tp];
			}
        return {ret,res};
    }

signed main()
{
	read(n);
    rep(i,1,n) read(a[i].h),read(a[i].v),npm.emplace_back(a[i].h),pos.emplace_back(a[i].v);

    sort(pos.begin(),pos.end()),pos.erase(unique(pos.begin(),pos.end()),pos.end());
    sort(npm.begin(),npm.end()),npm.erase(unique(npm.begin(),npm.end()),npm.end());
    rep(i,1,n) h[i]=lower_bound(npm.begin(),npm.end(),a[i].h)-npm.begin()+1;
    rep(i,1,n) v[i]=lower_bound(pos.begin(),pos.end(),a[i].v)-pos.begin()+1;

    REP(i,n,1)
    {
    	pair<int,tpe> X=ask(h[i],v[i]);
        f2[i]=X.first+1,g2[i]=X.second;
        !g2[i] ? g2[i]=1 : 0;
        add(h[i],v[i],f2[i],g2[i]);
    } rep(i,1,idx) tr[i]=cnt[i]=0; idx=0;
    rep(i,1,n) h[i]=n-h[i]+1,v[i]=n-v[i]+1; mp.clear();
    rep(i,1,n)
    {
    	pair<int,tpe> X=ask(h[i],v[i]);
        f1[i]=X.first+1,g1[i]=X.second;
        !g1[i] ? g1[i]=1 : 0;
        add(h[i],v[i],f1[i],g1[i]);
    } rep(i,1,idx) tr[i]=cnt[i]=0; idx=0; mp.clear();

    tpe tot=0,MX=*max_element(f1+1,f1+n+1);
    rep(i,1,n) if(f1[i]==MX) tot+=g1[i];

    println((int)MX);
    rep(i,1,n)
    {
    	if(f1[i]+f2[i]-1==MX) print((double)(g1[i]*g2[i]/(double)tot),4),print(' ');
    	else print("0.0000 ");
	}

	return 0;
}
2024/7/24 15:01
加载中...