首页 > 其他分享 >AtCoder Beignner Contest 278

AtCoder Beignner Contest 278

时间:2022-11-20 20:01:25浏览次数:47  
标签:AtCoder const int 个数 cin Beignner 278 include col

D

给定一个长度为 \(n\) 的序列,有如下三种操作:

  1. 把所有的数全部修改为 \(x\)
  2. 把第 \(i\) 个数加 \(x\)
  3. 输出第 \(i\) 个数的值

不难发现,每次一操作会覆盖之前的所有操作,所以只需要最近的一次一操作之后当前数的变化情况即可。

可以用一个栈记录一下。

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,q,a[N],rec[N],add[N],tp=0,base=-1;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;++i)cin>>a[i];
	cin>>q;
	while(q--)
	{
		int opt,i,x;cin>>opt;
		if(opt==1)
		{
			cin>>x;
			base=x;
			for(int i=1;i<=tp;++i)
				add[rec[i]]=0;
			tp=0;
		}
		else if(opt==2)
		{
			cin>>i>>x;
			add[i]+=x;
			rec[++tp]=i;
		}
		else
		{
			cin>>i;
			if(base==-1)cout<<a[i]+add[i]<<endl;
			else cout<<base+add[i]<<endl;
		}
	}
	return 0;
}

E

区间问题,不难想到二维前缀和。

设 \(f[i][j][k]\) 表示 \((1,1)\) 到 \((i,j)\) 区间内 \(k\) 的个数。每次操作可以快速的求出 当前被覆盖的矩形中每一个数的个数,进而求出每一个数的个数。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=305;
int h,w,n,a,b;
int mp[N][N],f[N][N][N];
int cover(int x,int y,int xx,int yy,int col)
{
	return f[xx][yy][col]-f[xx][y-1][col]-f[x-1][yy][col]+f[x-1][y-1][col];
}
signed main()
{
	cin>>h>>w>>n>>a>>b;
	for(int i=1;i<=h;++i)
		for(int j=1;j<=w;++j)
			cin>>mp[i][j];
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=h;++j)
			for(int k=1;k<=w;++k)
			{
				f[j][k][i]=f[j-1][k][i]+f[j][k-1][i]-f[j-1][k-1][i]+(mp[j][k]==i);
			}
	}
	for(int i=1;i<=h-a+1;++i)
	{
		for(int j=1;j<=w-b+1;++j)
		{
			int cnt=0;
			for(int k=1;k<=n;++k)
			{
				int cur=f[h][w][k];
				cur-=cover(i,j,i+a-1,j+b-1,k);
				if(cur)cnt++;	
			}
			cout<<cnt<<" ";
		}
		cout<<endl;
	}
	return 0;
}

F

状压博弈 dp。

设 \(f[S][i]\) 表示已选的单词的状态压缩为 \(S\),当前词链以 \(i\) 结尾,是否能赢。

转移枚举当前词即可。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=17;
int n;
string s[N];
bool f[65537][29];
int main() 
{
    cin>>n;int mx=(1<<n)-1;
    for(int i=0;i<n;++i)cin>>s[i];
    for(int i=0;i<=mx;++i)
    {
        for(int j=0;j<n;++j)
            if(i&(1<<j)) 
                f[i][s[j][s[j].size()-1]-'a']|=(!f[i-(1<<j)][s[j][0]-'a']);
    }
    bool ans=0;
    for(int i=0;i<n;++i)
		ans|=f[mx][s[i][s[i].size()-1]-'a'];
    if(ans)puts("First");
    else puts("Second");
    return 0;
}

标签:AtCoder,const,int,个数,cin,Beignner,278,include,col
From: https://www.cnblogs.com/lnwhl/p/16909344.html

相关文章

  • 「NOIP赛前冲刺」ABC278F
    Solution简单状态压缩,考虑设\(f_{S,i}\)表示状态为\(S\)并且当前要求一个开头为\(s_i\)的结尾字符的单词,\(\text{First}\)如果能赢为\(0\),否则为\(1\)。那么很......
  • AtCoder Beginner Contest 278
    A-Shift原题链接题意给定一个有\(n\)个整数的数组\(a\),要求进行以下\(k\)次操作,输出操作后的数组。操作为:将第一个数去掉,在队尾加上一个\(0\)。分析依题意模......
  • AtCoder Beginner Contest 278
    A-Shift(abc278a)题目大意给定一个有\(n\)个整数的数组\(a\),要求进行以下\(k\)次操作,输出操作后的数组。操作为:将第一个数去掉,在队尾加上一个\(0\)。解题思路模......
  • AtCoder Regular Contest 150补题
    AtCoderRegularContest150A.Continuous1知识点:简单题复杂度:\(O(n)\)当一个区间合法,那么必定区间长度为k,并且区间内无0,并且1的个数等于所有的1的总和这个使用个......
  • AtCoder Beginner Contest 278
    咕咕咕。D-AllAssignPointAdd把数拆分成\(base+delta\)。\(base\)就是操作一设置的数,初始时认为\(base=0\);\(delta\)的维护可以有两种方法。一种是我比......
  • AtCoder Beginner Contest 278-D
    D-AllAssignPointAdd 题目链接:https://atcoder.jp/contests/abc278/tasks/abc278_d刚开始的思路是进行操作1的时候,将整个数组都赋成......
  • AtCoder Beginner Contest 278题解
    A-Shift题意给一个长度为\(n\)的数组,有\(k\)次操作,每次操作会将数组最前面的元素删掉,再在数组最后面加上一个0元素,问\(k\)次操作后的数组中的数字。思路看\(n\)与\(k......
  • AtCoder Beginner Contest 277 A~C
    本文同步发表于洛谷A.https://www.luogu.com.cn/blog/Alex-ZJY/solution-at-abc277-aB.https://www.luogu.com.cn/blog/Alex-ZJY/solution-at-abc277-bC.https://www......
  • E - Crystal Switches -- ATCODER
    E-CrystalSwitcheshttps://atcoder.jp/contests/abc277/tasks/abc277_e思路做双层图分离。使用虚线连接两个图,表示switch动作。使用双端队列,结合最短路算法,从1出发......
  • Atcoder补题计划
    11.17AtCoderRegularContest151知识点:A:简单题B:计数,并查集补题传送门......