10.6洛谷月赛划水记

Div1型选手。

Div1 得分:10+24+25+76 = 135

开题顺序 :\(A-F-C-D-E\)

好像混进来个奇怪的东西。

T1:noi

秒了,直接把输入的那几个数加起来就可以,注意有笔试的初始分 \(50\) 分。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a,b,c,d,e,f,g,h,i,ans;
int main()
{
	scanf("%d%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&h,&i);
	ans = 50+a+b+c+d+e+f+g;
	if(h == 1) ans += 5;
	if(ans < i) printf("AFO\n");
	else printf("AKIOI\n");
}

T6 rrusq

ynoi的毒瘤题,不会写正解。

不过有 \(76pts\) 的暴力分好评。

我们可以 \(O(n^2)\) 预处理出 每个矩形覆盖的每个点,然后对询问跑一遍莫队就可以。

\(subtack2\) 按上面的做法会 \(MLE\) ,主要是每个矩形覆盖的点可能会很多,导致 \(vector\) 开不下。

这种情况特判一下, 枚举每个点看能否被矩形覆盖就可以。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N = 1e5+10;
int n,m,cntq,l,r,tmp,block;
int L[110],R[110],pos[N],tong[10010],ans[1000010];
vector<int> v[N];
struct dian
{
	int x,y,w;
}a[N];
struct juxing
{
	int l1,l2,r1,r2;
}jx[N];
struct node
{
	int l,r,id;
}q[1000010];
inline int read()
{
	int s = 0,w = 1; char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0'; ch = getchar();}
	return s * w;
}
bool comp(node a,node b)
{
	if(pos[a.l] == pos[b.l])
	{
		return a.r < b.r;
	}
	return pos[a.l] < pos[b.l];
}
void add(int x)
{
	for(int j = 0; j < v[x].size(); j++)
	{
		int to = v[x][j];
		tong[to]++;
		if(tong[to] == 1) tmp += a[to].w;
	}
}
void del(int x)
{
	for(int j = 0; j < v[x].size(); j++)
	{
		int to = v[x][j];
		tong[to]--;
		if(tong[to] == 0) tmp -= a[to].w;
	}
}
int main()
{
	n = read();
	for(int i = 1; i <= n; i++)
	{
		a[i].x = i;
		a[i].y = read();
		a[i].w = read();
	}
	m = read(); block = sqrt(m);
	for(int i = 1; i <= m; i++)
	{
//		cout<<m<<" sdahfio"<<endl;
		jx[i].l1 = read();
		jx[i].l2 = read();
		jx[i].r1 = read();
		jx[i].r2 = read();
		pos[i] = (i-1)/block + 1;
		L[pos[i]] = 233333;
	}
	for(int i = 1; i <= m; i++)
	{
		L[pos[i]] = min(L[pos[i]],i);
		R[pos[i]] = max(R[pos[i]],i);
	}
	cntq = read();
	for(int i = 1; i <= cntq; i++)
	{
		q[i].l = read();
		q[i].r = read();
		q[i].id = i;
	}
	if(cntq == 1)
	{
		int res = 0;
		for(int j = 1; j <= n; j++)
		{
			for(int i = q[1].l; i <= q[1].r; i++)
			{
				if(a[j].x >= jx[i].l1 && a[j].x <= jx[i].l2 && a[j].y >= jx[i].r1 && a[j].y <= jx[i].r2)
				{
					res += a[j].w;
					break;
				}
			}
		}
		printf("%d\n",res);
		return 0;
	}
	for(int i = 1; i <= m; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			if(a[j].x >= jx[i].l1 && a[j].x <= jx[i].l2 && a[j].y >= jx[i].r1 && a[j].y <= jx[i].r2)
			{
				v[i].push_back(j);
			}
		}
	}
	sort(q+1,q+cntq+1,comp);
	l = 1, r = 0, tmp = 0;
	for(int i = 1; i <= cntq; i++)
	{
		while(l < q[i].l) del(l++);
		while(l > q[i].l) add(--l);
		while(r < q[i].r) add(++r);
		while(r > q[i].r) del(r--);
		ans[q[i].id] = tmp;
	}
	for(int i = 1; i <= cntq; i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}

这期间滚回去看 \(Div2B\) 发现是个神奇的贪心,但要分类讨论好多种情况,顿时就不想写了,还是滚回去做 \(Div1\) 吧。

T3 mex

这就构造题一点都不会呗。老老实实的打了个特判第二种情况就走人了。

拿了 \(10pts\) 的暴力滚粗。

T4 station

好像考场上很多大佬都会写 \(76pts\) 的做法。

但我这种构造小白来说,只会写 \(24pts\) 的做法。

我们直接\(O(n^2)\) 连边就可以获得 \(24\) 分的暴力分滚粗了。

T5 photo

只会写 \(O(n^2)\) 的做法。不过这 \(10^6\) 的数据范围一看就不好做。

总结:

虽然这次月赛自己骗了不少分,但只做出来一道题,大失败。

构造这种问题自己确实不太擅长,怎么办我也很无奈啊 QAQ.

菜死了,该退役了。

不过听别人说好像这次月赛的难度比之前的要大点。

posted @ 2020-10-09 06:28  genshy  阅读(135)  评论(2编辑  收藏  举报