2018.11.01 练习赛


T1 【NOIP2018模拟】礼物

题解:

期望递推

\(code\):

#include
#include
#include
#include
#define ll long long
#define ld double
#define eps 1e-7
using namespace std;

char buf[1<<20],*p1,*p2;
inline char gc()
{
	return getchar();
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++;
}

template
inline void read(T &x)
{
	char tt;
	bool flag=0; 
	while(!isdigit(tt=gc())&&tt!='-');
	tt=='-'?(flag=1,x=0):x=tt^'0';
	while(isdigit(tt=gc())) x=(x<<1)+(x<<3)+(tt^'0');
}

const int maxn=21;
int n,w[maxn],tot;
ll ans;
ld f[1<>i&1)
		{
			t1+=p[i+1];
			t2+=p[i+1]*f[s^(1<

T2 【NOIP2018模拟】通讯

题解:

\(tarjan\)缩点贪心找所有点入边最短;

\(code:\)

找不到了qwq

T3 【NOIP2018模拟】奇袭

题解:

线段树维护,考虑每次移动的影响

\(code:\)

#include
#include
#include
#include
#define ll long long
using namespace std;

char buf[1<<20],*p1,*p2;
inline char gc()
{
//	return getchar();
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++;
}

template
inline void read(T &x)
{
	char tt;
	while(!isdigit(tt=gc()));x=tt^'0';
	while(isdigit(tt=gc())) x=(x<<1)+(x<<3)+(tt^'0');
}

ll n,mi[2400001],sum[2400001],lazy[2400001],M=1;
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)

void modify(int p,int l,int r,int x,int y,ll d)
{
	if(l==x&&r==y)
    {
        mi[p]+=d;
        lazy[p]+=d;
        return;
    }
    if(x<=mid) modify(ls,l,mid,x,min(y,mid),d);
    if( y>mid) modify(rs,mid+1,r,max(x,mid+1),y,d);
    if(mi[ls]==mi[rs])
    mi[p]=mi[ls]+lazy[p],sum[p]=sum[ls]+sum[rs];
    else
    {
        int t=mi[ls]mid) query(rs,mid+1,r,max(x,mid+1),y);
}

void maketree(int p,int l,int r)
{
	if(l==r)
	{
		mi[p]=0;
		sum[p]=1;
		return;
	}
	maketree(ls,l,mid);
	maketree(rs,mid+1,r);
	mi[p]=0;
	sum[p]=r-l+1;
}

int la,lb,posa[600001],posb[600001],a[600001],b[600001],s[600001];
int main()
{
	read(n);
	for(int i=1,x;i<=n;i++)
	read(x),read(s[x]);
	posa[0]=n+1;posb[0]=n+1;
	maketree(1,1,n);
	for(int i=n;i;i--)
	{
		while(la&&a[la]<=s[i])
        {
            modify(1,1,n,posa[la],posa[la-1]-1,s[i]-a[la]);
            --la;
        } 
        while(lb&&b[lb]>=s[i])
        {
            modify(1,1,n,posb[lb],posb[lb-1]-1,b[lb]-s[i]);
            --lb;
        }
        a[++la]=s[i];posa[la]=i;
        b[++lb]=s[i];posb[lb]=i;
        dep=0;
        query(1,1,n,i,n);
        modify(1,1,n,i,n,-1);
	}
	printf("%lld",ans);
}

T4 【SNOI2017 DAY1】炸弹

题解:

线段树优化建图,\(tarjan\)缩点,然而可以\(O(N)\)扫过去记录左右最大;

\(code:\)

#include 
#include 
#include 
#include
#define ll long long
using namespace std; 

const int mod=1e9+7;
char buf[1<<20],*p1,*p2; 
inline char gc() 
{ 
//    return getchar(); 
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++; 
} 

template 
inline void read(T &x) 
{ 
    char tt;
    bool flag=0;
    while(!isdigit(tt=gc())&&tt!='-');
	tt=='-'?(flag=1,x=0):(x=tt^'0'); 
    while(isdigit(tt=gc())) x=(x<<1)+(x<<3)+(tt^'0'); 
    if(flag) x=-x;
} 

ll n,x[500005],R[500005],l[500005],r[500005],ans;
main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld%lld",&x[i],&R[i]),l[i]=r[i]=i;
    for(int i=1;i<=n;i++) 
    while(l[i]>1&&x[i]-x[l[i]-1]<=R[i])
    l[i]=l[l[i]-1],R[i]=max(R[i],R[l[i]]-(x[i]-x[l[i]]));
    for(int i=n;i>=1;i--) 
    while(r[i]

T5 最后战役

题解:

神仙题,期望递推

\(code:\)

待补

T6 分成互质组

题解:

状压,\(O(N^2)\)枚举两两关系,\(g[S]\)数组维护其中元素的合法性,状态转移:\(F[S]=min\{F[S']+1\}(g[S \bigoplus S']==1)\)

\(code:\)

#include
#include
#include
using namespace std;

int n;
int a[20],f[1<<20],cnt[1<<20];
bool g[1<<20],w[20][20];
int gcd(int a,int b)
{
	if(!b) return a;
	return gcd(b,a%b);
}

int lowbit(int x)
{
	return x&-x;
}

int main()
{
	scanf("%d",&n);
	memset(f,30,sizeof(f));
	for(int i=1;i<=n;i++) 
	scanf("%d",&a[i]),cnt[1<>(j-1)&1) if(!w[cnt[lowbit(i)]][j])
		{flag=1;break;}
		if(!flag) g[i]=1;
	}
	f[0]=0;
//	for(int i=1;i<=10;i++)printf("%d ",g[i]);
	for(int i=1;i<1<