zoukankan      html  css  js  c++  java
  • EZ 2018 05 04 NOIP2018 模拟赛(十二)

    这次的试卷应该是激励我们一下的,链接

    然后大家的分数就都很高,然后我就210被一群秒A T2的240大佬爆踩

    掉了5rating但Rank竟然发杀了 X_o_r dalao && YZC dalao

    论写暴力的重要性

    T1

    真心水,直接DFS爆搜即可

    O(2^n)不会超,n大了之后可以DP,签到题不解释

    CODE

    #include<cstdio>
    using namespace std;
    typedef long long LL;
    const int N=20;
    int n,a[N],b[N],c[N],d[N];
    LL ans=0;
    inline LL max(LL a,LL b)
    {
    	return a>b?a:b;
    }
    inline void DFS(int now,int tot1,int tot2)
    {
    	if (now>n) { ans=max(ans,(LL)tot1*tot2); return; }
    	DFS(now+1,tot1+a[now],max(tot2-b[now],0));
    	DFS(now+1,max(tot1-d[now],0),tot2+c[now]);
    }
    int main()
    {
    	//freopen("A.in","r",stdin); freopen("A.out","w",stdout);
    	register int i;
    	for (scanf("%d",&n),i=1;i<=n;++i)
    	scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
    	DFS(1,0,0);
    	printf("%lld",ans);
    	return 0;
    }
    

    T2

    我去这题考结论

    我记得LowestJN dalao在讲这套试卷的时候对于里面的T2讲了一个很重要的公式

    在一个无环图中,连通块数=点数-边数

    这是不是就是SB题了

    我们二维前缀和统计点数和边数,容斥一下即可

    点的算法比较简单,对于边的话要统计出行列的边数然后。。。

    自己看CODE参透吧

    CODE

    #include<cstdio>
    using namespace std;
    const int N=2005;
    bool a[N][N];
    int h[N][N],l[N][N],node[N][N],edge[N][N],n,m,q,x1,x2,y1,y2;
    inline char tc(void)
    {
    	static char fl[100000],*A=fl,*B=fl;
    	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
    }
    inline void read(int &x)
    {
    	x=0; char ch=tc();
    	while (ch<'0'||ch>'9') ch=tc();
    	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
    }
    inline void write(int x)
    {
    	if (x/10) write(x/10);
    	putchar(x%10+'0');
    }
    inline void init(void)
    {
    	register int i,j;
    	for (i=1;i<=n;++i)
    	for (j=1;j<=m;++j)
    	{
    		node[i][j]=node[i-1][j]+node[i][j-1]-node[i-1][j-1]+a[i][j];
    		edge[i][j]=edge[i-1][j]+edge[i][j-1]-edge[i-1][j-1]+(a[i][j]&&a[i-1][j])+(a[i][j]&&a[i][j-1]);
    		h[i][j]=h[i][j-1]+(a[i][j]&&a[i][j-1]); l[i][j]=l[i-1][j]+(a[i][j]&&a[i-1][j]);
    	}
    }
    int main()
    {
    	//freopen("B.in","r",stdin); freopen("B.out","w",stdout);
    	register int i,j;
    	read(n); read(m); read(q);
    	for (i=1;i<=n;++i)
    	for (j=1;j<=m;++j)
    	{
    		char ch=tc();
    		while (ch!='0'&&ch!='1') ch=tc();
    		a[i][j]=ch-'0';
    	}
    	init();
    	while (q--)
    	{
    		read(x1); read(y1); read(x2); read(y2);
    		int d=node[x2][y2]-node[x1-1][y2]-node[x2][y1-1]+node[x1-1][y1-1];
    		int b=edge[x2][y2]-edge[x1][y2]-edge[x2][y1]+edge[x1][y1]+h[x1][y2]-h[x1][y1]+l[x2][y1]-l[x1][y1];
    		write(d-b); putchar('
    ');
    	}
    	return 0;
    }
    

    T3

    有区分度的数学+数据结构神题,反正我乱猜了一个结论

    首先,如果线段不相交那么就没有鬼畜值

    很显然,因为y的坐标不断上升,因此运用一下数学姿势生活常理就知道只有当x坐标到前面去才能有线段相交

    因此如果只考虑两条线段相交的情况(没有三条及以上的线段交于同一点)

    然后问题就转化为:求x[1],x[2],...,x[n]的逆序对对数

    但是如果有三条及以上的线段交于同一点怎么办呢?

    大胆猜结论——没有这种情况

    然而就是这样,我考试的时候直接跳了这个结论和大样例拍过之后发现是对的

    然后就不管了直接40分离散化+树状数组

    其实标算也是利用等差数列的性质,搞一下即可

    因为我们发现,x数组是由不超过a段等差数列构成的

    若x[i]>a,设x[i]产生的逆序对为y,前面共有z段等差数列

    那么x[i]产生的逆序对数就是y-z

    原因在于:每段等差序列中必然有一个数字和 x[i-1]能组成逆序对,但不能和 x[i]组成逆序对.那么每段等差数列的贡献都会减 1.

    然后O(1)转移即可

    若x[i]<a,那么直接树状数组统计一下所有在它之前的x[i]<a的情况转移即可

    我还是怕讲不清楚,这里有详细sol

    对了%%%CJJ dalao分块傲视群雄

    精简CODE

    #include<cstdio>
    using namespace std;
    typedef long long LL;
    const int MAXA=1e5+10;
    int tree[MAXA],n,a,now,x,cnt,last,mod;
    LL ans;
    inline void inc(int &x,int y)
    {
    	if ((x+=y)>=mod) x-=mod,++cnt;
    }
    inline int lowbit(int x)
    {
    	return x&(-x);
    }
    inline void add(int x)
    {
    	while (x<=a) ++tree[x],x+=lowbit(x);
    }
    inline int get(int x)
    {
    	int tot=0;
    	while (x) tot+=tree[x],x-=lowbit(x);
    	return tot;
    }
    int main()
    {
    	//freopen("C.in","r",stdin); freopen("C.out","w",stdout);
    	scanf("%d%d%d%d",&n,&x,&a,&mod); now=x;
    	register int i;
    	for (i=1;i<=n;++i)
    	{
    		if (now>=a) { last-=cnt; if (now<x) ++last; } else last=i-get(now)-1,add(now+1);
    		ans+=last; inc(now,a);
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
  • 相关阅读:
    2-4 递增链表的插入 链表
    KMPnext数组自看
    Shortest Prefixes POJ
    Xor Sum HDU
    Immediate Decodability HDU
    Repository HDU
    "strcmp()" Anyone? UVA
    Remember the Word UVALive
    A Magic Lamp HDU
    Check Corners HDU
  • 原文地址:https://www.cnblogs.com/cjjsb/p/9004792.html
Copyright © 2011-2022 走看看