# 10.27 考试

T1

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define rint register int
using namespace std;
{
x=0; int ff=1; char q=getchar();
while(q<'0'||q>'9') { if(q=='-') ff=-1; q=getchar(); }
while(q>='0'&&q<='9') x=x*10+q-'0',q=getchar();
x*=ff;
}
const int N=100006;
struct JI
{
int lx,ly,rx,ry;
}ji[N];
bool cmp_x(JI a,JI b)
{
if(a.lx==b.lx)
return a.ly<b.ly;
return a.lx<b.lx;
}
bool cmp_y(JI a,JI b)
{
if(a.ly==b.ly)
return a.lx<b.lx;
return a.ly<b.ly;
}

int n;
ll an,an2;

int er1(int x,int y,int l)
{
int r=n,mid,ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(ji[mid].lx>x)
r=mid-1;
else
if(ji[mid].lx<x)
l=mid+1;
else
{
if(ji[mid].ly<=y)
ans=mid,l=mid+1;
else
r=mid-1;
}
}
return ans;
}

int er2(int x,int y,int l)
{
int r=n,mid,ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(ji[mid].ly<y)
l=mid+1;
else
if(ji[mid].ly>y)
r=mid-1;
else
{
if(ji[mid].lx<=x)
ans=mid,l=mid+1;
else
r=mid-1;
}
}
return ans;
}

void work()
{
rint i,j;
int tt,q1,q2,q3,q4;
sort(ji+1,ji+1+n,cmp_x);
for(i=1;i<=n;++i)
{
tt=er1(ji[i].rx+1,ji[i].ry+1,i+1);
for(j=tt;j>i;--j)
{
if( ji[j].lx!=ji[i].rx+1 || ji[j].ry<ji[i].ly-1 )
break;
if(ji[j].ly>ji[i].ry)
{
if(ji[j].ly==ji[i].ry+1) ++an2;
continue;
}
if(ji[j].ry<ji[i].ly)
{
if(ji[j].ry==ji[i].ly-1) ++an2;
continue;
}
q1=min(ji[i].ly,ji[j].ly);
q2=q1^ji[i].ly^ji[j].ly;
q4=max(ji[i].ry,ji[j].ry);
q3=q4^ji[i].ry^ji[j].ry;
an+=1LL*(q3-q2)*2;
if(q1<q2) ++an;
if(q4>q3) ++an;
}
}
sort(ji+1,ji+1+n,cmp_y);
for(i=1;i<=n;++i)
{
tt=er2(ji[i].rx+1,ji[i].ry+1,i+1);
for(j=tt;j>i;--j)
{
if( ji[j].ly!=ji[i].ry+1 || ji[j].rx<ji[i].lx-1 )
break;
if(ji[j].lx>ji[i].rx)
{
if(ji[j].lx==ji[i].rx+1) ++an2;
continue;
}
if(ji[j].rx<ji[i].lx)
{
if(ji[j].rx==ji[i].lx-1) ++an2;
continue;
}
q1=min(ji[i].lx,ji[j].lx);
q2=q1^ji[i].lx^ji[j].lx;
q4=max(ji[i].rx,ji[j].rx);
q3=q4^ji[i].rx^ji[j].rx;
an+=1LL*(q3-q2)*2;
if(q1<q2) ++an;
if(q4>q3) ++an;
}
}
}

int main(){

//freopen("T1.in","r",stdin);
//freopen("ljh1.in","r",stdin);

rint i;

for(i=1;i<=n;++i)
{
an=an+1LL*(ji[i].ry-ji[i].ly)*(ji[i].rx-ji[i].lx)*2;
}
work();
cout<<an+an2/2;
}
T1

T2

1.这次操作的时间戳小于等于这个节点的k值所能到的最大时间戳 （dfs序，在用随便一个可持久化数据结构可以求出区间k大值）

2.这次操作的颜色必须是第一次出现

#pragma GCC optimize("O2")
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define rint register int
using namespace std;
{
x=0; int ff=1; char q=getchar();
while(q<'0'||q>'9') { if(q=='-') ff=-1; q=getchar(); }
while(q>='0'&&q<='9') x=x*10+q-'0',q=getchar();
x*=ff;
}
const int N=100006;
int first[N*2],nt[N*2],ver[N*2],e;
{
ver[e]=v;
nt[e]=first[u];
first[u]=e++;
}

int n,m,Q;
int maxk[N];
int limit[N],an[N];
int qi[N],ho[N],fa[N],nw,tim[N];
int pos[N];

map<int,int> mp[N];
vector<int> ji[N];

struct seg
{
int sz;
seg *ch[2];
seg(){sz=0;ch[0]=ch[1]=NULL;}
inline void pushup()
{
sz=0;
if(ch[0]!=NULL) sz+=ch[0]->sz;
if(ch[1]!=NULL) sz+=ch[1]->sz;
}
}*rt[N];
void addseg(int pos,int vv,int l,int r,seg *&x)
{
if(x==NULL) x=new seg();
if(l==r) { x->sz+=vv; return ; }
int mid=(l+r)>>1;
x->pushup();
}
void qqseg(int L,int R,int &an,int l,int r,seg *&x)
{
if(L>R) return ;
if(x==NULL) return ;
if(L<=l&&r<=R) { an+=x->sz; return ; }
int mid=(l+r)>>1;
if(L<=mid) qqseg(L,R,an,l,mid,x->ch[0]);
if(mid<R) qqseg(L,R,an,mid+1,r,x->ch[1]);
}

struct trie
{
int sum;
trie *ch[2];
trie(){ch[0]=ch[1]=NULL;sum=0;}
}*root[N];
{
root[order]=new trie();
root[order]->sum=root[order-1]->sum+1;
trie *pr=root[order-1],*now=root[order];
int tt,i;
for(i=30;i>=0;--i)
{
tt=((tim[order]&(1<<i))>>i);
now->ch[tt]=new trie();
now->ch[tt]->sum=pr->ch[tt]->sum+1;
now->ch[tt^1]=pr->ch[tt^1];
now=now->ch[tt]; pr=pr->ch[tt];
}
}
int qqtrie(int l,int r,int k)
{
if(l>r) return 0;
trie *pr=root[l-1],*now=root[r];
int i,ans=0,t0,t1,tt;
for(i=30;i>=0;--i)
{
t0=now->ch[0]->sum-pr->ch[0]->sum;
t1=now->ch[1]->sum-pr->ch[1]->sum;
if(!t0||!t1)
{
if(!t0&&!t1) return ans;
if(t0) tt=0;
else ans|=(1<<i),tt=1;
}
else
{
if(t0>=k) tt=0;
else ans|=(1<<i),tt=1,k-=t0;
}
now=now->ch[tt];
pr=pr->ch[tt];
}
return ans;
}

void dfs1(int x)
{
qi[x]=nw;
int i,sz=ji[x].size();
for(i=0;i<sz;++i)
tim[++nw]=ji[x][i];
for(i=first[x];i!=-1;i=nt[i])
{
if(ver[i]==fa[x])
continue;
fa[ver[i]]=x;
dfs1(ver[i]);
}
ho[x]=nw;
}

void get_limit()
{
rint i;

dfs1(1);
root[0]=new trie();
root[0]->ch[0]=root[0]->ch[1]=root[0];
root[0]->sum=0;
for(i=1;i<=n;++i)
{
if(maxk[i]==0)
limit[i]=0;
else
limit[i]=qqtrie(qi[i]+1,ho[i],maxk[i]);
}
}

map<int,int> :: iterator it;
void mer(int x,int y)
{
int clo;
for(it=mp[pos[x]].begin();it!=mp[pos[x]].end();++it)
{
clo=it->first;
if(!mp[pos[y]].count(clo))
else
if(mp[pos[y]][clo]>it->second)
}
}

void dfs(int x)
{
int i,t1,t2;
for(i=first[x];i!=-1;i=nt[i])
{
if(ver[i]==fa[x])
continue;
dfs(ver[i]);
t1=mp[pos[x]].size();
t2=mp[pos[ver[i]]].size();
if(t1>t2)
mer(ver[i],x);
else
mer(x,ver[i]),swap(pos[x],pos[ver[i]]);
}
qqseg(1,limit[x],an[x],1,m,rt[pos[x]]);
}

int main(){

//freopen("T2.in","r",stdin);
//freopen("T2.out","w",stdout);

rint i,j;

mem(first,-1);

int tin1,tin2;
for(i=1;i<n;++i)
{
}
for(i=1;i<=n;++i)
for(i=1;i<=m;++i)
{
ji[tin1].push_back(i);
if(!mp[tin1].count(tin2))
}
get_limit();
for(i=1;i<=n;++i) pos[i]=i;
dfs(1);
for(i=1;i<=Q;++i)
{
printf("%d\n",an[tin1]);
}
}
T2

T3

$$ans=\frac{C_{k}^{j}*(i-1)^{k-j}*m^{n-k}*w_i*(n-k+1)}{m^{n}}$$

i是枚举这一天的最大值，j是枚举最大值的个数

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define rint register int
using namespace std;
{
x=0; char q=getchar();
while(q<'0'||q>'9') q=getchar();
while(q>='0'&&q<='9') x=x*10+q-'0',q=getchar();
}
const int N=506;
const int mod=1000000007;
ll qpow(ll a,int ci)
{
ll ans=1;
while(ci)
{
if(ci&1)
ans=ans*a%mod;
a=a*a%mod;
ci>>=1;
}
return ans%mod;
}

int n,m,K;
int w[N];
ll C[N][N],mi[N][N];

int main(){

//freopen("T3.in","r",stdin);

rint i,j;

for(i=1;i<=m;++i)
if(n<K) { puts("0"); return 0; }
for(i=0;i<=K;++i)
{
C[i][0]=C[i][i]=1;
for(j=1;j<i;++j)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
//for(i=0;i<=m;++i)
//    mi[0][i]=1;
mi[0][0]=1;
for(i=1;i<=m;++i)
{
mi[i][0]=1;
for(j=1;j<=n;++j)
mi[i][j]=mi[i][j-1]*i%mod;
}
ll an=0;
for(i=1;i<=m;++i)
for(j=1;j<=K;++j)
an=(an+C[K][j]*mi[i-1][K-j]%mod*w[i]%mod)%mod;
an=an*mi[m][n-K]%mod*(n-K+1)%mod;
an=an*qpow(mi[m][n],mod-2)%mod;
cout<<an;
}
T3

posted @ 2017-10-28 21:20  A_LEAF  阅读(222)  评论(0编辑  收藏  举报