首页 > 其他分享 >AtCoder Beginner Contest 366 - VP记录

AtCoder Beginner Contest 366 - VP记录

时间:2024-10-29 17:24:01浏览次数:6  
标签:std AtCoder Beginner Contest int 距离 扫描线 using include

A - Election 2

高桥日常出镜,kkk 好好学学。

点击查看代码
#include<cstdio>
using namespace std;

int main()
{
	int n,t,a;
	scanf("%d%d%d",&n,&t,&a);
	if(t>n-t||a>n-a) printf("Yes\n");
	else printf("No\n");
	return 0;
}

B - Vertical Writing

某人被这道题卡了,默哀一秒钟。

内层循环要倒着遍历,小小地坑了我一下。

点击查看代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=105;
int n;
char str[N][N];

int main()
{
	scanf("%d",&n);
	int h=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%s",str[i]+1);
		h=max(h,(int)strlen(str[i]+1));
	}
	for(int i=1;i<=h;i++)
	{
		int cnt=0;
		for(int j=n;j>=1;j--)
		{
			if(str[j][i])
			{
				for(int k=1;k<=cnt;k++)
					putchar('*');
				cnt=0;
				putchar(str[j][i]);
			}
			else cnt++;
		}
		putchar('\n');
	}
	return 0;
}

C - Balls and Bag Query

原来 multisetsize() 返回的是元素个数(重复的算多个)。

模拟就好啦,加减的时候判断是不是少了或多了一种元素。

点击查看代码
#include<cstdio>
#include<set>
using namespace std;

const int X=1e6+5;
int q,cnt[X];

int main()
{
	scanf("%d",&q);
	int ans=0;
	for(int i=1;i<=q;i++)
	{
		int op; scanf("%d",&op);
		if(op==1)
		{
			int x; scanf("%d",&x);
			if(!(cnt[x]++)) ans++;
		}
		if(op==2)
		{
			int x; scanf("%d",&x);
			if(!(--cnt[x])) ans--;
		}
		if(op==3)
		{
			printf("%d\n",ans);
		}
	}
	return 0;
}

D - Cuboid Sum Query

好家伙,三维前缀和(题目名称说的很形象,就是长方体总和)。

没咋推,就跟着容斥原理的加减交替的形式,胡写一通就成了。

点击查看代码
#include<cstdio>
using namespace std;

const int N=105;
int n,a[N][N][N],sum[N][N][N],q;

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
			{
				scanf("%d",&a[i][j][k]);
				sum[i][j][k] = a[i][j][k]
					+sum[i-1][j][k]+sum[i][j-1][k]+sum[i][j][k-1]
					-sum[i][j-1][k-1]-sum[i-1][j][k-1]-sum[i-1][j-1][k]
					+sum[i-1][j-1][k-1];
			}
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		int x1,y1,z1,x2,y2,z2;
		scanf("%d%d%d%d%d%d",&x1,&x2,&y1,&y2,&z1,&z2);
		printf("%d\n",
			sum[x2][y2][z2]
			-sum[x1-1][y2][z2]-sum[x2][y1-1][z2]-sum[x2][y2][z1-1]
			+sum[x2][y1-1][z1-1]+sum[x1-1][y2][z1-1]+sum[x1-1][y1-1][z2]
			-sum[x1-1][y1-1][z1-1]
		);
	}
	return 0;
}

E - Manhattan Multifocal Ellipse

赛时基本都做这道题来了。

从左往右扫描所有点,每次扫描线向右移动一格,相当扫描线上每个点和左边所有点的距离都增加了 \(1\),和右边所有点的距离都缩短了 \(1\)(曼哈顿距离)。

然后我们只需要找到每次移动以后这根扫描线上总距离小于等于 \(d\) 的点就行了。

赛事乱画的草稿,可以辅助理解一下:

image

就是实现起来有点麻烦。

首先要把所有的坐标都转为正数,这个只需要全部加上一个常数就行了(我这里加的是 \(2\times10^6\),因为坐标系外也可能有合法的点)。

然后处理出对于某横坐标点数的前缀和,用于查找扫描线左右的点数。

接着我们需要知道对于初始位置(我这里是 \(0\))扫描线上每个位置距离所有点的曼哈顿距离和,这个有点小难度。

  • 初始位置扫描线上所有位置横坐标相等,所以直接枚举所有点,横坐标相加即可。

  • 纵坐标之差之和纵坐标有关,所以可以将所有点的纵坐标投影到初始位置扫描线上来。先找某位置与下面所有投影的距离和,具体来说:从下往上遍历所有位置,记录当前位置以下的投影数,在遍历的过程中每上移一格,总距离增加的就是这个点数。随后再找与上面所有投影的距离和,两者相加就可以得到纵坐标距离和。

  • 横坐标距离和加纵坐标距离和就是每个位置距离所有点的曼哈顿距离和。

最后,从左往右推扫描线。因为每次对线上距离的修改都是全局同加同减同查,所以只需要维护它变化的值。又因为全局加减不改变内部大小关系,所以可以事先排序。接着就可以二分查找扫描线上距离加变化之小于等于 \(d\) 的点的数量了,直接用 upper_bound 来查找也行。

#include<cstdio>
#include<algorithm>
using namespace std;

const int N=2e5+5,D=2e6;
#define D ((D<<1)+5)
int n,x[N],y[N];
int d,a[D];
int sumcnt[D];
long long ldis[D],rdis[D],dis[D];
int ycnt[D];
#undef D

inline int getsum(int l,int r)
{
	if(!l) return sumcnt[r];
	return sumcnt[r]-sumcnt[l-1];
}
int main()
{
	scanf("%d%d",&n,&d);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		x[i]+=D,y[i]+=D;
		a[x[i]]=y[i];
		sumcnt[x[i]]++;
	}
	for(int i=0;i<=D<<1;i++)
		sumcnt[i]+=sumcnt[i-1];
	
	long long xdis=0;
	for(int i=1;i<=n;i++)
	{
		xdis+=x[i];
		ycnt[y[i]]++;
	}
	long long lytot=0;
	for(int i=0;i<=D<<1;i++)
	{
		ldis[i]=(i?ldis[i-1]:0)+lytot;
		lytot+=ycnt[i];
	}
	long long rytot=0;
	for(int i=D<<1;i>=0;i--)
	{
		rdis[i]=rdis[i+1]+rytot;
		rytot+=ycnt[i];
	}
	for(int i=0;i<=D<<1;i++)
	{
		dis[i]=ldis[i]+rdis[i]+xdis;
	}
	sort(dis,dis+(D<<1)+1);
	
	long long ans=0,delta=0;
	for(int i=0;i<=D<<1;i++)
	{
		ans+=upper_bound(dis,dis+(D<<1)+1,d-delta)-dis;
		delta+=getsum(0,i);
		delta-=getsum(i+1,D<<1);
	}
	printf("%lld\n",ans);
	return 0;
}

标签:std,AtCoder,Beginner,Contest,int,距离,扫描线,using,include
From: https://www.cnblogs.com/jerrycyx/p/18513862

相关文章

  • AtCoder Beginner Contest 377
    上周六咕咕咕了省流版A.排序判断即可B.枚举判断即可C.记录覆盖位置去重,总数-覆盖数即可D.枚举右端点,考虑符合条件的左端点数量即可E.考虑排列的\(i\top_i\)图,考虑操作数与走的边数关系,利用环循环节算偏移量即可F.考虑每个皇后实际覆盖的位置,枚举先前皇后计算覆......
  • 【Atcoder训练记录】AtCoder Beginner Contest 377
    训练情况赛后反思D题差一点点吧?可能不去乐跑就能写出来了A题我们发现ABC是字典序单调递增的,字符串先排序再判断是否为ABC即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ strings;cin>>s; sort(s.begin(),s.end()); i......
  • AtCoder Regular Contest 185 题解
    A-modMGame2第一个观察是如果一个人手中还有2张牌,那么他一定不会被秒。这可以推出决定胜负的时刻一定是Alice和Bob手中只剩一张牌的时候,此时如果Alice被秒了,那么她就似了,否则她就赢了。考虑Alice什么时候能被秒。记决定胜负的时刻Alice手中的牌是\(a\),Bob手......
  • BeginnersBook-Java-示例-一-
    BeginnersBookJava示例(一)原文:BeginnersBook协议:CCBY-NC-SA4.0Java程序:计算复合利率原文:https://beginnersbook.com/2019/07/java-program-to-calculate-compound-interest/在本教程中,我们将编写一个java程序来计算复合利率。复利计算公式使用以下公式计算复利:......
  • BeginnersBook-Java-集合教程-一-
    BeginnersBookJava集合教程(一)原文:BeginnersBook协议:CCBY-NC-SA4.0如何在Java中对ArrayList进行排序原文:https://beginnersbook.com/2013/12/how-to-sort-arraylist-in-java/在本教程中,我们分享了对ArrayList<String>和ArrayList<Integer>进行排序的示例。另请阅......
  • BeginnersBook-Java-IO-教程-一-
    BeginnersBookJavaIO教程(一)原文:BeginnersBook协议:CCBY-NC-SA4.0如何在Java中创建文件原文:https://beginnersbook.com/2014/01/how-to-create-a-file-in-java/在本教程中,我们将了解如何使用createNewFile()方法在Java中创建文件。如果文件在指定位置不存在并且......
  • BeginnersBook-C-语言示例-一-
    BeginnersBookC语言示例(一)原文:BeginnersBook协议:CCBY-NC-SA4.0C程序:检查阿姆斯特朗数原文:https://beginnersbook.com/2014/06/c-program-to-check-armstrong-number/如果数字的各位的立方和等于数字本身,则将数字称为阿姆斯特朗数。在下面的C程序中,我们检查输入的......
  • BeginnersBook-C---教程-一-
    BeginnersBookC++教程(一)原文:BeginnersBook协议:CCBY-NC-SA4.0C++中的for循环原文:https://beginnersbook.com/2017/08/cpp-for-loop/循环用于重复执行语句块,直到满足特定条件。例如,当您显示从1到100的数字时,您可能希望将变量的值设置为1并将其显示100次,在每......
  • BeginnersBook-Servlet-教程-一-
    BeginnersBookServlet教程(一)原文:BeginnersBook协议:CCBY-NC-SA4.0项目的web.xml文件中的welcome-file-list标签原文:https://beginnersbook.com/2014/04/welcome-file-list-in-web-xml/你有没见过web.xml文件中的<welcome-file-list>标签并想知道它是什么?在本文中,我将......
  • BeginnersBook-Perl-教程-一-
    BeginnersBookPerl教程(一)原文:BeginnersBook协议:CCBY-NC-SA4.0Perl-列表和数组原文:https://beginnersbook.com/2017/05/perl-lists-and-arrays/在Perl中,人们可以交替使用术语列表和数组,但是存在差异。列表是数据(标量值的有序集合),数组是保存列表的变量。如何定......