Noip2018滚粗记

Day-1

​ 在机房里刷了刷水题,心情不错~~~

Day0

​ 中午朱老大说要放松一下 ~~~ (耳机飞起来)

​ 下午跟邓大佬在机房里刷模板题, 惊奇的发现邓大佬太强了!Orz. 模板分分钟切,黑题也是秒杀。

Day 1

​ T1: 咦?这不是原题吗? 切掉切掉...... 于是我打下了如下代码

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
const int maxn = 101000;
int n,m;
int a[maxn];
template<class T>
inline void read(T &a)
{
	T s= 0, w = 1;
	char c = getchar();
	while(c < '0' || c > '9')
	{
		if(c == '-') w = -1;
		c = getchar();//量子化的语句
	}
	while(c >= '0' && c <= '9')
	{
		s = (s << 1) + (s << 3) + (c ^ 48);
		c = getchar();
	}
	a = s*w;
}
int dfs(int x,int y, int last)
{
	if(x > y) return 0;
	if(x == y) return a[x]-last;
	int minn = 0x3f3f3f3f, pos;
	for (int i = x; i <= y; i++)
	{
		if(a[i] - last < minn) 
		{
			minn = a[i] - last;
			pos = i;
		}
	}
	return dfs(x,pos-1, last + minn) + dfs(pos+1, y, last + minn) + minn; 
}
int main()
{
//	freopen("road.in","r",stdin);
//	freopen("road.out","w",stdout);
  	read(n);
	for (int i = 1; i <= n; i++)
	{
		read(a[i]);
	}
	printf("%d\n", dfs(1,n,0));
	return 0;
}

T2: 感觉不难, 想了想就可以发现一个显然易见的结论 {b} 一定是{a} 的子集。 好吧, 一个类似线性筛的方法就出来了。先从小到大枚举,看这个数有没有被删掉就好了(貌似会被卡常)

// luogu-judger-enable-o2
#include <bits/stdc++.h>
const int maxn = 202;
using namespace std;
template<class T>
inline void read(T &a)
{
	T s = 0, w = 1;
	char c = getchar();
	while(c < '0' || c > '9')
	{
		if(c == '-') w = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9')
	{
		s = (s << 1) + (s << 3) + (c ^ 48);
		c = getchar();
	}
	a = s*w;
}
template<class T> inline void chkmax(T &a, T b){a = a > b ? a : b;}
int n,T;
int a[maxn];
int Ans[2520000], tot;
char tong[2520000];
int base;
int main()
{
//	freopen("money.in","r",stdin);
//	freopen("money.out","w",stdout);
	read(T);
	while(T--)
	{
		base++;
		read(n);
	//	memset(tong,0,sizeof(tong));
		tot = 0;
		for (register int i = 1; i <= n; ++i)
		{
			read(a[i]);
		}
		sort(a + 1, a + 1 + n);
		int ans = 1;
		tong[a[1]] = base, tong[0] = base;
		for (register int i = 1; i <= a[n]/a[1]; ++i)
		{
			tong[a[1]*i] = base;
			Ans[++tot] = a[1]*i;
		}
		for (register int i = 2; i <= n; ++i)
		{
			if(tong[a[i]] != base) 
			{
				ans++;
				Ans[++tot] = a[i]; int pp = tot;
				for (register int j = 1; j <= pp; ++j)
				{
					for (register int k = 1; k <= a[n]/a[i]; ++k)
					{
						if(tong[Ans[j] +k*a[i]] == base) break;
					    if(tong[Ans[j] + k*a[i]] != base) Ans[++tot] = Ans[j] + k*a[i]; 
							tong[Ans[j] + k*a[i]] = base;
					}
				}
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

​ T3 : 一看题就发现这不是裸的二分吗? 想想check函数, 发现只要从叶子节点往上选最大就好了,看一看时间, 还有两个小时, 不慌不慌。 但我又想了想, 发现我这样暴力做是\(n^2\)的, 放弃这种做法。看了看数据范围, 发现有很多子任务!数据分治大法吼!!预计60分(然而只有35)

Day1预计得分:100 +100 + 60 = 260(然而只有100+80+35 = 215)


Day 1.5

​ 晚上吃了火锅,挺开心的。 回来到了CZJ大神的房间, 告诉我第一题炸了, 当场泪崩,心态爆炸。

Day 2

​ T1:咦? 这不是pymeng大佬讲过的原题吗? 想了想当时的那道题,发现好像并不一样。m = n - 1的思路很好想,那么m = n岂不是基环树上删边的套路吗?切掉切掉(感谢 屈哥,廖哥给我们这么多场NOIPlus的机会)。

​ T2:这是什么屎题?插头Dp? 状压Dp? 状压DP好像不行,也不是很好写。 再看了看数据范围,发现竟然有n = 1, 2, 3的点, 一看就是有规律. 但我也不会去打暴力, 只好根据样例去推,推出了n=2, n=3的规律。但我好像推错了, 悲哀。

下见我风骚的代码

#include <bits/stdc++.h>
#define ll long long
#define Mod 1000000007
#define Drh Mod
#define Zhy Mod
#define Lyh Mod
#define Ljy Mod
#define Czj Mod
using namespace std;
ll n,m;
template<class T>
inline void read(T &a)
{
    T s = 0, w = 1;
    char c = getchar();
    while(c < '0' || c > '9')
    {
        if(c == '-') w = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9')
    {
        s = (s << 1) + (s << 3) + (c ^ 48);
        c = getchar();
    }
    a = s*w;
}
ll ksm(ll x, ll y)
{
    ll res = 1;
    while(y)
    {
        if(y&1) res = 1ll * res*x % Drh;
        x = 1ll * x * x % Zhy;
        y = y >> 1;
    }
    return res % Lyh;
}
int main()
{
//	freopen("game.in","r", stdin);
//	freopen("game.out","w", stdout);
    read(n); read(m);
    if(n > m) swap(n,m);
    if(n == 1)
    {
        printf("%lld", ksm(2,m) % Ljy);
        return 0;
    }
    if(n == 2)
    {
        printf("%lld", (1ll * ksm(2,2*m)%Lyh - ksm(2,m)%Lyh + Drh)%Czj);return 0;
    }
    if(n == 3)
    {
        printf("%lld", (1ll * (m - 1)*56 % Lyh)); return 0;//14
    }
    if(n == 4)
    {
        printf("%lld", (1ll * (m - n + 1)%Zhy * 15%Lyh * (ksm(2,n)%Drh)%Czj));//15
        return 0;
    }
    if(n == 5)
    {
        printf("%lld", (1ll * (m - n + 1) * (223)%Zhy*ksm(2,n)%Drh)%Czj); return 0;//223
    }
    printf("%lld",(1ll * (m - n + 1)%Drh * (n*n%Zhy - 1 + Zhy)%Zhy * ksm(2,n)%Zhy)%Czj);
    return 0;
}

​ T3:哇!这不是模板题吗? ddp 轻松水过 TM提高组考动态 dp!!!*#\(@%^#%#&\)%&&@%#&@%#^拿了44 走人!


Day -364

​ 呢鹅鹅.......民间数据出来了。 预计得分100 + 100 + 60 + 100 + 15 + 44 = 416 (实际得分100 + 80 + 35 + 100 + 15 + 36 = 371) 1=应该是有了, 可400还是没上, 额鹅鹅鹅。

posted @ 2018-11-26 20:58  Ender_zzm  阅读(203)  评论(0编辑  收藏  举报